nir/opt_undef: add a pass to clean up 64bit undefs
somehow 64bit lowering creates patterns like vec1 64 ssa_1 = undefined ssa_2 = unpack_64_2x32_split_x ssa_1 and then the 64bit value is never otherwise used. for this case, rewriting the unpack to just be a 32bit undef allows the 64bit undef to be optimized out, avoiding spec violations fixes #6945 SoroushIMG <soroush.kashani@imgtec.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18728>
This commit is contained in:

committed by
Marge Bot

parent
38543af8f7
commit
52edd8f764
@@ -168,12 +168,33 @@ opt_undef_store(nir_intrinsic_instr *intrin)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
opt_undef_pack(nir_builder *b, nir_alu_instr *alu)
|
||||||
|
{
|
||||||
|
switch (alu->op) {
|
||||||
|
case nir_op_unpack_64_2x32_split_x:
|
||||||
|
case nir_op_unpack_64_2x32_split_y:
|
||||||
|
case nir_op_unpack_64_2x32:
|
||||||
|
if (nir_src_is_undef(alu->src[0].src))
|
||||||
|
break;
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
unsigned num_components = nir_dest_num_components(alu->dest.dest);
|
||||||
|
b->cursor = nir_before_instr(&alu->instr);
|
||||||
|
nir_ssa_def *def = nir_ssa_undef(b, num_components, 32);
|
||||||
|
nir_ssa_def_rewrite_uses_after(&alu->dest.dest.ssa, def, &alu->instr);
|
||||||
|
nir_instr_remove(&alu->instr);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
nir_opt_undef_instr(nir_builder *b, nir_instr *instr, void *data)
|
nir_opt_undef_instr(nir_builder *b, nir_instr *instr, void *data)
|
||||||
{
|
{
|
||||||
if (instr->type == nir_instr_type_alu) {
|
if (instr->type == nir_instr_type_alu) {
|
||||||
nir_alu_instr *alu = nir_instr_as_alu(instr);
|
nir_alu_instr *alu = nir_instr_as_alu(instr);
|
||||||
return opt_undef_csel(alu) || opt_undef_vecN(b, alu);
|
return opt_undef_csel(alu) || opt_undef_vecN(b, alu) || opt_undef_pack(b, alu);
|
||||||
} else if (instr->type == nir_instr_type_intrinsic) {
|
} else if (instr->type == nir_instr_type_intrinsic) {
|
||||||
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
|
nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
|
||||||
return opt_undef_store(intrin);
|
return opt_undef_store(intrin);
|
||||||
|
Reference in New Issue
Block a user