Cleanup some from my DomSet-removal changes. Add a new
authorOwen Anderson <resistor@mac.com>
Mon, 9 Apr 2007 00:52:49 +0000 (00:52 +0000)
committerOwen Anderson <resistor@mac.com>
Mon, 9 Apr 2007 00:52:49 +0000 (00:52 +0000)
isReachableFromEntry
test to ETForest to factor a common test out of code.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35786 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/Dominators.h
lib/Transforms/Utils/LoopSimplify.cpp

index f6ac58a69f1d1d36e46c549f4855f94c1c90832d..b6453bae173de4e82c0e985e4ba10d5a3f27a02f 100644 (file)
@@ -27,6 +27,7 @@
 #define LLVM_ANALYSIS_DOMINATORS_H
 
 #include "llvm/Analysis/ET-Forest.h"
+#include "llvm/Function.h"
 #include "llvm/Pass.h"
 #include <set>
 
@@ -395,7 +396,7 @@ public:
     }
   }
 
-  // dominates - Return true if A dominates B. THis performs the
+  // dominates - Return true if A dominates B. This performs the
   // special checks necessary if A and B are in the same basic block.
   bool dominates(Instruction *A, Instruction *B);
 
@@ -405,6 +406,12 @@ public:
     return dominates(A, B) && A != B;
   }
 
+  /// isReachableFromEntry - Return true if A is dominated by the entry
+  /// block of the function containing it.
+  bool isReachableFromEntry(BasicBlock* A) {
+    return dominates(&A->getParent()->getEntryBlock(), A);
+  }
+  
   /// Return the nearest common dominator of A and B.
   BasicBlock *nearestCommonDominator(BasicBlock *A, BasicBlock *B) const  {
     ETNode *NodeA = getNode(A);
index 5319d18b1cae306bced0fd6b1871e3b7f8f1736c..ffdc91c37ab1469a24d90ab5fbbd71445fa50482 100644 (file)
@@ -312,6 +312,8 @@ BasicBlock *LoopSimplify::SplitBlockPredecessors(BasicBlock *BB,
       // Can we eliminate this phi node now?
       if (Value *V = PN->hasConstantValue(true)) {
         Instruction *I = dyn_cast<Instruction>(V);
+        // If I is in NewBB, the ETForest call will fail, because NewBB isn't
+        // registered in ETForest yet.  Handle this case explicitly.
         if (!I || (I->getParent() != NewBB &&
                    getAnalysis<ETForest>().dominates(I, PN))) {
           PN->replaceAllUsesWith(V);
@@ -701,15 +703,13 @@ void LoopSimplify::UpdateDomInfoForRevectoredPreds(BasicBlock *NewBB,
   {
     BasicBlock *OnePred = PredBlocks[0];
     unsigned i = 1, e = PredBlocks.size();
-    for (i = 1; !ETF.dominates(&OnePred->getParent()->getEntryBlock(), OnePred);
-         ++i) {
+    for (i = 1; !ETF.isReachableFromEntry(OnePred); ++i) {
       assert(i != e && "Didn't find reachable pred?");
       OnePred = PredBlocks[i];
     }
     
     for (; i != e; ++i)
-      if (PredBlocks[i] != OnePred &&
-          ETF.dominates(&PredBlocks[i]->getParent()->getEntryBlock(), OnePred)){
+      if (PredBlocks[i] != OnePred && ETF.isReachableFromEntry(OnePred)){
         NewBBDominatesNewBBSucc = false;
         break;
       }