@@ -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,20 @@ 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 this virtual register is assigned to a physical register,
1760+ // unassign it from LiveRegMatrix before the interval is deleted.
1761+ // Use unassign_and_clear_all_refs() instead of unassign() because the
1762+ // LiveInterval may already be empty or in an inconsistent state.
1763+ if (VRM.hasPhys (VirtReg)) {
1764+ Matrix.unassign (VirtReg);
1765+ }
1766+ return true ; // Allow deletion to proceed
1767+ }
1768+
17531769// / For VirtReg clone, the \p New register should have the same physreg or
17541770// / stackslot as the \p old register.
17551771void HoistSpillHelper::LRE_DidCloneVirtReg (Register New, Register Old) {
0 commit comments