diff options
author | Tobias Grosser <tobias@grosser.es> | 2015-11-03 07:14:39 +0000 |
---|---|---|
committer | Tobias Grosser <tobias@grosser.es> | 2015-11-03 07:14:39 +0000 |
commit | 526d52691a5d20e428bdc828b682ba64bfd7f489 (patch) | |
tree | 98aab6becc4ee078ca663d1992c173cea2ec3ac2 /llvm/lib | |
parent | 991d499457f30f5bd3e7c3b26138ca4e7a9f1e48 (diff) | |
download | bcm5719-llvm-526d52691a5d20e428bdc828b682ba64bfd7f489.tar.gz bcm5719-llvm-526d52691a5d20e428bdc828b682ba64bfd7f489.zip |
Revert "[IndVarSimplify] Rewrite loop exit values with their initial values from loop preheader"
Commit 251839 triggers miscompiles on some bots:
http://lab.llvm.org:8011/builders/perf-x86_64-penryn-O3-polly-fast/builds/13723
(The commit is listed in 13722, but due to an existing failure introduced in
13721 and reverted in 13723 the failure is only visible in 13723)
To verify r251839 is indeed the only change that triggered the buildbot failures
and to ensure the buildbots remain green while investigating I temporarily
revert this commit. At the current state it is unclear if this commit introduced
some miscompile or if it only exposed code to Polly that is subsequently
miscompiled by Polly.
llvm-svn: 251901
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/Scalar/IndVarSimplify.cpp | 73 |
1 files changed, 0 insertions, 73 deletions
diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp index 5ce76c95832..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,73 +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(); - else - continue; - - // 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. @@ -2241,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. |