diff options
Diffstat (limited to 'src/freedreno/ir3')
-rw-r--r-- | src/freedreno/ir3/ir3_context.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/src/freedreno/ir3/ir3_context.c b/src/freedreno/ir3/ir3_context.c index 334b0ae0bab..33e73bcb216 100644 --- a/src/freedreno/ir3/ir3_context.c +++ b/src/freedreno/ir3/ir3_context.c @@ -79,21 +79,30 @@ ir3_context_init(struct ir3_compiler *compiler, * in ir3_optimize_nir(): */ NIR_PASS_V(ctx->s, nir_lower_bool_to_int32); - NIR_PASS_V(ctx->s, nir_lower_locals_to_regs); + bool progress = false; + NIR_PASS(progress, ctx->s, nir_lower_locals_to_regs); + + /* we could need cleanup after lower_locals_to_regs */ + while (progress) { + progress = false; + NIR_PASS(progress, ctx->s, nir_opt_algebraic); + NIR_PASS(progress, ctx->s, nir_opt_constant_folding); + } /* We want to lower nir_op_imul as late as possible, to catch also * those generated by earlier passes (e.g, nir_lower_locals_to_regs). * However, we want a final swing of a few passes to have a chance * at optimizing the result. */ - bool progress = false; + progress = false; NIR_PASS(progress, ctx->s, ir3_nir_lower_imul); - if (progress) { - NIR_PASS_V(ctx->s, nir_opt_algebraic); - NIR_PASS_V(ctx->s, nir_opt_copy_prop_vars); - NIR_PASS_V(ctx->s, nir_opt_dead_write_vars); - NIR_PASS_V(ctx->s, nir_opt_dce); - NIR_PASS_V(ctx->s, nir_opt_constant_folding); + while (progress) { + progress = false; + NIR_PASS(progress, ctx->s, nir_opt_algebraic); + NIR_PASS(progress, ctx->s, nir_opt_copy_prop_vars); + NIR_PASS(progress, ctx->s, nir_opt_dead_write_vars); + NIR_PASS(progress, ctx->s, nir_opt_dce); + NIR_PASS(progress, ctx->s, nir_opt_constant_folding); } /* Enable the texture pre-fetch feature only a4xx onwards. But |