diff --git a/.pick_status.json b/.pick_status.json index 8599615ad02..551e3404658 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -204,7 +204,7 @@ "description": "nak/opt_lop: Don't handle modifiers in dedup_srcs", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "66c9c40f68bcf738b1b5dd9a26d141d4c71e4522", "notes": null diff --git a/src/nouveau/compiler/nak/opt_lop.rs b/src/nouveau/compiler/nak/opt_lop.rs index a6761891855..416784e0885 100644 --- a/src/nouveau/compiler/nak/opt_lop.rs +++ b/src/nouveau/compiler/nak/opt_lop.rs @@ -73,23 +73,11 @@ impl LopPass { for i in 0..2 { for j in (i + 1)..3 { if srcs[i].src_ref == srcs[j].src_ref { + assert!(srcs[i].is_unmodified()); + assert!(srcs[j].is_unmodified()); *op = LogicOp3::new_lut(&|x, y, z| { - let dup = [x, y, z][i]; - let si = match srcs[i].src_mod { - SrcMod::None => dup, - SrcMod::BNot => !dup, - _ => panic!("Not a bitwise modifer"), - }; - let sj = match srcs[j].src_mod { - SrcMod::None => dup, - SrcMod::BNot => !dup, - _ => panic!("Not a bitwise modifer"), - }; - let mut s = [x, y, z]; - s[i] = si; - s[j] = sj; - + s[j] = s[i]; op.eval(s[0], s[1], s[2]) }); } @@ -220,17 +208,19 @@ impl LopPass { } fn opt_plop3(&mut self, op: &mut OpPLop3) { - self.dedup_srcs(&mut op.ops[0], &op.srcs); - self.dedup_srcs(&mut op.ops[1], &op.srcs); - - // Replace unused sources with PT for (i, src) in op.srcs.iter_mut().enumerate() { if src.src_mod.is_bnot() { op.ops[0].invert_src(i); op.ops[1].invert_src(i); src.src_mod = SrcMod::None; } + } + self.dedup_srcs(&mut op.ops[0], &op.srcs); + self.dedup_srcs(&mut op.ops[1], &op.srcs); + + // Replace unused sources with PT + for (i, src) in op.srcs.iter_mut().enumerate() { if let Some(b) = src_as_bool(src) { op.ops[0].fix_src(i, b); op.ops[1].fix_src(i, b);