From c160ed212edf528f21cd3679a73f4acbc4efb345 Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Mon, 8 Jul 2024 09:00:17 -0700 Subject: [PATCH] nir/divergence: resource_intel is less divergent than you thought When the non_uniform flag is not set, the result is never divergent. v2: Remove redundant assignment to is_divergent. Suggested by Caio. Reviewed-by: Kenneth Graunke Reviewed-by: Caio Oliveira Part-of: --- src/compiler/nir/nir_divergence_analysis.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/compiler/nir/nir_divergence_analysis.c b/src/compiler/nir/nir_divergence_analysis.c index a486db7f4ff..5e28730e932 100644 --- a/src/compiler/nir/nir_divergence_analysis.c +++ b/src/compiler/nir/nir_divergence_analysis.c @@ -590,7 +590,6 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) case nir_intrinsic_load_ssbo_address: case nir_intrinsic_load_global_constant_bounded: case nir_intrinsic_load_global_constant_offset: - case nir_intrinsic_resource_intel: case nir_intrinsic_load_reg: case nir_intrinsic_load_constant_agx: case nir_intrinsic_load_reg_indirect: @@ -608,6 +607,23 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state) break; } + case nir_intrinsic_resource_intel: + /* Not having the non_uniform flag with divergent sources is undefined + * behavior. The Intel driver defines it pick the lowest numbered live + * SIMD lane (via emit_uniformize). + */ + if ((nir_intrinsic_resource_access_intel(instr) & + nir_resource_intel_non_uniform) != 0) { + unsigned num_srcs = nir_intrinsic_infos[instr->intrinsic].num_srcs; + for (unsigned i = 0; i < num_srcs; i++) { + if (instr->src[i].ssa->divergent) { + is_divergent = true; + break; + } + } + } + break; + case nir_intrinsic_shuffle: is_divergent = instr->src[0].ssa->divergent && instr->src[1].ssa->divergent;