From c68989e49c3da4ade817a233499f5c5f23f90419 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 10 Apr 2023 17:23:25 -0500 Subject: [PATCH] nak: Don't emit MOVs for overlapping vec and split src/dst Part-of: --- src/nouveau/compiler/nak_ir.rs | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/nouveau/compiler/nak_ir.rs b/src/nouveau/compiler/nak_ir.rs index abcafe93ca9..2fac36c08eb 100644 --- a/src/nouveau/compiler/nak_ir.rs +++ b/src/nouveau/compiler/nak_ir.rs @@ -2029,8 +2029,16 @@ impl Shader { assert!(comps == vec_dst.comps()); for i in 0..comps { let src = vec.srcs[usize::from(i)]; - let dst = Dst::Reg(vec_dst.as_comp(i).unwrap()); - instrs.push(Instr::new_mov(dst, src)); + let dst = vec_dst.as_comp(i).unwrap(); + match src.src_ref { + SrcRef::Reg(reg) => { + if reg == dst { + continue; + } + } + _ => (), + } + instrs.push(Instr::new_mov(dst.into(), src)); } instrs } @@ -2042,8 +2050,14 @@ impl Shader { for i in 0..comps { let src = vec_src.as_comp(i).unwrap(); let dst = split.dsts[usize::from(i)]; - if let Dst::None = dst { - continue; + match dst { + Dst::None => continue, + Dst::Reg(reg) => { + if reg == src { + continue; + } + } + _ => (), } instrs.push(Instr::new_mov(dst.into(), src.into())); }