When we find a reaching definition, make sure it is visited from all paths by
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 5 Oct 2010 20:36:28 +0000 (20:36 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 5 Oct 2010 20:36:28 +0000 (20:36 +0000)
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

lib/CodeGen/SplitKit.cpp

index 062194586ffd02badb8a7dbd9a91eb3658ec89e4..cce97fdb67d9206bbce3a7e1e22c5f3569ad4a0e 100644 (file)
@@ -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.