pan/bi: Reduce liveness calculations in DCE
authorAlyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Thu, 18 Feb 2021 21:11:38 +0000 (16:11 -0500)
committerMarge Bot <eric+marge@anholt.net>
Mon, 22 Feb 2021 19:17:50 +0000 (19:17 +0000)
Forward port of fc06b8b7 ("pan/mdg: Optimize liveness computation in
DCE")

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

src/panfrost/bifrost/bi_opt_dce.c
src/panfrost/bifrost/bi_schedule.c
src/panfrost/bifrost/bifrost_compile.c
src/panfrost/bifrost/compiler.h

index 4cb8673..4605d20 100644 (file)
@@ -34,7 +34,7 @@
  */
 
 bool
-bi_opt_dead_code_eliminate(bi_context *ctx, bi_block *block, bool soft)
+bi_opt_dead_code_eliminate(bi_context *ctx, bool soft)
 {
         bool progress = false;
         unsigned temp_count = bi_max_temp(ctx);
@@ -42,24 +42,27 @@ bi_opt_dead_code_eliminate(bi_context *ctx, bi_block *block, bool soft)
         bi_invalidate_liveness(ctx);
         bi_compute_liveness(ctx);
 
-        uint16_t *live = mem_dup(block->base.live_out, temp_count * sizeof(uint16_t));
+        bi_foreach_block(ctx, _block) {
+                bi_block *block = (bi_block *) _block;
+                uint16_t *live = mem_dup(block->base.live_out, temp_count * sizeof(uint16_t));
 
-        bi_foreach_instr_in_block_safe_rev(block, ins) {
-                unsigned index = bi_get_node(ins->dest[0]);
+                bi_foreach_instr_in_block_safe_rev(block, ins) {
+                        unsigned index = bi_get_node(ins->dest[0]);
 
-                if (index < temp_count && !(live[index] & bi_writemask(ins))) {
-                        if (soft || bi_side_effects(ins->op))
-                                ins->dest[0] = bi_null();
-                        else
-                                bi_remove_instruction(ins);
+                        if (index < temp_count && !(live[index] & bi_writemask(ins))) {
+                                if (soft || bi_side_effects(ins->op))
+                                        ins->dest[0] = bi_null();
+                                else
+                                        bi_remove_instruction(ins);
 
-                        progress |= true;
+                                progress |= true;
+                        }
+
+                        bi_liveness_ins_update(live, ins, temp_count);
                 }
 
-                bi_liveness_ins_update(live, ins, temp_count);
+                free(live);
         }
 
-        free(live);
-
         return progress;
 }
index 0dc0fb3..3bb7b87 100644 (file)
@@ -1595,8 +1595,9 @@ bi_schedule(bi_context *ctx)
                 bi_block *bblock = (bi_block *) block;
                 bi_lower_fau(ctx, bblock);
                 bi_schedule_block(ctx, bblock);
-                bi_opt_dead_code_eliminate(ctx, bblock, true);
         }
+
+        bi_opt_dead_code_eliminate(ctx, true);
 }
 
 #ifndef NDEBUG
index a6c33ab..c7fde1c 100644 (file)
@@ -2997,11 +2997,7 @@ bifrost_compile_shader_nir(nir_shader *nir,
                 progress = false;
 
                 progress |= bi_opt_copy_prop(ctx);
-
-                bi_foreach_block(ctx, _block) {
-                        bi_block *block = (bi_block *) _block;
-                        progress |= bi_opt_dead_code_eliminate(ctx, block, false);
-                }
+                progress |= bi_opt_dead_code_eliminate(ctx, false);
         } while(progress);
 
         bi_foreach_block(ctx, _block) {
index 809500c..e569aec 100644 (file)
@@ -745,7 +745,7 @@ void bi_print_shader(bi_context *ctx, FILE *fp);
 /* BIR passes */
 
 bool bi_opt_copy_prop(bi_context *ctx);
-bool bi_opt_dead_code_eliminate(bi_context *ctx, bi_block *block, bool soft);
+bool bi_opt_dead_code_eliminate(bi_context *ctx, bool soft);
 void bi_opt_push_ubo(bi_context *ctx);
 void bi_schedule(bi_context *ctx);
 void bi_assign_scoreboard(bi_context *ctx);