When restoring a saved insert location, check to see if the saved

insert location has become an "inserted" instruction since the time
it was saved. If so, advance to the first non-"inserted" instruction.

llvm-svn: 96203
This commit is contained in:
Dan Gohman 2010-02-15 00:21:43 +00:00
parent 4ba99bee2a
commit 4d8feb11dd
2 changed files with 14 additions and 4 deletions

View File

@ -170,6 +170,8 @@ namespace llvm {
void rememberInstruction(Value *I);
void restoreInsertPoint(BasicBlock *BB, BasicBlock::iterator I);
Value *expandAddRecExprLiterally(const SCEVAddRecExpr *);
PHINode *getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
const Loop *L,

View File

@ -729,7 +729,7 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
// Restore the original insert point.
if (SaveInsertBB)
Builder.SetInsertPoint(SaveInsertBB, SaveInsertPt);
restoreInsertPoint(SaveInsertBB, SaveInsertPt);
// Remember this PHI, even in post-inc mode.
InsertedValues.insert(PN);
@ -845,7 +845,7 @@ Value *SCEVExpander::visitAddRecExpr(const SCEVAddRecExpr *S) {
while (isa<PHINode>(NewInsertPt)) ++NewInsertPt;
V = expandCodeFor(SE.getTruncateExpr(SE.getUnknown(V), Ty), 0,
NewInsertPt);
Builder.SetInsertPoint(SaveInsertBB, SaveInsertPt);
restoreInsertPoint(SaveInsertBB, SaveInsertPt);
return V;
}
@ -1071,7 +1071,7 @@ Value *SCEVExpander::expand(const SCEV *S) {
if (!PostIncLoop)
InsertedExpressions[std::make_pair(S, InsertPt)] = V;
Builder.SetInsertPoint(SaveInsertBB, SaveInsertPt);
restoreInsertPoint(SaveInsertBB, SaveInsertPt);
return V;
}
@ -1089,6 +1089,14 @@ void SCEVExpander::rememberInstruction(Value *I) {
}
}
void SCEVExpander::restoreInsertPoint(BasicBlock *BB, BasicBlock::iterator I) {
// If we aquired more instructions since the old insert point was saved,
// advance past them.
while (isInsertedInstruction(I)) ++I;
Builder.SetInsertPoint(BB, I);
}
/// 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
@ -1103,6 +1111,6 @@ SCEVExpander::getOrInsertCanonicalInductionVariable(const Loop *L,
BasicBlock::iterator SaveInsertPt = Builder.GetInsertPoint();
Value *V = expandCodeFor(H, 0, L->getHeader()->begin());
if (SaveInsertBB)
Builder.SetInsertPoint(SaveInsertBB, SaveInsertPt);
restoreInsertPoint(SaveInsertBB, SaveInsertPt);
return V;
}