From d41b0a2bf592116febe576bfcda40970b22394da Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 11 Dec 2023 13:10:29 -0600 Subject: [PATCH] nak: Move the copy detection part of opt_copy_prop to a helper Part-of: --- src/nouveau/compiler/nak/opt_copy_prop.rs | 215 ++++++++++------------ 1 file changed, 99 insertions(+), 116 deletions(-) diff --git a/src/nouveau/compiler/nak/opt_copy_prop.rs b/src/nouveau/compiler/nak/opt_copy_prop.rs index f4695c71152..561cc27c1bb 100644 --- a/src/nouveau/compiler/nak/opt_copy_prop.rs +++ b/src/nouveau/compiler/nak/opt_copy_prop.rs @@ -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);