@@ -86,6 +86,7 @@ class HoistSpillHelper : private LiveRangeEdit::Delegate {
8686 const TargetInstrInfo &TII;
8787 const TargetRegisterInfo &TRI;
8888 const MachineBlockFrequencyInfo &MBFI;
89+ LiveRegMatrix &Matrix;
8990
9091 InsertPointAnalysis IPA;
9192
@@ -129,16 +130,17 @@ class HoistSpillHelper : private LiveRangeEdit::Delegate {
129130
130131public:
131132 HoistSpillHelper (const Spiller::RequiredAnalyses &Analyses,
132- MachineFunction &mf, VirtRegMap &vrm)
133+ MachineFunction &mf, VirtRegMap &vrm, LiveRegMatrix &matrix )
133134 : MF(mf), LIS(Analyses.LIS), LSS(Analyses.LSS), MDT(Analyses.MDT),
134135 VRM (vrm), MRI(mf.getRegInfo()), TII(*mf.getSubtarget().getInstrInfo()),
135136 TRI(*mf.getSubtarget().getRegisterInfo()), MBFI(Analyses.MBFI),
136- IPA(LIS, mf.getNumBlockIDs()) {}
137+ Matrix(matrix), IPA(LIS, mf.getNumBlockIDs()) {}
137138
138139 void addToMergeableSpills (MachineInstr &Spill, int StackSlot,
139140 Register Original);
140141 bool rmFromMergeableSpills (MachineInstr &Spill, int StackSlot);
141142 void hoistAllSpills ();
143+ bool LRE_CanEraseVirtReg (Register) override ;
142144 void LRE_DidCloneVirtReg (Register, Register) override ;
143145};
144146
@@ -191,7 +193,7 @@ class InlineSpiller : public Spiller {
191193 : MF(MF), LIS(Analyses.LIS), LSS(Analyses.LSS), VRM(VRM),
192194 MRI (MF.getRegInfo()), TII(*MF.getSubtarget().getInstrInfo()),
193195 TRI(*MF.getSubtarget().getRegisterInfo()), Matrix(Matrix),
194- HSpiller(Analyses, MF, VRM), VRAI(VRAI) {}
196+ HSpiller(Analyses, MF, VRM, *Matrix ), VRAI(VRAI) {}
195197
196198 void spill (LiveRangeEdit &, AllocationOrder *Order = nullptr ) override ;
197199 ArrayRef<Register> getSpilledRegs () override { return RegsToSpill; }
@@ -1750,6 +1752,16 @@ void HoistSpillHelper::hoistAllSpills() {
17501752 }
17511753}
17521754
1755+ // / Called before a virtual register is erased from LiveIntervals.
1756+ // / Forcibly remove the register from LiveRegMatrix before it's deleted,
1757+ // / preventing dangling pointers.
1758+ bool HoistSpillHelper::LRE_CanEraseVirtReg (Register VirtReg) {
1759+ if (VRM.hasPhys (VirtReg)) {
1760+ Matrix.unassign (VirtReg);
1761+ }
1762+ return true ; // Allow deletion to proceed
1763+ }
1764+
17531765// / For VirtReg clone, the \p New register should have the same physreg or
17541766// / stackslot as the \p old register.
17551767void HoistSpillHelper::LRE_DidCloneVirtReg (Register New, Register Old) {
0 commit comments