instructions defined in CurBB may be intermediate nodes of the computation.
authorChris Lattner <sabre@nondot.org>
Wed, 9 Dec 2009 00:10:55 +0000 (00:10 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 9 Dec 2009 00:10:55 +0000 (00:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90908 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/PHITransAddr.h
lib/Analysis/PHITransAddr.cpp

index d090dc38f1d63882fa5df07a4c39d69b47d5b7d8..c88e4013aa156208f3b82e0f15891e3d50ed1723 100644 (file)
@@ -83,9 +83,9 @@ public:
   
   void dump() const;
   
-  /// Verify - Check internal consistency of this data structure.  Though it
-  /// claims to return a bool, it actually aborts on error and always returns
-  /// true.
+  /// Verify - Check internal consistency of this data structure.  If the
+  /// structure is valid, it returns true.  If invalid, it prints errors and
+  /// returns false.
   bool Verify() const;
 private:
   Value *PHITranslateSubExpr(Value *V, BasicBlock *CurBB, BasicBlock *PredBB);
index 187924f45a849356e5bd0ab439bcbb03f805538c..2dbdb1981a0097f8a7ef687d79a3e17a3069798b 100644 (file)
@@ -154,12 +154,20 @@ Value *PHITransAddr::PHITranslateSubExpr(Value *V, BasicBlock *CurBB,
   Instruction *Inst = dyn_cast<Instruction>(V);
   if (Inst == 0) return V;
   
-  // If 'Inst' is defined in this block, it must be an input that needs to be
-  // phi translated or an intermediate expression that needs to be incorporated
-  // into the expression.
-  if (Inst->getParent() == CurBB) {
-    assert(std::count(InstInputs.begin(), InstInputs.end(), Inst) &&
-           "Not an input?");
+  // Determine whether 'Inst' is an input to our PHI translatable expression.
+  bool isInput = std::count(InstInputs.begin(), InstInputs.end(), Inst);
+
+  // Handle inputs instructions if needed.
+  if (isInput) {
+    if (Inst->getParent() != CurBB) {
+      // If it is an input defined in a different block, then it remains an
+      // input.
+      return Inst;
+    }
+  
+    // If 'Inst' is defined in this block, it must be an input that needs to be
+    // phi translated or an intermediate expression that needs to be incorporated
+    // into the expression.
     
     // If this is a PHI, go ahead and translate it.
     if (PHINode *PN = dyn_cast<PHINode>(Inst))
@@ -179,14 +187,6 @@ Value *PHITransAddr::PHITranslateSubExpr(Value *V, BasicBlock *CurBB,
     for (unsigned i = 0, e = Inst->getNumOperands(); i != e; ++i)
       if (Instruction *Op = dyn_cast<Instruction>(Inst->getOperand(i)))
         InstInputs.push_back(Op);
-    
-  } else {
-    // Determine whether 'Inst' is an input to our PHI translatable expression.
-    bool isInput = std::count(InstInputs.begin(), InstInputs.end(), Inst);
-    
-    // If it is an input defined in a different block, then it remains an input.
-    if (isInput)
-      return Inst;
   }
 
   // Ok, it must be an intermediate result (either because it started that way