diff options
author | Max Kazantsev <max.kazantsev@azul.com> | 2018-09-10 06:32:00 +0000 |
---|---|---|
committer | Max Kazantsev <max.kazantsev@azul.com> | 2018-09-10 06:32:00 +0000 |
commit | 4d10ba37b93755fa7a843e24b92f9bfc5b1b805d (patch) | |
tree | c528f925b1ac26479e1328a696207e672f37e56e /llvm/lib/Transforms | |
parent | 09be521d4d3e18300b9ba751e9b7325ced54fdc2 (diff) | |
download | bcm5719-llvm-4d10ba37b93755fa7a843e24b92f9bfc5b1b805d.tar.gz bcm5719-llvm-4d10ba37b93755fa7a843e24b92f9bfc5b1b805d.zip |
[IndVars] Set Changed if sinkUnusedInvariants changes IR. PR38863
Currently, `sinkUnusedInvariants` does not set Changed flag even if it makes
changes in the IR. There is no clear evidence that it can cause a crash, but it
looks highly suspicious and likely invalid.
Differential Revision: https://reviews.llvm.org/D51777
Reviewed By: skatkov
llvm-svn: 341777
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/Scalar/IndVarSimplify.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp index 0b2583565f4..5d73723e0d6 100644 --- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -150,7 +150,7 @@ class IndVarSimplify { Value *linearFunctionTestReplace(Loop *L, const SCEV *BackedgeTakenCount, PHINode *IndVar, SCEVExpander &Rewriter); - void sinkUnusedInvariants(Loop *L); + bool sinkUnusedInvariants(Loop *L); public: IndVarSimplify(LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, @@ -2476,13 +2476,14 @@ linearFunctionTestReplace(Loop *L, /// If there's a single exit block, sink any loop-invariant values that /// were defined in the preheader but not used inside the loop into the /// exit block to reduce register pressure in the loop. -void IndVarSimplify::sinkUnusedInvariants(Loop *L) { +bool IndVarSimplify::sinkUnusedInvariants(Loop *L) { BasicBlock *ExitBlock = L->getExitBlock(); - if (!ExitBlock) return; + if (!ExitBlock) return false; BasicBlock *Preheader = L->getLoopPreheader(); - if (!Preheader) return; + if (!Preheader) return false; + bool MadeAnyChanges = false; BasicBlock::iterator InsertPt = ExitBlock->getFirstInsertionPt(); BasicBlock::iterator I(Preheader->getTerminator()); while (I != Preheader->begin()) { @@ -2552,10 +2553,13 @@ void IndVarSimplify::sinkUnusedInvariants(Loop *L) { Done = true; } + MadeAnyChanges = true; ToMove->moveBefore(*ExitBlock, InsertPt); if (Done) break; InsertPt = ToMove->getIterator(); } + + return MadeAnyChanges; } //===----------------------------------------------------------------------===// @@ -2649,7 +2653,7 @@ bool IndVarSimplify::run(Loop *L) { // Loop-invariant instructions in the preheader that aren't used in the // loop may be sunk below the loop to reduce register pressure. - sinkUnusedInvariants(L); + Changed |= sinkUnusedInvariants(L); // rewriteFirstIterationLoopExitValues does not rely on the computation of // trip count and therefore can further simplify exit values in addition to |