|
|
|
|
@@ -177,8 +177,8 @@ Value *SCEVExpander::InsertBinop(Instruction::BinaryOps Opcode,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Save the original insertion point so we can restore it when we're done.
|
|
|
|
|
BasicBlock *SaveInsertBB = Builder.GetInsertBlock();
|
|
|
|
|
BasicBlock::iterator SaveInsertPt = Builder.GetInsertPoint();
|
|
|
|
|
DebugLoc Loc = Builder.GetInsertPoint()->getDebugLoc();
|
|
|
|
|
BuilderType::InsertPointGuard Guard(Builder);
|
|
|
|
|
|
|
|
|
|
// Move the insertion point out of as many loops as we can.
|
|
|
|
|
while (const Loop *L = SE.LI->getLoopFor(Builder.GetInsertBlock())) {
|
|
|
|
|
@@ -192,13 +192,9 @@ Value *SCEVExpander::InsertBinop(Instruction::BinaryOps Opcode,
|
|
|
|
|
|
|
|
|
|
// If we haven't found this binop, insert it.
|
|
|
|
|
Instruction *BO = cast<Instruction>(Builder.CreateBinOp(Opcode, LHS, RHS));
|
|
|
|
|
BO->setDebugLoc(SaveInsertPt->getDebugLoc());
|
|
|
|
|
BO->setDebugLoc(Loc);
|
|
|
|
|
rememberInstruction(BO);
|
|
|
|
|
|
|
|
|
|
// Restore the original insert point.
|
|
|
|
|
if (SaveInsertBB)
|
|
|
|
|
restoreInsertPoint(SaveInsertBB, SaveInsertPt);
|
|
|
|
|
|
|
|
|
|
return BO;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -553,8 +549,7 @@ Value *SCEVExpander::expandAddToGEP(const SCEV *const *op_begin,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Save the original insertion point so we can restore it when we're done.
|
|
|
|
|
BasicBlock *SaveInsertBB = Builder.GetInsertBlock();
|
|
|
|
|
BasicBlock::iterator SaveInsertPt = Builder.GetInsertPoint();
|
|
|
|
|
BuilderType::InsertPointGuard Guard(Builder);
|
|
|
|
|
|
|
|
|
|
// Move the insertion point out of as many loops as we can.
|
|
|
|
|
while (const Loop *L = SE.LI->getLoopFor(Builder.GetInsertBlock())) {
|
|
|
|
|
@@ -570,16 +565,11 @@ Value *SCEVExpander::expandAddToGEP(const SCEV *const *op_begin,
|
|
|
|
|
Value *GEP = Builder.CreateGEP(V, Idx, "uglygep");
|
|
|
|
|
rememberInstruction(GEP);
|
|
|
|
|
|
|
|
|
|
// Restore the original insert point.
|
|
|
|
|
if (SaveInsertBB)
|
|
|
|
|
restoreInsertPoint(SaveInsertBB, SaveInsertPt);
|
|
|
|
|
|
|
|
|
|
return GEP;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Save the original insertion point so we can restore it when we're done.
|
|
|
|
|
BasicBlock *SaveInsertBB = Builder.GetInsertBlock();
|
|
|
|
|
BasicBlock::iterator SaveInsertPt = Builder.GetInsertPoint();
|
|
|
|
|
BuilderType::InsertPointGuard Guard(Builder);
|
|
|
|
|
|
|
|
|
|
// Move the insertion point out of as many loops as we can.
|
|
|
|
|
while (const Loop *L = SE.LI->getLoopFor(Builder.GetInsertBlock())) {
|
|
|
|
|
@@ -614,10 +604,6 @@ Value *SCEVExpander::expandAddToGEP(const SCEV *const *op_begin,
|
|
|
|
|
Ops.push_back(SE.getUnknown(GEP));
|
|
|
|
|
rememberInstruction(GEP);
|
|
|
|
|
|
|
|
|
|
// Restore the original insert point.
|
|
|
|
|
if (SaveInsertBB)
|
|
|
|
|
restoreInsertPoint(SaveInsertBB, SaveInsertPt);
|
|
|
|
|
|
|
|
|
|
return expand(SE.getAddExpr(Ops));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1081,8 +1067,7 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Save the original insertion point so we can restore it when we're done.
|
|
|
|
|
BasicBlock *SaveInsertBB = Builder.GetInsertBlock();
|
|
|
|
|
BasicBlock::iterator SaveInsertPt = Builder.GetInsertPoint();
|
|
|
|
|
BuilderType::InsertPointGuard Guard(Builder);
|
|
|
|
|
|
|
|
|
|
// Another AddRec may need to be recursively expanded below. For example, if
|
|
|
|
|
// this AddRec is quadratic, the StepV may itself be an AddRec in this
|
|
|
|
|
@@ -1149,10 +1134,6 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
|
|
|
|
|
PN->addIncoming(IncV, Pred);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Restore the original insert point.
|
|
|
|
|
if (SaveInsertBB)
|
|
|
|
|
restoreInsertPoint(SaveInsertBB, SaveInsertPt);
|
|
|
|
|
|
|
|
|
|
// After expanding subexpressions, restore the PostIncLoops set so the caller
|
|
|
|
|
// can ensure that IVIncrement dominates the current uses.
|
|
|
|
|
PostIncLoops = SavedPostIncLoops;
|
|
|
|
|
@@ -1237,13 +1218,12 @@ Value *SCEVExpander::expandAddRecExprLiterally(const SCEVAddRecExpr *S) {
|
|
|
|
|
!ExpandTy->isPointerTy() && Step->isNonConstantNegative();
|
|
|
|
|
if (useSubtract)
|
|
|
|
|
Step = SE.getNegativeSCEV(Step);
|
|
|
|
|
// Expand the step somewhere that dominates the loop header.
|
|
|
|
|
BasicBlock *SaveInsertBB = Builder.GetInsertBlock();
|
|
|
|
|
BasicBlock::iterator SaveInsertPt = Builder.GetInsertPoint();
|
|
|
|
|
Value *StepV = expandCodeFor(Step, IntTy, L->getHeader()->begin());
|
|
|
|
|
// Restore the insertion point to the place where the caller has
|
|
|
|
|
// determined dominates all uses.
|
|
|
|
|
restoreInsertPoint(SaveInsertBB, SaveInsertPt);
|
|
|
|
|
Value *StepV;
|
|
|
|
|
{
|
|
|
|
|
// Expand the step somewhere that dominates the loop header.
|
|
|
|
|
BuilderType::InsertPointGuard Guard(Builder);
|
|
|
|
|
StepV = expandCodeFor(Step, IntTy, L->getHeader()->begin());
|
|
|
|
|
}
|
|
|
|
|
Result = expandIVInc(PN, StepV, L, ExpandTy, IntTy, useSubtract);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -1294,16 +1274,14 @@ Value *SCEVExpander::visitAddRecExpr(const SCEVAddRecExpr *S) {
|
|
|
|
|
NewOps[i] = SE.getAnyExtendExpr(S->op_begin()[i], CanonicalIV->getType());
|
|
|
|
|
Value *V = expand(SE.getAddRecExpr(NewOps, S->getLoop(),
|
|
|
|
|
S->getNoWrapFlags(SCEV::FlagNW)));
|
|
|
|
|
BasicBlock *SaveInsertBB = Builder.GetInsertBlock();
|
|
|
|
|
BasicBlock::iterator SaveInsertPt = Builder.GetInsertPoint();
|
|
|
|
|
BasicBlock::iterator NewInsertPt =
|
|
|
|
|
llvm::next(BasicBlock::iterator(cast<Instruction>(V)));
|
|
|
|
|
BuilderType::InsertPointGuard Guard(Builder);
|
|
|
|
|
while (isa<PHINode>(NewInsertPt) || isa<DbgInfoIntrinsic>(NewInsertPt) ||
|
|
|
|
|
isa<LandingPadInst>(NewInsertPt))
|
|
|
|
|
++NewInsertPt;
|
|
|
|
|
V = expandCodeFor(SE.getTruncateExpr(SE.getUnknown(V), Ty), 0,
|
|
|
|
|
NewInsertPt);
|
|
|
|
|
restoreInsertPoint(SaveInsertBB, SaveInsertPt);
|
|
|
|
|
return V;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1536,8 +1514,7 @@ Value *SCEVExpander::expand(const SCEV *S) {
|
|
|
|
|
if (I != InsertedExpressions.end())
|
|
|
|
|
return I->second;
|
|
|
|
|
|
|
|
|
|
BasicBlock *SaveInsertBB = Builder.GetInsertBlock();
|
|
|
|
|
BasicBlock::iterator SaveInsertPt = Builder.GetInsertPoint();
|
|
|
|
|
BuilderType::InsertPointGuard Guard(Builder);
|
|
|
|
|
Builder.SetInsertPoint(InsertPt->getParent(), InsertPt);
|
|
|
|
|
|
|
|
|
|
// Expand the expression into instructions.
|
|
|
|
|
@@ -1550,8 +1527,6 @@ Value *SCEVExpander::expand(const SCEV *S) {
|
|
|
|
|
// a postinc expansion, it could be reused by a non postinc user, but only if
|
|
|
|
|
// its insertion point was already at the head of the loop.
|
|
|
|
|
InsertedExpressions[std::make_pair(S, InsertPt)] = V;
|
|
|
|
|
|
|
|
|
|
restoreInsertPoint(SaveInsertBB, SaveInsertPt);
|
|
|
|
|
return V;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1562,10 +1537,6 @@ void SCEVExpander::rememberInstruction(Value *I) {
|
|
|
|
|
InsertedValues.insert(I);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SCEVExpander::restoreInsertPoint(BasicBlock *BB, BasicBlock::iterator 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
|
|
|
|
|
@@ -1581,11 +1552,8 @@ SCEVExpander::getOrInsertCanonicalInductionVariable(const Loop *L,
|
|
|
|
|
SE.getConstant(Ty, 1), L, SCEV::FlagAnyWrap);
|
|
|
|
|
|
|
|
|
|
// Emit code for it.
|
|
|
|
|
BasicBlock *SaveInsertBB = Builder.GetInsertBlock();
|
|
|
|
|
BasicBlock::iterator SaveInsertPt = Builder.GetInsertPoint();
|
|
|
|
|
BuilderType::InsertPointGuard Guard(Builder);
|
|
|
|
|
PHINode *V = cast<PHINode>(expandCodeFor(H, 0, L->getHeader()->begin()));
|
|
|
|
|
if (SaveInsertBB)
|
|
|
|
|
restoreInsertPoint(SaveInsertBB, SaveInsertPt);
|
|
|
|
|
|
|
|
|
|
return V;
|
|
|
|
|
}
|
|
|
|
|
|