diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 9fbe86d0b93..7ebd867d2d0 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -3423,6 +3423,8 @@ typedef struct { bool structured; nir_metadata valid_metadata; + nir_variable_mode loop_analysis_indirect_mask; + bool loop_analysis_force_unroll_sampler_indirect; } nir_function_impl; #define nir_foreach_function_temp_variable(var, impl) \ diff --git a/src/compiler/nir/nir_loop_analyze.c b/src/compiler/nir/nir_loop_analyze.c index c07d3f98368..297e28c77f9 100644 --- a/src/compiler/nir/nir_loop_analyze.c +++ b/src/compiler/nir/nir_loop_analyze.c @@ -1620,4 +1620,7 @@ nir_loop_analyze_impl(nir_function_impl *impl, nir_index_ssa_defs(impl); foreach_list_typed(nir_cf_node, node, node, &impl->body) process_loops(node, indirect_mask, force_unroll_sampler_indirect); + + impl->loop_analysis_indirect_mask = indirect_mask; + impl->loop_analysis_force_unroll_sampler_indirect = force_unroll_sampler_indirect; } diff --git a/src/compiler/nir/nir_metadata.c b/src/compiler/nir/nir_metadata.c index e0085991bbc..55283f946d2 100644 --- a/src/compiler/nir/nir_metadata.c +++ b/src/compiler/nir/nir_metadata.c @@ -40,17 +40,22 @@ nir_metadata_require(nir_function_impl *impl, nir_metadata required, ...) nir_calc_dominance_impl(impl); if (NEEDS_UPDATE(nir_metadata_live_defs)) nir_live_defs_impl(impl); - if (NEEDS_UPDATE(nir_metadata_loop_analysis)) { + if (required & nir_metadata_loop_analysis) { va_list ap; va_start(ap, required); /* !! Warning !! Do not move these va_arg() call directly to * nir_loop_analyze_impl() as parameters because the execution order will * become undefined. */ - nir_variable_mode mode = va_arg(ap, nir_variable_mode); + nir_variable_mode indirect_mask = va_arg(ap, nir_variable_mode); int force_unroll_sampler_indirect = va_arg(ap, int); - nir_loop_analyze_impl(impl, mode, force_unroll_sampler_indirect); va_end(ap); + + if (NEEDS_UPDATE(nir_metadata_loop_analysis) || + indirect_mask != impl->loop_analysis_indirect_mask || + force_unroll_sampler_indirect != impl->loop_analysis_force_unroll_sampler_indirect) { + nir_loop_analyze_impl(impl, indirect_mask, force_unroll_sampler_indirect); + } } #undef NEEDS_UPDATE