diff --git a/src/panfrost/bifrost/bi_opt_dce.c b/src/panfrost/bifrost/bi_opt_dce.c index 4cb867385e2..4605d203060 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 0dc0fb38276..3bb7b87dcb6 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 a6c33ab4642..c7fde1ce20f 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 809500c8e18..e569aec2255 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);