aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2010-10-05 20:36:28 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2010-10-05 20:36:28 +0000
commit984a7fc32ce2df9deb4bde8ddd086185b91bb358 (patch)
tree1441960ccefb7836383e7b6aa0b6c1bf106ead56 /lib/CodeGen
parentfc60d7729bb5b63b7d61e370e51bd05e9a18b8bc (diff)
downloadexternal_llvm-984a7fc32ce2df9deb4bde8ddd086185b91bb358.zip
external_llvm-984a7fc32ce2df9deb4bde8ddd086185b91bb358.tar.gz
external_llvm-984a7fc32ce2df9deb4bde8ddd086185b91bb358.tar.bz2
When we find a reaching definition, make sure it is visited from all paths by
erasing it from the visited set. That ensures we create the right phi defs. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115666 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/SplitKit.cpp17
1 files changed, 12 insertions, 5 deletions
diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp
index 0621945..cce97fd 100644
--- a/lib/CodeGen/SplitKit.cpp
+++ b/lib/CodeGen/SplitKit.cpp
@@ -424,10 +424,14 @@ VNInfo *LiveIntervalMap::mapValue(const VNInfo *ParentVNI, SlotIndex Idx,
// This may change during the DFS as we create new phi-defs.
typedef DenseMap<MachineBasicBlock*, VNInfo*> MBBValueMap;
MBBValueMap DomValue;
-
- for (idf_iterator<MachineBasicBlock*>
- IDFI = idf_begin(IdxMBB),
- IDFE = idf_end(IdxMBB); IDFI != IDFE;) {
+ typedef SplitAnalysis::BlockPtrSet BlockPtrSet;
+ BlockPtrSet Visited;
+
+ // Iterate over IdxMBB predecessors in a depth-first order.
+ // Skip begin() since that is always IdxMBB.
+ for (idf_ext_iterator<MachineBasicBlock*, BlockPtrSet>
+ IDFI = llvm::next(idf_ext_begin(IdxMBB, Visited)),
+ IDFE = idf_ext_end(IdxMBB, Visited); IDFI != IDFE;) {
MachineBasicBlock *MBB = *IDFI;
SlotIndex End = lis_.getMBBEndIdx(MBB).getPrevSlot();
@@ -444,7 +448,10 @@ VNInfo *LiveIntervalMap::mapValue(const VNInfo *ParentVNI, SlotIndex Idx,
continue;
}
- // Yes, VNI dominates MBB. Track the path back to IdxMBB, creating phi-defs
+ // Yes, VNI dominates MBB. Make sure we visit MBB again from other paths.
+ Visited.erase(MBB);
+
+ // Track the path back to IdxMBB, creating phi-defs
// as needed along the way.
for (unsigned PI = IDFI.getPathLength()-1; PI != 0; --PI) {
// Start from MBB's immediate successor. End at IdxMBB.