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 <kenneth@whitecape.org>
Reviewed-by: Caio Oliveira <caio.oliveira@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/30251>
This commit is contained in:
Ian Romanick 2024-07-08 09:00:17 -07:00 committed by Marge Bot
parent eda55c7c2f
commit c160ed212e

View file

@ -590,7 +590,6 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state)
case nir_intrinsic_load_ssbo_address: case nir_intrinsic_load_ssbo_address:
case nir_intrinsic_load_global_constant_bounded: case nir_intrinsic_load_global_constant_bounded:
case nir_intrinsic_load_global_constant_offset: case nir_intrinsic_load_global_constant_offset:
case nir_intrinsic_resource_intel:
case nir_intrinsic_load_reg: case nir_intrinsic_load_reg:
case nir_intrinsic_load_constant_agx: case nir_intrinsic_load_constant_agx:
case nir_intrinsic_load_reg_indirect: case nir_intrinsic_load_reg_indirect:
@ -608,6 +607,23 @@ visit_intrinsic(nir_intrinsic_instr *instr, struct divergence_state *state)
break; 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: case nir_intrinsic_shuffle:
is_divergent = instr->src[0].ssa->divergent && is_divergent = instr->src[0].ssa->divergent &&
instr->src[1].ssa->divergent; instr->src[1].ssa->divergent;