From 9882a59a2f2cc36d900d332337a307ba627020c4 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Thu, 18 Feb 2021 16:11:38 -0500 Subject: [PATCH] pan/bi: Reduce liveness calculations in DCE Forward port of fc06b8b7 ("pan/mdg: Optimize liveness computation in DCE") Signed-off-by: Alyssa Rosenzweig Part-of: --- src/panfrost/bifrost/bi_opt_dce.c | 29 ++++++++++++++++------------- src/panfrost/bifrost/bi_schedule.c | 3 ++- src/panfrost/bifrost/bifrost_compile.c | 6 +----- src/panfrost/bifrost/compiler.h | 2 +- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/panfrost/bifrost/bi_opt_dce.c b/src/panfrost/bifrost/bi_opt_dce.c index 4cb8673..4605d20 100644 --- a/src/panfrost/bifrost/bi_opt_dce.c +++ b/src/panfrost/bifrost/bi_opt_dce.c @@ -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; } diff --git a/src/panfrost/bifrost/bi_schedule.c b/src/panfrost/bifrost/bi_schedule.c index 0dc0fb3..3bb7b87 100644 --- a/src/panfrost/bifrost/bi_schedule.c +++ b/src/panfrost/bifrost/bi_schedule.c @@ -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 diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index a6c33ab..c7fde1c 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -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) { diff --git a/src/panfrost/bifrost/compiler.h b/src/panfrost/bifrost/compiler.h index 809500c..e569aec 100644 --- a/src/panfrost/bifrost/compiler.h +++ b/src/panfrost/bifrost/compiler.h @@ -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); -- 2.7.4