nir/divergence: Consider ACCESS_SMEM_AMD divergence across subgroups

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 <timur.kristof@gmail.com>
Reviewed-by: Daniel Schürmann <daniel@schuermann.dev>
Reviewed-by: Georg Lehmann <dadschoorse@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41584>
This commit is contained in:
Timur Kristóf 2026-05-14 19:56:04 +02:00 committed by Marge Bot
parent f43bc8e8be
commit 5b385b703b

View file

@ -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;