forked from OSchip/llvm-project
Update various Loop optimization passes to cope with the possibility that
LoopSimplify form may not be available. llvm-svn: 86175
This commit is contained in:
parent
87869bc435
commit
a83ac2d9e7
|
@ -75,6 +75,10 @@ bool LoopExtractor::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||
if (L->getParentLoop())
|
||||
return false;
|
||||
|
||||
// If LoopSimplify form is not available, stay out of trouble.
|
||||
if (!L->isLoopSimplifyForm())
|
||||
return false;
|
||||
|
||||
DominatorTree &DT = getAnalysis<DominatorTree>();
|
||||
bool Changed = false;
|
||||
|
||||
|
|
|
@ -536,8 +536,10 @@ void IndVarSimplify::SinkUnusedInvariants(Loop *L) {
|
|||
BasicBlock *ExitBlock = L->getExitBlock();
|
||||
if (!ExitBlock) return;
|
||||
|
||||
Instruction *InsertPt = ExitBlock->getFirstNonPHI();
|
||||
BasicBlock *Preheader = L->getLoopPreheader();
|
||||
if (!Preheader) return;
|
||||
|
||||
Instruction *InsertPt = ExitBlock->getFirstNonPHI();
|
||||
BasicBlock::iterator I = Preheader->getTerminator();
|
||||
while (I != Preheader->begin()) {
|
||||
--I;
|
||||
|
|
|
@ -263,7 +263,6 @@ bool LICM::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||
|
||||
// Get the preheader block to move instructions into...
|
||||
Preheader = L->getLoopPreheader();
|
||||
assert(Preheader&&"Preheader insertion pass guarantees we have a preheader!");
|
||||
|
||||
// Loop over the body of this loop, looking for calls, invokes, and stores.
|
||||
// Because subloops have already been incorporated into AST, we skip blocks in
|
||||
|
@ -286,12 +285,14 @@ bool LICM::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||
// us to sink instructions in one pass, without iteration. After sinking
|
||||
// instructions, we perform another pass to hoist them out of the loop.
|
||||
//
|
||||
SinkRegion(DT->getNode(L->getHeader()));
|
||||
HoistRegion(DT->getNode(L->getHeader()));
|
||||
if (L->hasDedicatedExits())
|
||||
SinkRegion(DT->getNode(L->getHeader()));
|
||||
if (Preheader)
|
||||
HoistRegion(DT->getNode(L->getHeader()));
|
||||
|
||||
// Now that all loop invariants have been removed from the loop, promote any
|
||||
// memory references to scalars that we can...
|
||||
if (!DisablePromotion)
|
||||
if (!DisablePromotion && Preheader && L->hasDedicatedExits())
|
||||
PromoteValuesInLoop();
|
||||
|
||||
// Clear out loops state information for the next iteration
|
||||
|
|
|
@ -209,6 +209,10 @@ bool LoopIndexSplit::runOnLoop(Loop *IncomingLoop, LPPassManager &LPM_Ref) {
|
|||
L = IncomingLoop;
|
||||
LPM = &LPM_Ref;
|
||||
|
||||
// If LoopSimplify form is not available, stay out of trouble.
|
||||
if (!L->isLoopSimplifyForm())
|
||||
return false;
|
||||
|
||||
// FIXME - Nested loops make dominator info updates tricky.
|
||||
if (!L->getSubLoops().empty())
|
||||
return false;
|
||||
|
|
|
@ -104,17 +104,18 @@ bool LoopRotate::runOnLoop(Loop *Lp, LPPassManager &LPM) {
|
|||
bool LoopRotate::rotateLoop(Loop *Lp, LPPassManager &LPM) {
|
||||
L = Lp;
|
||||
|
||||
OrigHeader = L->getHeader();
|
||||
OrigPreHeader = L->getLoopPreheader();
|
||||
if (!OrigPreHeader) return false;
|
||||
|
||||
OrigLatch = L->getLoopLatch();
|
||||
if (!OrigLatch) return false;
|
||||
|
||||
OrigHeader = L->getHeader();
|
||||
|
||||
// If the loop has only one block then there is not much to rotate.
|
||||
if (L->getBlocks().size() == 1)
|
||||
return false;
|
||||
|
||||
assert(OrigHeader && OrigLatch && OrigPreHeader &&
|
||||
"Loop is not in canonical form");
|
||||
|
||||
// If the loop header is not one of the loop exiting blocks then
|
||||
// either this loop is already rotated or it is not
|
||||
// suitable for loop rotation transformations.
|
||||
|
|
|
@ -2528,6 +2528,10 @@ bool LoopStrengthReduce::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||
SE = &getAnalysis<ScalarEvolution>();
|
||||
Changed = false;
|
||||
|
||||
// If LoopSimplify form is not available, stay out of trouble.
|
||||
if (!L->getLoopPreheader() || !L->getLoopLatch())
|
||||
return false;
|
||||
|
||||
if (!IU->IVUsesByStride.empty()) {
|
||||
DEBUG(errs() << "\nLSR on \"" << L->getHeader()->getParent()->getName()
|
||||
<< "\" ";
|
||||
|
|
|
@ -407,6 +407,10 @@ bool LoopUnswitch::UnswitchIfProfitable(Value *LoopCond, Constant *Val){
|
|||
initLoopData();
|
||||
Function *F = loopHeader->getParent();
|
||||
|
||||
// If LoopSimplify was unable to form a preheader, don't do any unswitching.
|
||||
if (!loopPreheader)
|
||||
return false;
|
||||
|
||||
// If the condition is trivial, always unswitch. There is no code growth for
|
||||
// this case.
|
||||
if (!IsTrivialUnswitchCondition(LoopCond)) {
|
||||
|
|
Loading…
Reference in New Issue