diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-10-05 20:36:28 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2010-10-05 20:36:28 +0000 |
commit | 984a7fc32ce2df9deb4bde8ddd086185b91bb358 (patch) | |
tree | 1441960ccefb7836383e7b6aa0b6c1bf106ead56 /lib/CodeGen/SplitKit.cpp | |
parent | fc60d7729bb5b63b7d61e370e51bd05e9a18b8bc (diff) |
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/SplitKit.cpp')
-rw-r--r-- | lib/CodeGen/SplitKit.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp index 062194586f..cce97fdb67 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. |