From fe7ac83a94a9b6e44e418b40a9a3d89f8dcdd995 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Mon, 28 Aug 2023 19:53:38 -0500 Subject: [PATCH] nak: Use more OpCopy Instead of using OpMov or OpParCopy, use OpCopy directly. This reserves OpParCopy for RA type things and OpMOv for actual codegen. We can also drop OpMov from copy propagation now. Part-of: --- src/nouveau/compiler/nak_builder.rs | 25 ++++++--------- src/nouveau/compiler/nak_from_nir.rs | 39 +++++++---------------- src/nouveau/compiler/nak_legalize.rs | 7 +--- src/nouveau/compiler/nak_opt_copy_prop.rs | 7 ---- 4 files changed, 23 insertions(+), 55 deletions(-) diff --git a/src/nouveau/compiler/nak_builder.rs b/src/nouveau/compiler/nak_builder.rs index 5b78f2a9110..abd79c274f7 100644 --- a/src/nouveau/compiler/nak_builder.rs +++ b/src/nouveau/compiler/nak_builder.rs @@ -49,14 +49,6 @@ pub trait Builder { } } - fn mov_to(&mut self, dst: Dst, src: Src) { - self.push_op(OpMov { - dst: dst, - src: src, - quad_lanes: 0xf, - }); - } - fn copy_to(&mut self, dst: Dst, src: Src) { self.push_op(OpCopy { dst: dst, src: src }); } @@ -175,13 +167,6 @@ pub trait SSABuilder: Builder { dst } - fn mov(&mut self, src: Src) -> SSARef { - assert!(!src.is_predicate()); - let dst = self.alloc_ssa(RegFile::GPR, 1); - self.mov_to(dst.into(), src); - dst - } - fn mufu(&mut self, op: MuFuOp, src: Src) -> SSARef { let dst = self.alloc_ssa(RegFile::GPR, 1); self.push_op(OpMuFu { @@ -216,6 +201,16 @@ pub trait SSABuilder: Builder { dst } } + + fn copy(&mut self, src: Src) -> SSARef { + let dst = if src.is_predicate() { + self.alloc_ssa(RegFile::Pred, 1) + } else { + self.alloc_ssa(RegFile::GPR, 1) + }; + self.copy_to(dst.into(), src); + dst + } } pub struct InstrBuilder { diff --git a/src/nouveau/compiler/nak_from_nir.rs b/src/nouveau/compiler/nak_from_nir.rs index 64af28b3422..64f9a188e46 100644 --- a/src/nouveau/compiler/nak_from_nir.rs +++ b/src/nouveau/compiler/nak_from_nir.rs @@ -187,16 +187,14 @@ impl<'a> ShaderFromNir<'a> { RegFile::GPR }; - let mut pcopy = OpParCopy::new(); let mut dst_vec = Vec::new(); for src in srcs { for v in src.as_ssa().unwrap().iter() { let dst = b.alloc_ssa(file, 1)[0]; - pcopy.push(dst.into(), (*v).into()); + b.copy_to(dst.into(), (*v).into()); dst_vec.push(dst); } } - b.push_op(pcopy); self.set_ssa(&alu.def, dst_vec); return; } @@ -403,7 +401,7 @@ impl<'a> ShaderFromNir<'a> { nir_op_fsat => { assert!(alu.def.bit_size() == 32); if self.alu_src_is_saturated(&alu.srcs_as_slice()[0]) { - b.mov(srcs[0]) + b.copy(srcs[0]) } else { let dst = b.alloc_ssa(RegFile::GPR, 1); b.push_op(OpFAdd { @@ -670,10 +668,8 @@ impl<'a> ShaderFromNir<'a> { } nir_op_pack_64_2x32_split => { let dst = b.alloc_ssa(RegFile::GPR, 2); - let mut pcopy = OpParCopy::new(); - pcopy.push(dst[0].into(), srcs[0]); - pcopy.push(dst[1].into(), srcs[1]); - b.push_op(pcopy); + b.copy_to(dst[0].into(), srcs[0]); + b.copy_to(dst[1].into(), srcs[1]); dst } nir_op_pack_half_2x16_split => { @@ -749,11 +745,11 @@ impl<'a> ShaderFromNir<'a> { } nir_op_unpack_64_2x32_split_x => { let src0_x = srcs[0].as_ssa().unwrap()[0]; - b.mov(src0_x.into()) + b.copy(src0_x.into()) } nir_op_unpack_64_2x32_split_y => { let src0_y = srcs[0].as_ssa().unwrap()[1]; - b.mov(src0_y.into()) + b.copy(src0_y.into()) } nir_op_unpack_half_2x16_split_x | nir_op_unpack_half_2x16_split_y => { @@ -952,7 +948,7 @@ impl<'a> ShaderFromNir<'a> { let mut nir_dst = Vec::new(); for i in 0..tex.def.num_components() { if mask & (1 << i) == 0 { - nir_dst.push(b.mov(Src::new_zero())[0]); + nir_dst.push(b.copy(Src::new_zero())[0]); } else { nir_dst.push(dsts[di / 2].as_ssa().unwrap()[di % 2].into()); di += 1; @@ -1310,12 +1306,10 @@ impl<'a> ShaderFromNir<'a> { offset: off_imm.try_into().unwrap(), }; if off.is_zero() { - let mut pcopy = OpParCopy::new(); for (i, comp) in dst.iter().enumerate() { let i = u16::try_from(i).unwrap(); - pcopy.push((*comp).into(), cb.offset(i * 4).into()); + b.copy_to((*comp).into(), cb.offset(i * 4).into()); } - b.push_op(pcopy); } else { b.push_op(OpLdc { dst: dst.into(), @@ -1511,30 +1505,21 @@ impl<'a> ShaderFromNir<'a> { } } - let mut pcopy = OpParCopy::new(); let mut dst_vec = Vec::new(); for c in 0..load_const.def.num_components { if load_const.def.bit_size == 1 { let imm_b1 = unsafe { load_const.values()[c as usize].b }; - let dst = b.alloc_ssa(RegFile::Pred, 1); - pcopy.push(dst.into(), Src::new_imm_bool(imm_b1)); - dst_vec.push(dst[0]); + dst_vec.push(b.copy(Src::new_imm_bool(imm_b1))[0]); } else if load_const.def.bit_size == 32 { let imm_u32 = unsafe { load_const.values()[c as usize].u32_ }; - let dst = b.alloc_ssa(RegFile::GPR, 1); - pcopy.push(dst.into(), src_for_u32(imm_u32)); - dst_vec.push(dst[0]); + dst_vec.push(b.copy(src_for_u32(imm_u32))[0]); } else if load_const.def.bit_size == 64 { let imm_u64 = unsafe { load_const.values()[c as usize].u64_ }; - let dst = b.alloc_ssa(RegFile::GPR, 2); - pcopy.push(dst[0].into(), src_for_u32(imm_u64 as u32)); - pcopy.push(dst[1].into(), src_for_u32((imm_u64 >> 32) as u32)); - dst_vec.push(dst[0]); - dst_vec.push(dst[1]); + dst_vec.push(b.copy(src_for_u32(imm_u64 as u32))[0]); + dst_vec.push(b.copy(src_for_u32((imm_u64 >> 32) as u32))[0]); } } - b.push_op(pcopy); self.set_ssa(&load_const.def, dst_vec); } diff --git a/src/nouveau/compiler/nak_legalize.rs b/src/nouveau/compiler/nak_legalize.rs index 1f32183cc13..23a7bd35909 100644 --- a/src/nouveau/compiler/nak_legalize.rs +++ b/src/nouveau/compiler/nak_legalize.rs @@ -249,7 +249,6 @@ fn legalize_instr(b: &mut impl SSABuilder, instr: &mut Instr) { let mut vec_src_map: HashMap = HashMap::new(); let mut vec_comps = HashSet::new(); - let mut pcopy = OpParCopy::new(); for src in instr.srcs_mut() { if let SrcRef::SSA(vec) = &src.src_ref { if vec.comps() == 1 { @@ -275,7 +274,7 @@ fn legalize_instr(b: &mut impl SSABuilder, instr: &mut Instr) { */ if vec_comps.get(&ssa).is_some() { let copy = b.alloc_ssa(ssa.file(), 1)[0]; - pcopy.push(copy.into(), ssa.into()); + b.copy_to(copy.into(), ssa.into()); new_vec[usize::from(c)] = copy; } else { vec_comps.insert(ssa); @@ -286,10 +285,6 @@ fn legalize_instr(b: &mut impl SSABuilder, instr: &mut Instr) { src.src_ref = new_vec.into(); } } - - if !pcopy.is_empty() { - b.push_op(pcopy); - } } impl Shader { diff --git a/src/nouveau/compiler/nak_opt_copy_prop.rs b/src/nouveau/compiler/nak_opt_copy_prop.rs index 284b1c0aec1..f0e7f17e54f 100644 --- a/src/nouveau/compiler/nak_opt_copy_prop.rs +++ b/src/nouveau/compiler/nak_opt_copy_prop.rs @@ -360,13 +360,6 @@ impl CopyPropPass { } } } - Op::Mov(mov) => { - let dst = mov.dst.as_ssa().unwrap(); - assert!(dst.comps() == 1); - if mov.quad_lanes == 0xf { - self.add_copy(dst[0], SrcType::GPR, mov.src); - } - } Op::PLop3(lop) => { for i in 0..2 { let dst = match lop.dsts[i] {