In rememberInstruction, if the value being remembered is the

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.

llvm-svn: 96151
This commit is contained in:
Dan Gohman 2010-02-14 03:12:47 +00:00
parent 47756a8549
commit 4d5f3b74e4
2 changed files with 15 additions and 3 deletions

View 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,

View 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