mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-16 09:20:34 +01:00
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:
parent
e38a0b9a05
commit
a78ed8b8e8
2 changed files with 20 additions and 12 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue