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: 7d24a9b649 - nir: handle ibfe/ubfe in nir_def_bits_used

Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41908>
This commit is contained in:
Marek Olšák 2026-05-30 20:28:04 -04:00 committed by Marge Bot
parent 1559e14770
commit ba8525aecc

View file

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