Skip to content

Commit

Permalink
Don't try to rotate a loop more than once - we never do this anyway.
Browse files Browse the repository at this point in the history
Summary:
I can't find a case where we can rotate a loop more than once, and it looks
like we never do this. To rotate a loop following conditions should be met:
1) its header should be exiting
2) its latch shouldn't be exiting

But after the first rotation the header becomes the new latch, so this
condition can never be true any longer.

Tested on with an assert on LNT testsuite and make check.

Reviewers: hfinkel, sanjoy

Subscribers: sebpop, sanjoy, llvm-commits, mzolotukhin

Differential Revision: http://reviews.llvm.org/D20181

llvm-svn: 272439
  • Loading branch information
Michael Zolotukhin committed Jun 10, 2016
1 parent e5d2d71 commit b98294d
Showing 1 changed file with 10 additions and 14 deletions.
24 changes: 10 additions & 14 deletions llvm/lib/Transforms/Scalar/LoopRotation.cpp
Expand Up @@ -569,12 +569,10 @@ static bool simplifyLoopLatch(Loop *L, LoopInfo *LI, DominatorTree *DT) {
return true;
}

/// Rotate \c L as many times as possible. Return true if the loop is rotated
/// at least once.
static bool iterativelyRotateLoop(Loop *L, unsigned MaxHeaderSize, LoopInfo *LI,
const TargetTransformInfo *TTI,
AssumptionCache *AC, DominatorTree *DT,
ScalarEvolution *SE) {
/// Rotate \c L, and return true if any modification was made.
static bool processLoop(Loop *L, unsigned MaxHeaderSize, LoopInfo *LI,
const TargetTransformInfo *TTI, AssumptionCache *AC,
DominatorTree *DT, ScalarEvolution *SE) {
// Save the loop metadata.
MDNode *LoopMD = L->getLoopID();

Expand All @@ -583,12 +581,10 @@ static bool iterativelyRotateLoop(Loop *L, unsigned MaxHeaderSize, LoopInfo *LI,
// loop exit.
bool SimplifiedLatch = simplifyLoopLatch(L, LI, DT);

// One loop can be rotated multiple times.
bool MadeChange = false;
while (rotateLoop(L, MaxHeaderSize, LI, TTI, AC, DT, SE, SimplifiedLatch)) {
MadeChange = true;
SimplifiedLatch = false;
}
bool MadeChange =
rotateLoop(L, MaxHeaderSize, LI, TTI, AC, DT, SE, SimplifiedLatch);
assert((!MadeChange || L->isLoopExiting(L->getLoopLatch())) &&
"Loop latch should be exiting after loop-rotate.");

// Restore the loop metadata.
// NB! We presume LoopRotation DOESN'T ADD its own metadata.
Expand All @@ -613,7 +609,7 @@ PreservedAnalyses LoopRotatePass::run(Loop &L, AnalysisManager<Loop> &AM) {
auto *DT = FAM.getCachedResult<DominatorTreeAnalysis>(*F);
auto *SE = FAM.getCachedResult<ScalarEvolutionAnalysis>(*F);

bool Changed = iterativelyRotateLoop(&L, MaxHeaderSize, LI, TTI, AC, DT, SE);
bool Changed = processLoop(&L, MaxHeaderSize, LI, TTI, AC, DT, SE);
if (!Changed)
return PreservedAnalyses::all();
return getLoopPassPreservedAnalyses();
Expand Down Expand Up @@ -654,7 +650,7 @@ class LoopRotateLegacyPass : public LoopPass {
auto *SEWP = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>();
auto *SE = SEWP ? &SEWP->getSE() : nullptr;

return iterativelyRotateLoop(L, MaxHeaderSize, LI, TTI, AC, DT, SE);
return processLoop(L, MaxHeaderSize, LI, TTI, AC, DT, SE);
}
};
}
Expand Down

0 comments on commit b98294d

Please sign in to comment.