mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 21:29:41 +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];
|
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
|
/// getNextValue - Create a new value number and return it. MIIdx specifies
|
||||||
/// the instruction that defines the value number.
|
/// the instruction that defines the value number.
|
||||||
VNInfo *getNextValue(SlotIndex def, MachineInstr *CopyMI,
|
VNInfo *getNextValue(SlotIndex def, MachineInstr *CopyMI,
|
||||||
|
@ -434,7 +434,7 @@ bool InlineSpiller::hoistSpill(LiveInterval &SpillLI, MachineInstr *CopyMI) {
|
|||||||
SlotIndex Idx = LIS.getInstructionIndex(CopyMI);
|
SlotIndex Idx = LIS.getInstructionIndex(CopyMI);
|
||||||
VNInfo *VNI = SpillLI.getVNInfoAt(Idx.getDefIndex());
|
VNInfo *VNI = SpillLI.getVNInfoAt(Idx.getDefIndex());
|
||||||
assert(VNI && VNI->def == Idx.getDefIndex() && "Not defined by copy");
|
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())
|
if (I == SibValues.end())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -444,6 +444,20 @@ bool InlineSpiller::hoistSpill(LiveInterval &SpillLI, MachineInstr *CopyMI) {
|
|||||||
if (!SVI.AllDefsAreReloads && SVI.SpillVNI == VNI)
|
if (!SVI.AllDefsAreReloads && SVI.SpillVNI == VNI)
|
||||||
return false;
|
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
|
// 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
|
// value. We may be able to do better with stack slot coloring by being more
|
||||||
// careful here.
|
// 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
|
// We are going to spill SVI.SpillVNI immediately after its def, so clear out
|
||||||
// any later spills of the same value.
|
// 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 *MBB = LIS.getMBBFromIndex(SVI.SpillVNI->def);
|
||||||
MachineBasicBlock::iterator MII;
|
MachineBasicBlock::iterator MII;
|
||||||
if (SVI.SpillVNI->isPHIDef())
|
if (SVI.SpillVNI->isPHIDef())
|
||||||
MII = MBB->SkipPHIsAndLabels(MBB->begin());
|
MII = MBB->SkipPHIsAndLabels(MBB->begin());
|
||||||
else {
|
else {
|
||||||
MII = LIS.getInstructionFromIndex(SVI.SpillVNI->def);
|
MachineInstr *DefMI = LIS.getInstructionFromIndex(SVI.SpillVNI->def);
|
||||||
|
assert(DefMI && "Defining instruction disappeared");
|
||||||
|
MII = DefMI;
|
||||||
++MII;
|
++MII;
|
||||||
}
|
}
|
||||||
// Insert spill without kill flag immediately after def.
|
// Insert spill without kill flag immediately after def.
|
||||||
@ -492,8 +508,8 @@ void InlineSpiller::eliminateRedundantSpills(LiveInterval &SLI, VNInfo *VNI) {
|
|||||||
LiveInterval *LI;
|
LiveInterval *LI;
|
||||||
tie(LI, VNI) = WorkList.pop_back_val();
|
tie(LI, VNI) = WorkList.pop_back_val();
|
||||||
unsigned Reg = LI->reg;
|
unsigned Reg = LI->reg;
|
||||||
DEBUG(dbgs() << "Checking redundant spills for " << PrintReg(Reg) << ':'
|
DEBUG(dbgs() << "Checking redundant spills for "
|
||||||
<< VNI->id << '@' << VNI->def << '\n');
|
<< VNI->id << '@' << VNI->def << " in " << *LI << '\n');
|
||||||
|
|
||||||
// Regs to spill are taken care of.
|
// Regs to spill are taken care of.
|
||||||
if (isRegToSpill(Reg))
|
if (isRegToSpill(Reg))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user