From dd5b6f3940687559a05a0ec3082a0a07a853e7fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timur=20Krist=C3=B3f?= Date: Thu, 14 May 2026 20:12:39 +0200 Subject: [PATCH] nir/divergence: Consider uniformity of read_invocation accross subgroups MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These intrinsics are generally divergent between different subgroups, but they can be uniform when all their sources are also uniform. Signed-off-by: Timur Kristóf Reviewed-by: Lionel Landwerlin Reviewed-by: Daniel Schürmann Reviewed-by: Georg Lehmann Part-of: --- src/compiler/nir/nir_divergence_analysis.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index d69a3ce3b19..a7e485d869c 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -184,9 +184,6 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) case nir_intrinsic_shader_clock: case nir_intrinsic_ballot: case nir_intrinsic_ballot_relaxed: - case nir_intrinsic_as_uniform: - case nir_intrinsic_read_invocation: - case nir_intrinsic_read_first_invocation: case nir_intrinsic_read_invocation_cond_ir3: case nir_intrinsic_read_getlast_ir3: case nir_intrinsic_vote_any: @@ -210,6 +207,22 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) (state->options & nir_divergence_across_subgroups); break; + case nir_intrinsic_as_uniform: + case nir_intrinsic_read_invocation: + case nir_intrinsic_read_first_invocation: + is_divergent = false; + + if ((state->options & nir_divergence_vertex) || + (state->options & nir_divergence_across_subgroups)) { + /* These intrinsics are generally divergent between different + * subgroups, but they can be uniform when all their sources + * are also uniform. + */ + for (unsigned i = 0; i < nir_intrinsic_infos[instr->intrinsic].num_srcs; ++i) + is_divergent |= src_divergent(instr->src[i], state); + } + break; + /* Intrinsics which are always uniform */ case nir_intrinsic_load_preamble: case nir_intrinsic_load_push_constant: