mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-09 01:38:03 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96203 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
751d5aa1ea
commit
4559855013
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user