From 6c68c2c3ba398b45bc351bc91bca4c9188cb5325 Mon Sep 17 00:00:00 2001 From: Mel Henning Date: Fri, 23 May 2025 20:59:25 -0400 Subject: [PATCH] nak/spill_values: Follow phis from src to dest ssa_state_out has the predecessor's SSAValue, so we need look for it in the phi_src map. Totals: CodeSize: 4545122720 -> 4534830176 (-0.23%); split: -0.23%, +0.00% Number of GPRs: 10963889 -> 10963693 (-0.00%); split: -0.00%, +0.00% SLM Size: 1855380 -> 1649308 (-11.11%); split: -11.11%, +0.01% Static cycle count: 1104322907 -> 1093035821 (-1.02%); split: -1.02%, +0.00% Spills to memory: 480689 -> 139107 (-71.06%) Fills from memory: 480689 -> 139107 (-71.06%) Spills to reg: 458804 -> 242139 (-47.22%); split: -47.23%, +0.01% Fills from reg: 303068 -> 222030 (-26.74%); split: -26.75%, +0.01% Max warps/SM: 7245516 -> 7245580 (+0.00%) Totals from 9899 (5.04% of 196502) affected shaders: CodeSize: 1056727952 -> 1046435408 (-0.97%); split: -0.98%, +0.00% Number of GPRs: 1666652 -> 1666456 (-0.01%); split: -0.01%, +0.00% SLM Size: 1107988 -> 901916 (-18.60%); split: -18.61%, +0.01% Static cycle count: 254942337 -> 243655251 (-4.43%); split: -4.43%, +0.01% Spills to memory: 480689 -> 139107 (-71.06%) Fills from memory: 480689 -> 139107 (-71.06%) Spills to reg: 367784 -> 151119 (-58.91%); split: -58.92%, +0.01% Fills from reg: 222209 -> 141171 (-36.47%); split: -36.49%, +0.02% Max warps/SM: 119188 -> 119252 (+0.05%) Fixes: bcad2add473 ("nak: Add a spilling pass") Reviewed-by: Faith Ekstrand Part-of: --- src/nouveau/compiler/nak/spill_values.rs | 28 ++++++++++++++---------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/nouveau/compiler/nak/spill_values.rs b/src/nouveau/compiler/nak/spill_values.rs index afa3fd1d151..d55eb76034d 100644 --- a/src/nouveau/compiler/nak/spill_values.rs +++ b/src/nouveau/compiler/nak/spill_values.rs @@ -14,20 +14,21 @@ use std::cell::RefCell; use std::cmp::{max, Ordering, Reverse}; use std::collections::BinaryHeap; +#[derive(Default)] struct PhiDstMap { + phi_ssa: FxHashMap, ssa_phi: FxHashMap, } impl PhiDstMap { fn new() -> PhiDstMap { - PhiDstMap { - ssa_phi: Default::default(), - } + Default::default() } fn add_phi_dst(&mut self, phi: Phi, dst: &Dst) { let vec = dst.as_ssa().expect("Not an SSA destination"); debug_assert!(vec.comps() == 1); + self.phi_ssa.insert(phi, vec[0]); self.ssa_phi.insert(vec[0], phi); } @@ -44,24 +45,27 @@ impl PhiDstMap { fn get_phi(&self, ssa: &SSAValue) -> Option<&Phi> { self.ssa_phi.get(ssa) } + + fn get_dst_ssa(&self, phi: &Phi) -> Option<&SSAValue> { + self.phi_ssa.get(phi) + } } +#[derive(Default)] struct PhiSrcMap { - phi_src: FxHashMap, + src_phi: FxHashMap, } impl PhiSrcMap { fn new() -> PhiSrcMap { - PhiSrcMap { - phi_src: Default::default(), - } + Default::default() } fn add_phi_src(&mut self, phi: Phi, src: &Src) { debug_assert!(src.is_unmodified()); let vec = src.src_ref.as_ssa().expect("Not an SSA source"); debug_assert!(vec.comps() == 1); - self.phi_src.insert(phi, vec[0]); + self.src_phi.insert(vec[0], phi); } pub fn from_block(block: &BasicBlock) -> PhiSrcMap { @@ -74,8 +78,8 @@ impl PhiSrcMap { map } - pub fn get_src_ssa(&self, phi: &Phi) -> &SSAValue { - self.phi_src.get(phi).expect("Phi source missing") + pub fn get_phi(&self, ssa: &SSAValue) -> Option<&Phi> { + self.src_phi.get(ssa) } } @@ -599,8 +603,8 @@ fn spill_values( let phi_src_map = &phi_src_maps[*p_idx]; for mut ssa in ssa_state_out[*p_idx].w.iter().cloned() { - if let Some(phi) = phi_dst_map.get_phi(&ssa) { - ssa = *phi_src_map.get_src_ssa(phi); + if let Some(phi) = phi_src_map.get_phi(&ssa) { + ssa = *phi_dst_map.get_dst_ssa(phi).unwrap(); } if let Some(next_use) = bl.first_use(&ssa) {