pan/bi: Only rewrite COMBINE dest if not SSA
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Wed, 27 May 2020 22:29:01 +0000 (18:29 -0400)
committerMarge Bot <eric+marge@anholt.net>
Fri, 29 May 2020 20:34:55 +0000 (20:34 +0000)
If it's already a register, there's no point in rewriting and it will
disturb the existing register, i.e. for

   if (..) {
      r0 = vecN ..
   } else {
      r0 = vecN ..
   }

Signed-off-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5260>

src/panfrost/bifrost/bi_lower_combine.c

index ae9ceb9..c2d9c51 100644 (file)
@@ -197,7 +197,8 @@ bi_lower_combine(bi_context *ctx, bi_block *block)
         bi_foreach_instr_in_block_safe(block, ins) {
                 if (ins->type != BI_COMBINE) continue;
 
-                unsigned R = bi_make_temp_reg(ctx);
+                bool needs_rewrite = !(ins->dest & PAN_IS_REG);
+                unsigned R = needs_rewrite ? bi_make_temp_reg(ctx) : ins->dest;
                 unsigned sz = nir_alu_type_get_type_size(ins->dest_type);
 
                 bi_foreach_src(ins, s) {
@@ -226,8 +227,9 @@ bi_lower_combine(bi_context *ctx, bi_block *block)
                         }
                 }
 
+                if (needs_rewrite)
+                        bi_rewrite_uses(ctx, ins->dest, 0, R, 0);
 
-                bi_rewrite_uses(ctx, ins->dest, 0, R, 0);
                 bi_remove_instruction(ins);
         }
 }