summaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-05-01 22:03:24 +0000
committerChris Lattner <sabre@nondot.org>2006-05-01 22:03:24 +0000
commit229924a79f9a3b33b767527b9d4249e1133ceeda (patch)
treeb70a8ba15cc599b055f52a1bff91b4f6e3e285b5 /lib/CodeGen
parent8a18c13fa5d226e60a875eff5ae66cefe4093bc9 (diff)
downloadllvm-229924a79f9a3b33b767527b9d4249e1133ceeda.tar.gz
llvm-229924a79f9a3b33b767527b9d4249e1133ceeda.tar.bz2
llvm-229924a79f9a3b33b767527b9d4249e1133ceeda.tar.xz
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@28041 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/VirtRegMap.cpp4
-rw-r--r--lib/CodeGen/VirtRegMap.h7
2 files changed, 7 insertions, 4 deletions
diff --git a/lib/CodeGen/VirtRegMap.cpp b/lib/CodeGen/VirtRegMap.cpp
index fa5a6ac8e8..912359d137 100644
--- a/lib/CodeGen/VirtRegMap.cpp
+++ b/lib/CodeGen/VirtRegMap.cpp
@@ -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);
diff --git a/lib/CodeGen/VirtRegMap.h b/lib/CodeGen/VirtRegMap.h
index 898677e8f9..83d5aada47 100644
--- a/lib/CodeGen/VirtRegMap.h
+++ b/lib/CodeGen/VirtRegMap.h
@@ -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;