From 2ad12150e847978fa8eec83d635c15e75cfe8c7f Mon Sep 17 00:00:00 2001 From: Mel Henning Date: Mon, 3 Nov 2025 13:45:43 -0500 Subject: [PATCH] nak/opt_lop: Don't handle modifiers in dedup_srcs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The handling in dedup_srcs was incorrect because it would apply the modifier from srcs[i] to the LUT without removing the modifier from the instruction. We can fix and simplify this code by removing all modifiers before the dedup_srcs() call, which we were doing immediately after the call anyway. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/13966 Fixes: 66c9c40f68bc ("nak: Handle modifiers in dedup_srcs() in opt_lop()") Reviewed-by: Seán de Búrca Reviewed-by: Lorenzo Rossi (cherry picked from commit 041216e605a89cfb36edb4a5a6c97ffbc835a1a1) Part-of: --- .pick_status.json | 2 +- src/nouveau/compiler/nak/opt_lop.rs | 28 +++++++++------------------- 2 files changed, 10 insertions(+), 20 deletions(-) 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);