nak: Move the copy detection part of opt_copy_prop to a helper

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26743>
This commit is contained in:
Faith Ekstrand 2023-12-11 13:10:29 -06:00 committed by Marge Bot
parent 0b2e48f432
commit d41b0a2bf5

View file

@ -304,125 +304,108 @@ impl CopyPropPass {
}
}
fn try_add_instr(&mut self, instr: &Instr) {
match &instr.op {
Op::FAdd(add) => {
let dst = add.dst.as_ssa().unwrap();
assert!(dst.comps() == 1);
let dst = dst[0];
if !add.saturate {
if add.srcs[0].is_fneg_zero(SrcType::F32) {
self.add_copy(dst, SrcType::F32, add.srcs[1]);
} else if add.srcs[1].is_fneg_zero(SrcType::F32) {
self.add_copy(dst, SrcType::F32, add.srcs[0]);
}
}
}
Op::DAdd(add) => {
let dst = add.dst.as_ssa().unwrap();
if !add.saturate {
if add.srcs[0].is_zero() {
self.add_fp64_copy(dst, add.srcs[1]);
} else if add.srcs[1].is_zero() {
self.add_fp64_copy(dst, add.srcs[0]);
}
}
}
Op::Lop3(lop) => {
let dst = lop.dst.as_ssa().unwrap();
assert!(dst.comps() == 1);
let dst = dst[0];
let op = lop.op;
if op.lut == 0 {
self.add_copy(dst, SrcType::ALU, SrcRef::Zero.into());
} else if op.lut == !0 {
self.add_copy(
dst,
SrcType::ALU,
SrcRef::Imm32(u32::MAX).into(),
);
} else {
for s in 0..3 {
if op.lut == LogicOp3::SRC_MASKS[s] {
self.add_copy(dst, SrcType::ALU, lop.srcs[s]);
}
}
}
}
Op::PLop3(lop) => {
for i in 0..2 {
let dst = match lop.dsts[i] {
Dst::SSA(vec) => {
assert!(vec.comps() == 1);
vec[0]
}
_ => continue,
};
let op = lop.ops[i];
if op.lut == 0 {
self.add_copy(dst, SrcType::Pred, SrcRef::False.into());
} else if op.lut == !0 {
self.add_copy(dst, SrcType::Pred, SrcRef::True.into());
} else {
for s in 0..3 {
if op.lut == LogicOp3::SRC_MASKS[s] {
self.add_copy(dst, SrcType::Pred, lop.srcs[s]);
} else if op.lut == !LogicOp3::SRC_MASKS[s] {
self.add_copy(
dst,
SrcType::Pred,
lop.srcs[s].bnot(),
);
}
}
}
}
}
Op::INeg(neg) => {
let dst = neg.dst.as_ssa().unwrap();
assert!(dst.comps() == 1);
self.add_copy(dst[0], SrcType::I32, neg.src.ineg());
}
Op::Copy(copy) => {
let dst = copy.dst.as_ssa().unwrap();
assert!(dst.comps() == 1);
self.add_copy(dst[0], SrcType::GPR, copy.src);
}
Op::ParCopy(pcopy) => {
for (dst, src) in pcopy.dsts_srcs.iter() {
let dst = dst.as_ssa().unwrap();
assert!(dst.comps() == 1);
self.add_copy(dst[0], SrcType::GPR, *src);
}
}
_ => (),
}
}
pub fn run(&mut self, f: &mut Function) {
for b in &mut f.blocks {
for instr in &mut b.instrs {
match &instr.op {
Op::FAdd(add) => {
let dst = add.dst.as_ssa().unwrap();
assert!(dst.comps() == 1);
let dst = dst[0];
if !add.saturate {
if add.srcs[0].is_fneg_zero(SrcType::F32) {
self.add_copy(dst, SrcType::F32, add.srcs[1]);
} else if add.srcs[1].is_fneg_zero(SrcType::F32) {
self.add_copy(dst, SrcType::F32, add.srcs[0]);
}
}
}
Op::DAdd(add) => {
let dst = add.dst.as_ssa().unwrap();
if !add.saturate {
if add.srcs[0].is_zero() {
self.add_fp64_copy(dst, add.srcs[1]);
} else if add.srcs[1].is_zero() {
self.add_fp64_copy(dst, add.srcs[0]);
}
}
}
Op::Lop3(lop) => {
let dst = lop.dst.as_ssa().unwrap();
assert!(dst.comps() == 1);
let dst = dst[0];
let op = lop.op;
if op.lut == 0 {
self.add_copy(
dst,
SrcType::ALU,
SrcRef::Zero.into(),
);
} else if op.lut == !0 {
self.add_copy(
dst,
SrcType::ALU,
SrcRef::Imm32(u32::MAX).into(),
);
} else {
for s in 0..3 {
if op.lut == LogicOp3::SRC_MASKS[s] {
self.add_copy(
dst,
SrcType::ALU,
lop.srcs[s],
);
}
}
}
}
Op::PLop3(lop) => {
for i in 0..2 {
let dst = match lop.dsts[i] {
Dst::SSA(vec) => {
assert!(vec.comps() == 1);
vec[0]
}
_ => continue,
};
let op = lop.ops[i];
if op.lut == 0 {
self.add_copy(
dst,
SrcType::Pred,
SrcRef::False.into(),
);
} else if op.lut == !0 {
self.add_copy(
dst,
SrcType::Pred,
SrcRef::True.into(),
);
} else {
for s in 0..3 {
if op.lut == LogicOp3::SRC_MASKS[s] {
self.add_copy(
dst,
SrcType::Pred,
lop.srcs[s],
);
} else if op.lut == !LogicOp3::SRC_MASKS[s]
{
self.add_copy(
dst,
SrcType::Pred,
lop.srcs[s].bnot(),
);
}
}
}
}
}
Op::INeg(neg) => {
let dst = neg.dst.as_ssa().unwrap();
assert!(dst.comps() == 1);
self.add_copy(dst[0], SrcType::I32, neg.src.ineg());
}
Op::Copy(copy) => {
let dst = copy.dst.as_ssa().unwrap();
assert!(dst.comps() == 1);
self.add_copy(dst[0], SrcType::GPR, copy.src);
}
Op::ParCopy(pcopy) => {
for (dst, src) in pcopy.dsts_srcs.iter() {
let dst = dst.as_ssa().unwrap();
assert!(dst.comps() == 1);
self.add_copy(dst[0], SrcType::GPR, *src);
}
}
_ => (),
}
self.try_add_instr(instr);
self.prop_to_pred(&mut instr.pred);