From 5b385b703b3b7ec3a0a081c4cdb9b39940547d3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Thu, 14 May 2026 19:56:04 +0200 Subject: [PATCH] nir/divergence: Consider ACCESS_SMEM_AMD divergence across subgroups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AMD SMEM instructions are always uniform within a subgroup, but they may be divergent across subgroups, ie. each subgroup may have a different value from the same SMEM instruction. This needs to be considered for divergence across subgroups as well as for vertex divergence, because vertices of the same primitive may be split between different waves. Signed-off-by: Timur Kristóf Reviewed-by: Daniel Schürmann Reviewed-by: Georg Lehmann Part-of: --- src/compiler/nir/nir_divergence_analysis.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index 8d6dad5f87a..d69a3ce3b19 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -1075,8 +1075,13 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) (nir_intrinsic_access(instr) & ACCESS_SKIP_HELPERS)) is_divergent = true; + /* SMEM access is always subgroup uniform. + * Note, it's only uniform across vertices/subgroups when + * all its sources are uniform (already taken into account above). + */ if (nir_intrinsic_has_access(instr) && - (nir_intrinsic_access(instr) & ACCESS_SMEM_AMD)) + (nir_intrinsic_access(instr) & ACCESS_SMEM_AMD) && + !(state->options & (nir_divergence_vertex | nir_divergence_across_subgroups))) is_divergent = false; instr->def.divergent = is_divergent;