From ced6b44ba6aea0290d096d427875c8d79e3d5f6b Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Wed, 24 May 2023 16:50:20 -0500 Subject: [PATCH] nak: Follow memcpy semantics with OpParCopy Destination first followed by source. Otherwise, we'll screw ourselves up endlessly. Part-of: --- src/nouveau/compiler/nak_from_nir.rs | 6 +++--- src/nouveau/compiler/nak_ir.rs | 6 +++--- src/nouveau/compiler/nak_legalize.rs | 2 +- src/nouveau/compiler/nak_opt_copy_prop.rs | 2 +- src/nouveau/compiler/nak_opt_dce.rs | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/nouveau/compiler/nak_from_nir.rs b/src/nouveau/compiler/nak_from_nir.rs index 537f79831dc..00d3035454e 100644 --- a/src/nouveau/compiler/nak_from_nir.rs +++ b/src/nouveau/compiler/nak_from_nir.rs @@ -640,8 +640,8 @@ impl<'a> ShaderFromNir<'a> { nir_op_pack_64_2x32_split => { let dst_ssa = dst.as_ssa().unwrap(); let mut pcopy = OpParCopy::new(); - pcopy.push(srcs[0], dst_ssa[0].into()); - pcopy.push(srcs[1], dst_ssa[1].into()); + pcopy.push(dst_ssa[0].into(), srcs[0]); + pcopy.push(dst_ssa[1].into(), srcs[1]); self.instrs.push(Instr::new_boxed(Op::ParCopy(pcopy))); } nir_op_u2f32 => { @@ -1158,7 +1158,7 @@ impl<'a> ShaderFromNir<'a> { let vec_dst = *dst.as_ssa().unwrap(); for (i, dst) in vec_dst.iter().enumerate() { let i = u16::try_from(i).unwrap(); - pcopy.push(cb.offset(i * 4).into(), (*dst).into()); + pcopy.push((*dst).into(), cb.offset(i * 4).into()); } self.instrs.push(Instr::new_boxed(Op::ParCopy(pcopy))); } else { diff --git a/src/nouveau/compiler/nak_ir.rs b/src/nouveau/compiler/nak_ir.rs index a766080512a..f56a3ea26b6 100644 --- a/src/nouveau/compiler/nak_ir.rs +++ b/src/nouveau/compiler/nak_ir.rs @@ -2911,12 +2911,12 @@ impl OpParCopy { self.srcs.is_empty() } - pub fn iter(&self) -> Zip, slice::Iter<'_, Dst>> { + pub fn iter(&self) -> Zip, slice::Iter<'_, Src>> { assert!(self.srcs.len() == self.dsts.len()); - self.srcs.iter().zip(&self.dsts) + self.dsts.iter().zip(&self.srcs) } - pub fn push(&mut self, src: Src, dst: Dst) { + pub fn push(&mut self, dst: Dst, src: Src) { assert!(self.srcs.len() == self.dsts.len()); self.srcs.push(src); self.dsts.push(dst); diff --git a/src/nouveau/compiler/nak_legalize.rs b/src/nouveau/compiler/nak_legalize.rs index 5eb97808dd4..c5a1547363c 100644 --- a/src/nouveau/compiler/nak_legalize.rs +++ b/src/nouveau/compiler/nak_legalize.rs @@ -280,7 +280,7 @@ impl<'a> LegalizeInstr<'a> { */ if vec_comps.get(&ssa).is_some() { let copy = self.ssa_alloc.alloc(ssa.file()); - pcopy.push(ssa.into(), copy.into()); + pcopy.push(copy.into(), ssa.into()); new_vec[usize::from(c)] = copy; } else { vec_comps.insert(ssa); diff --git a/src/nouveau/compiler/nak_opt_copy_prop.rs b/src/nouveau/compiler/nak_opt_copy_prop.rs index 77fba7f283e..1d5780ee977 100644 --- a/src/nouveau/compiler/nak_opt_copy_prop.rs +++ b/src/nouveau/compiler/nak_opt_copy_prop.rs @@ -415,7 +415,7 @@ impl CopyPropPass { self.add_copy(dst[0], SrcType::I32, neg.src.ineg()); } Op::ParCopy(pcopy) => { - for (src, dst) in pcopy.iter() { + for (dst, src) in pcopy.iter() { let dst = dst.as_ssa().unwrap(); assert!(dst.comps() == 1); self.add_copy(dst[0], SrcType::GPR, *src); diff --git a/src/nouveau/compiler/nak_opt_dce.rs b/src/nouveau/compiler/nak_opt_dce.rs index 35e17e677ea..8bfc52eb93f 100644 --- a/src/nouveau/compiler/nak_opt_dce.rs +++ b/src/nouveau/compiler/nak_opt_dce.rs @@ -101,7 +101,7 @@ impl DeadCodePass { } Op::ParCopy(pcopy) => { assert!(instr.pred.is_true()); - for (src, dst) in pcopy.iter() { + for (dst, src) in pcopy.iter() { if self.is_dst_live(dst) { self.mark_src_live(src); } else {