mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-28 06:27:16 +00:00
Fix a latent bug that my spiller patch last week exposed: we were leaving
instructions in the virtregfolded map that were deleted. Because they were deleted, newly allocated instructions could end up at the same address, magically finding themselves in the map. The solution is to remove entries from the map when we delete the instructions. llvm-svn: 28041
This commit is contained in:
parent
a9f3c7c50a
commit
c2914c8ac5
@ -730,6 +730,7 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) {
|
||||
assert(VirtRegMap::isMod && "Can't be modref!");
|
||||
DEBUG(std::cerr << "Removed dead store:\t" << *MDSI->second);
|
||||
MBB.erase(MDSI->second);
|
||||
VRM.RemoveFromFoldedVirtMap(MDSI->second);
|
||||
MaybeDeadStores.erase(MDSI);
|
||||
++NumDSE;
|
||||
}
|
||||
@ -791,6 +792,7 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) {
|
||||
++NumDCE;
|
||||
DEBUG(std::cerr << "Removing now-noop copy: " << MI);
|
||||
MBB.erase(&MI);
|
||||
VRM.RemoveFromFoldedVirtMap(&MI);
|
||||
goto ProcessNextInst;
|
||||
}
|
||||
Spills.ClobberPhysReg(VirtReg);
|
||||
@ -825,6 +827,7 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) {
|
||||
++NumDCE;
|
||||
DEBUG(std::cerr << "Removing now-noop copy: " << MI);
|
||||
MBB.erase(&MI);
|
||||
VRM.RemoveFromFoldedVirtMap(&MI);
|
||||
goto ProcessNextInst;
|
||||
}
|
||||
}
|
||||
@ -835,6 +838,7 @@ void LocalSpiller::RewriteMBB(MachineBasicBlock &MBB, VirtRegMap &VRM) {
|
||||
DEBUG(std::cerr << "Removed dead store:\t" << *LastStore);
|
||||
++NumDSE;
|
||||
MBB.erase(LastStore);
|
||||
VRM.RemoveFromFoldedVirtMap(LastStore);
|
||||
}
|
||||
LastStore = next(MII);
|
||||
|
||||
|
@ -137,11 +137,10 @@ namespace llvm {
|
||||
return MI2VirtMap.equal_range(MI);
|
||||
}
|
||||
|
||||
/// RemoveFromFoldedVirtMap - Given a machine instruction in the folded
|
||||
/// instruction map, remove the entry in the folded instruction map.
|
||||
/// RemoveFromFoldedVirtMap - If the specified machine instruction is in
|
||||
/// the folded instruction map, remove its entry from the map.
|
||||
void RemoveFromFoldedVirtMap(MachineInstr *MI) {
|
||||
bool ErasedAny = MI2VirtMap.erase(MI);
|
||||
assert(ErasedAny && "Machine instr not in folded vreg map!");
|
||||
MI2VirtMap.erase(MI);
|
||||
}
|
||||
|
||||
void print(std::ostream &OS) const;
|
||||
|
Loading…
Reference in New Issue
Block a user