OSDN Git Service

require that the branch being controlled by the IV
authorChris Lattner <sabre@nondot.org>
Sat, 3 Apr 2010 07:21:39 +0000 (07:21 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 3 Apr 2010 07:21:39 +0000 (07:21 +0000)
exits the loop.  With this information we can guarantee
the iteration count of the loop is bounded by the
compare.  I think this xforms is finally safe now.

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

lib/Transforms/Scalar/IndVarSimplify.cpp

index d32082e..6605666 100644 (file)
@@ -691,8 +691,15 @@ void IndVarSimplify::HandleFloatingPointIV(Loop *L, PHINode *PN) {
   
   BranchInst *TheBr = cast<BranchInst>(Compare->use_back());
 
-  // FIXME: Need to verify that the branch actually controls the iteration count
-  // of the loop.  If not, the new IV can overflow and noone will notice.
+  // We need to verify that the branch actually controls the iteration count
+  // of the loop.  If not, the new IV can overflow and no one will notice.
+  // The branch block must be in the loop and one of the successors must be out
+  // of the loop.
+  assert(TheBr->isConditional() && "Can't use fcmp if not conditional");
+  if (!L->contains(TheBr->getParent()) ||
+      (L->contains(TheBr->getSuccessor(0)) &&
+       L->contains(TheBr->getSuccessor(1))))
+    return;
   
   
   // If it isn't a comparison with an integer-as-fp (the exit value), we can't