mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 06:32:24 +00:00
Avoid using stale entries form the sibling value map.
This could happen when trying to use a value that had been eliminated after dead code elimination and folding loads. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@130597 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
66446c803a
commit
6ee56e658a
@ -286,6 +286,11 @@ namespace llvm {
|
||||
return valnos[ValNo];
|
||||
}
|
||||
|
||||
/// containsValue - Returns true if VNI belongs to this interval.
|
||||
bool containsValue(const VNInfo *VNI) const {
|
||||
return VNI && VNI->id < getNumValNums() && VNI == getValNumInfo(VNI->id);
|
||||
}
|
||||
|
||||
/// getNextValue - Create a new value number and return it. MIIdx specifies
|
||||
/// the instruction that defines the value number.
|
||||
VNInfo *getNextValue(SlotIndex def, MachineInstr *CopyMI,
|
||||
|
@ -434,7 +434,7 @@ bool InlineSpiller::hoistSpill(LiveInterval &SpillLI, MachineInstr *CopyMI) {
|
||||
SlotIndex Idx = LIS.getInstructionIndex(CopyMI);
|
||||
VNInfo *VNI = SpillLI.getVNInfoAt(Idx.getDefIndex());
|
||||
assert(VNI && VNI->def == Idx.getDefIndex() && "Not defined by copy");
|
||||
SibValueMap::const_iterator I = SibValues.find(VNI);
|
||||
SibValueMap::iterator I = SibValues.find(VNI);
|
||||
if (I == SibValues.end())
|
||||
return false;
|
||||
|
||||
@ -444,6 +444,20 @@ bool InlineSpiller::hoistSpill(LiveInterval &SpillLI, MachineInstr *CopyMI) {
|
||||
if (!SVI.AllDefsAreReloads && SVI.SpillVNI == VNI)
|
||||
return false;
|
||||
|
||||
// SpillReg may have been deleted by remat and DCE.
|
||||
if (!LIS.hasInterval(SVI.SpillReg)) {
|
||||
DEBUG(dbgs() << "Stale interval: " << PrintReg(SVI.SpillReg) << '\n');
|
||||
SibValues.erase(I);
|
||||
return false;
|
||||
}
|
||||
|
||||
LiveInterval &SibLI = LIS.getInterval(SVI.SpillReg);
|
||||
if (!SibLI.containsValue(SVI.SpillVNI)) {
|
||||
DEBUG(dbgs() << "Stale value: " << PrintReg(SVI.SpillReg) << '\n');
|
||||
SibValues.erase(I);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Conservatively extend the stack slot range to the range of the original
|
||||
// value. We may be able to do better with stack slot coloring by being more
|
||||
// careful here.
|
||||
@ -460,14 +474,16 @@ bool InlineSpiller::hoistSpill(LiveInterval &SpillLI, MachineInstr *CopyMI) {
|
||||
|
||||
// We are going to spill SVI.SpillVNI immediately after its def, so clear out
|
||||
// any later spills of the same value.
|
||||
eliminateRedundantSpills(LIS.getInterval(SVI.SpillReg), SVI.SpillVNI);
|
||||
eliminateRedundantSpills(SibLI, SVI.SpillVNI);
|
||||
|
||||
MachineBasicBlock *MBB = LIS.getMBBFromIndex(SVI.SpillVNI->def);
|
||||
MachineBasicBlock::iterator MII;
|
||||
if (SVI.SpillVNI->isPHIDef())
|
||||
MII = MBB->SkipPHIsAndLabels(MBB->begin());
|
||||
else {
|
||||
MII = LIS.getInstructionFromIndex(SVI.SpillVNI->def);
|
||||
MachineInstr *DefMI = LIS.getInstructionFromIndex(SVI.SpillVNI->def);
|
||||
assert(DefMI && "Defining instruction disappeared");
|
||||
MII = DefMI;
|
||||
++MII;
|
||||
}
|
||||
// Insert spill without kill flag immediately after def.
|
||||
@ -492,8 +508,8 @@ void InlineSpiller::eliminateRedundantSpills(LiveInterval &SLI, VNInfo *VNI) {
|
||||
LiveInterval *LI;
|
||||
tie(LI, VNI) = WorkList.pop_back_val();
|
||||
unsigned Reg = LI->reg;
|
||||
DEBUG(dbgs() << "Checking redundant spills for " << PrintReg(Reg) << ':'
|
||||
<< VNI->id << '@' << VNI->def << '\n');
|
||||
DEBUG(dbgs() << "Checking redundant spills for "
|
||||
<< VNI->id << '@' << VNI->def << " in " << *LI << '\n');
|
||||
|
||||
// Regs to spill are taken care of.
|
||||
if (isRegToSpill(Reg))
|
||||
|
Loading…
x
Reference in New Issue
Block a user