diff options
author | Chen Li <meloli87@gmail.com> | 2015-10-28 05:15:51 +0000 |
---|---|---|
committer | Chen Li <meloli87@gmail.com> | 2015-10-28 05:15:51 +0000 |
commit | 8d23a9bbef04ce7c4c7f5abcee535d8de151be0e (patch) | |
tree | aeb94a23c376b7ecb4ce3324cb20da4a23a635a9 /llvm/lib/Transforms | |
parent | 07fe7a943fb217a35ae78cfa0807bda14e460025 (diff) | |
download | bcm5719-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.cpp | 71 |
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. |