summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
diff options
context:
space:
mode:
authorChen Li <meloli87@gmail.com>2015-10-28 05:15:51 +0000
committerChen Li <meloli87@gmail.com>2015-10-28 05:15:51 +0000
commit8d23a9bbef04ce7c4c7f5abcee535d8de151be0e (patch)
treeaeb94a23c376b7ecb4ce3324cb20da4a23a635a9 /llvm/lib/Transforms
parent07fe7a943fb217a35ae78cfa0807bda14e460025 (diff)
downloadbcm5719-llvm-8d23a9bbef04ce7c4c7f5abcee535d8de151be0e.tar.gz
bcm5719-llvm-8d23a9bbef04ce7c4c7f5abcee535d8de151be0e.zip
Revert r251492 "[IndVarSimplify] Rewrite loop exit values with their
initial values from loop preheader", because it broke some bots. llvm-svn: 251498
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r--llvm/lib/Transforms/Scalar/IndVarSimplify.cpp71
1 files changed, 0 insertions, 71 deletions
diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
index f3ffe36064c..3dd3cfd4187 100644
--- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
+++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
@@ -132,7 +132,6 @@ private:
bool canLoopBeDeleted(Loop *L, SmallVector<RewritePhi, 8> &RewritePhiSet);
void rewriteLoopExitValues(Loop *L, SCEVExpander &Rewriter);
- void rewriteFirstIterationLoopExitValues(Loop *L);
Value *linearFunctionTestReplace(Loop *L, const SCEV *BackedgeTakenCount,
PHINode *IndVar, SCEVExpander &Rewriter);
@@ -701,71 +700,6 @@ void IndVarSimplify::rewriteLoopExitValues(Loop *L, SCEVExpander &Rewriter) {
Rewriter.clearInsertPoint();
}
-//===---------------------------------------------------------------------===//
-// rewriteFirstIterationLoopExitValues: Rewrite loop exit values if we know
-// they will exit at the first iteration.
-//===---------------------------------------------------------------------===//
-
-/// Check to see if this loop has loop invariant conditions which lead to loop
-/// exits. If so, we know that if the exit path is taken, it is at the first
-/// loop iteration. This lets us predict exit values of PHI nodes that live in
-/// loop header.
-void IndVarSimplify::rewriteFirstIterationLoopExitValues(Loop *L) {
- // Verify the input to the pass is already in LCSSA form.
- assert(L->isLCSSAForm(*DT));
-
- SmallVector<BasicBlock *, 8> ExitBlocks;
- L->getUniqueExitBlocks(ExitBlocks);
-
- for (auto *ExitBB : ExitBlocks) {
- BasicBlock::iterator begin = ExitBB->begin();
- // If there are no more PHI nodes in this exit block, then no more
- // values defined inside the loop are used on this path.
- while (auto *PN = dyn_cast<PHINode>(begin++)) {
- for (unsigned IncomingValIdx = 0, e = PN->getNumIncomingValues();
- IncomingValIdx != e; ++IncomingValIdx) {
- auto *IncomingBB = PN->getIncomingBlock(IncomingValIdx);
- if (!L->contains(IncomingBB))
- continue;
-
- // Get condition that leads to the exit path.
- auto *TermInst = IncomingBB->getTerminator();
-
- Value *Cond = nullptr;
- if (auto *BI = dyn_cast<BranchInst>(TermInst)) {
- // Must be a conditional branch, otherwise the block
- // should not be in the loop.
- Cond = BI->getCondition();
- } else if (auto *SI = dyn_cast<SwitchInst>(TermInst))
- Cond = SI->getCondition();
-
- // All non-instructions are loop-invariant.
- if (isa<Instruction>(Cond) && !L->isLoopInvariant(Cond))
- continue;
-
- auto *ExitVal =
- dyn_cast<PHINode>(PN->getIncomingValue(IncomingValIdx));
-
- // Only deal with PHIs.
- if (!ExitVal)
- continue;
-
- // If ExitVal is a PHI on the loop header, then we know its
- // value along this exit because the exit can only be taken
- // on the first iteration.
- auto *LoopPreheader = L->getLoopPreheader();
- assert(LoopPreheader && "Invalid loop");
- if (ExitVal->getBasicBlockIndex(LoopPreheader) != -1) {
- assert(ExitVal->getParent() == L->getHeader() &&
- "ExitVal must be in loop header");
- PN->setIncomingValue(IncomingValIdx,
- ExitVal->getIncomingValueForBlock(LoopPreheader));
- }
- }
- }
- }
-}
-
/// Check whether it is possible to delete the loop after rewriting exit
/// value. If it is possible, ignore ReplaceExitValue and do rewriting
/// aggressively.
@@ -2239,11 +2173,6 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
// loop may be sunk below the loop to reduce register pressure.
sinkUnusedInvariants(L);
- // rewriteFirstIterationLoopExitValues does not rely on the computation of
- // trip count and therefore can further simplify exit values in addition to
- // rewriteLoopExitValues.
- rewriteFirstIterationLoopExitValues(L);
-
// Clean up dead instructions.
Changed |= DeleteDeadPHIs(L->getHeader(), TLI);
// Check a post-condition.
OpenPOWER on IntegriCloud