OSDN Git Service

In rememberInstruction, if the value being remembered is the
authorDan Gohman <gohman@apple.com>
Sun, 14 Feb 2010 03:12:47 +0000 (03:12 +0000)
committerDan Gohman <gohman@apple.com>
Sun, 14 Feb 2010 03:12:47 +0000 (03:12 +0000)
current insertion point, advance the current insertion point.
This avoids a use-before-def situation in a testcase extracted
from clang which is difficult to reduce to a reasonable-sized
regression test.

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

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

index a9a70cb..303bc1e 100644 (file)
@@ -168,9 +168,7 @@ namespace llvm {
       return S->getValue();
     }
 
-    void rememberInstruction(Value *I) {
-      if (!PostIncLoop) InsertedValues.insert(I);
-    }
+    void rememberInstruction(Value *I);
 
     Value *expandAddRecExprLiterally(const SCEVAddRecExpr *);
     PHINode *getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
index 5de55fe..88c22b1 100644 (file)
@@ -1075,6 +1075,20 @@ Value *SCEVExpander::expand(const SCEV *S) {
   return V;
 }
 
+void SCEVExpander::rememberInstruction(Value *I) {
+  if (!PostIncLoop)
+    InsertedValues.insert(I);
+
+  // If we just claimed an existing instruction and that instruction had
+  // been the insert point, adjust the insert point forward so that 
+  // subsequently inserted code will be dominated.
+  if (Builder.GetInsertPoint() == I) {
+    BasicBlock::iterator It = cast<Instruction>(I);
+    do { ++It; } while (isInsertedInstruction(It));
+    Builder.SetInsertPoint(Builder.GetInsertBlock(), It);
+  }
+}
+
 /// getOrInsertCanonicalInductionVariable - This method returns the
 /// canonical induction variable of the specified type for the specified
 /// loop (inserting one if there is none).  A canonical induction variable