nir: handle extract opcodes recursively in nir_def_bits_used

Reviewed-by: Georg Lehmann <dadschoorse@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34489>
This commit is contained in:
Marek Olšák 2025-04-13 20:25:01 -04:00 committed by Marge Bot
parent e38a0b9a05
commit a78ed8b8e8
2 changed files with 20 additions and 12 deletions

View file

@ -2167,21 +2167,25 @@ ssa_def_bits_used(const nir_def *def, int recur)
case nir_op_extract_u8:
case nir_op_extract_i8:
if (src_idx == 0 && nir_src_is_const(use_alu->src[1].src)) {
unsigned chunk = nir_src_comp_as_uint(use_alu->src[1].src,
use_alu->src[1].swizzle[0]);
bits_used |= 0xffull << (chunk * 8);
break;
} else {
return all_bits;
}
case nir_op_extract_u16:
case nir_op_extract_i16:
if (src_idx == 0 && nir_src_is_const(use_alu->src[1].src)) {
unsigned chunk = nir_src_comp_as_uint(use_alu->src[1].src,
use_alu->src[1].swizzle[0]);
bits_used |= 0xffffull << (chunk * 16);
unsigned chunk = nir_alu_src_as_uint(use_alu->src[1]);
uint64_t defs_bits_used = ssa_def_bits_used(&use_alu->def, recur);
unsigned field_bits = use_alu->op == nir_op_extract_u8 ||
use_alu->op == nir_op_extract_i8 ? 8 : 16;
uint64_t field_bitmask = BITFIELD64_MASK(field_bits);
/* If one of the sign-extended bits is used, set the last src bit
* as used.
*/
if ((use_alu->op == nir_op_extract_i8 ||
use_alu->op == nir_op_extract_i16) &&
defs_bits_used & ~field_bitmask)
defs_bits_used |= BITFIELD64_BIT(field_bits - 1);
bits_used |= (field_bitmask & defs_bits_used) <<
(chunk * field_bits);
break;
} else {
return all_bits;

View file

@ -137,6 +137,7 @@ TEST_F(ssa_def_bits_used_test, extract_i16_with_const_index)
src1_imm[3]);
nir_alu_instr *alu = build_alu_instr(nir_op_extract_i16, src0, src1);
nir_store_global(b, nir_undef(b, 1, 64), 4, &alu->def, 0x1);
ASSERT_NE((void *) 0, alu);
@ -168,6 +169,7 @@ TEST_F(ssa_def_bits_used_test, extract_u16_with_const_index)
src1_imm[3]);
nir_alu_instr *alu = build_alu_instr(nir_op_extract_u16, src0, src1);
nir_store_global(b, nir_undef(b, 1, 64), 4, &alu->def, 0x1);
ASSERT_NE((void *) 0, alu);
@ -199,6 +201,7 @@ TEST_F(ssa_def_bits_used_test, extract_i8_with_const_index)
src1_imm[3]);
nir_alu_instr *alu = build_alu_instr(nir_op_extract_i8, src0, src1);
nir_store_global(b, nir_undef(b, 1, 64), 4, &alu->def, 0x1);
ASSERT_NE((void *) 0, alu);
@ -230,6 +233,7 @@ TEST_F(ssa_def_bits_used_test, extract_u8_with_const_index)
src1_imm[3]);
nir_alu_instr *alu = build_alu_instr(nir_op_extract_u8, src0, src1);
nir_store_global(b, nir_undef(b, 1, 64), 4, &alu->def, 0x1);
ASSERT_NE((void *) 0, alu);