From ba8525aecca790f89b120d612a49df9554d4bf35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sat, 30 May 2026 20:28:04 -0400 Subject: [PATCH] nir: fix ibfe handling in ssa_def_bits_used The outer condition is fixed to check correctly whether any sign-extended bit is used. The inner condition was supposed to check whether src2 is constant. Fixes: 7d24a9b649be9125 - nir: handle ibfe/ubfe in nir_def_bits_used Reviewed-by: Rhys Perry Part-of: --- src/compiler/nir/nir_range_analysis.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/compiler/nir/nir_range_analysis.c b/src/compiler/nir/nir_range_analysis.c index 9abd8bb0120..cda5d218bec 100644 --- a/src/compiler/nir/nir_range_analysis.c +++ b/src/compiler/nir/nir_range_analysis.c @@ -2310,7 +2310,8 @@ ssa_def_bits_used(const nir_def *def, int recur) uint64_t def_bits_used = ssa_def_bits_used(&use_alu->def, recur); unsigned bit_size = use_alu->def.bit_size; unsigned offset = nir_alu_src_as_uint(use_alu->src[1]) & (bit_size - 1); - unsigned bits = nir_src_is_const(use_alu->src[2].src) ? + bool src2_is_const = nir_src_is_const(use_alu->src[2].src); + unsigned bits = src2_is_const ? nir_alu_src_as_uint(use_alu->src[2]) & (bit_size - 1) : /* Worst case if bits is not constant. */ (bit_size - offset); @@ -2321,8 +2322,8 @@ ssa_def_bits_used(const nir_def *def, int recur) * If bits is not constant, all bits can be the last one. */ if (use_alu->op == nir_op_ibfe && - (def_bits_used >> offset) & ~field_bitmask) { - if (nir_alu_src_as_uint(use_alu->src[2])) + (def_bits_used & ~(src2_is_const ? field_bitmask : 1u))) { + if (src2_is_const) def_bits_used |= BITFIELD64_BIT(bits - 1); else def_bits_used |= field_bitmask;