ir3/sched: Support multiple destinations
authorConnor Abbott <cwabbott0@gmail.com>
Wed, 1 Dec 2021 15:33:57 +0000 (16:33 +0100)
committerMarge Bot <emma+marge@anholt.net>
Thu, 10 Mar 2022 17:15:29 +0000 (17:15 +0000)
Note: this is a behavior change for arrays, because it will count the
entire array instead of just the components written in the register
pressure calculation. However this is more accurate since this matches
how RA works.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14107>

src/freedreno/ir3/ir3_sched.c

index d15bf0d..ccfc9c3 100644 (file)
@@ -544,6 +544,20 @@ is_only_nonscheduled_use(struct ir3_instruction *instr,
    return true;
 }
 
+static unsigned
+new_regs(struct ir3_instruction *instr)
+{
+   unsigned regs = 0;
+
+   foreach_dst (dst, instr) {
+      if (!is_dest_gpr(dst))
+         continue;
+      regs += reg_elems(dst);
+   }
+
+   return regs;
+}
+
 /* find net change to live values if instruction were scheduled: */
 static int
 live_effect(struct ir3_instruction *instr)
@@ -552,7 +566,7 @@ live_effect(struct ir3_instruction *instr)
    int new_live =
       (n->partially_live || !instr->uses || instr->uses->entries == 0)
          ? 0
-         : dest_regs(instr);
+         : new_regs(instr);
    int freed_live = 0;
 
    /* if we schedule something that causes a vecN to be live,
@@ -569,7 +583,7 @@ live_effect(struct ir3_instruction *instr)
          continue;
 
       if (is_only_nonscheduled_use(src, instr))
-         freed_live += dest_regs(src);
+         freed_live += new_regs(src);
    }
 
    return new_live - freed_live;
@@ -1072,12 +1086,6 @@ is_output_collect(struct ir3_instruction *instr)
 static bool
 is_output_only(struct ir3_instruction *instr)
 {
-   if (!writes_gpr(instr))
-      return false;
-
-   if (!(instr->dsts[0]->flags & IR3_REG_SSA))
-      return false;
-
    foreach_ssa_use (use, instr)
       if (!is_output_collect(use))
          return false;