From 4598bbaea79fa2e3860149604779dd7f342a85a7 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Tue, 14 Apr 2026 09:44:46 +0200 Subject: [PATCH] radv: immediately remove phis after loop unrolling Loop unrolling can create phis when constants are defined in the loop but used outside of it. Ideally this should not happen, but for now we have to remove these as soon as possible before they trip up other passes. Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_shader.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 3c33f794347..f1f544704a2 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -222,7 +222,15 @@ radv_optimize_nir(struct nir_shader *shader, bool optimize_conservatively) NIR_LOOP_PASS(progress, skip, shader, nir_opt_undef); if (shader->options->max_unroll_iterations) { - NIR_LOOP_PASS_NOT_IDEMPOTENT(progress, skip, shader, nir_opt_loop_unroll); + bool unroll_progess = false; + NIR_LOOP_PASS_NOT_IDEMPOTENT(unroll_progess, skip, shader, nir_opt_loop_unroll); + /* Loop unrolling can add trivial phis for constants defined in the loop, + * which can break all kinds of validation if they aren't removed immediately. + */ + if (unroll_progess) { + progress = true; + NIR_LOOP_PASS(progress, skip, shader, nir_opt_remove_phis); + } } } while (progress && !optimize_conservatively); _mesa_set_destroy(skip, NULL);