Skip to content

Commit

Permalink
[IndVars] Set Changed if rewriteFirstIterationLoopExitValues changes …
Browse files Browse the repository at this point in the history
…IR. PR38863

Currently, `rewriteFirstIterationLoopExitValues` 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/D51779
Reviewed By: skatkov

llvm-svn: 341779
  • Loading branch information
Max Kazantsev committed Sep 10, 2018
1 parent 4576a77 commit fde8857
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
Expand Up @@ -145,7 +145,7 @@ class IndVarSimplify {

bool canLoopBeDeleted(Loop *L, SmallVector<RewritePhi, 8> &RewritePhiSet);
void rewriteLoopExitValues(Loop *L, SCEVExpander &Rewriter);
void rewriteFirstIterationLoopExitValues(Loop *L);
bool rewriteFirstIterationLoopExitValues(Loop *L);

Value *linearFunctionTestReplace(Loop *L, const SCEV *BackedgeTakenCount,
PHINode *IndVar, SCEVExpander &Rewriter);
Expand Down Expand Up @@ -707,7 +707,7 @@ void IndVarSimplify::rewriteLoopExitValues(Loop *L, SCEVExpander &Rewriter) {
/// 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) {
bool IndVarSimplify::rewriteFirstIterationLoopExitValues(Loop *L) {
// Verify the input to the pass is already in LCSSA form.
assert(L->isLCSSAForm(*DT));

Expand All @@ -716,6 +716,7 @@ void IndVarSimplify::rewriteFirstIterationLoopExitValues(Loop *L) {
auto *LoopHeader = L->getHeader();
assert(LoopHeader && "Invalid loop");

bool MadeAnyChanges = false;
for (auto *ExitBB : ExitBlocks) {
// If there are no more PHI nodes in this exit block, then no more
// values defined inside the loop are used on this path.
Expand Down Expand Up @@ -762,12 +763,14 @@ void IndVarSimplify::rewriteFirstIterationLoopExitValues(Loop *L) {
if (PreheaderIdx != -1) {
assert(ExitVal->getParent() == LoopHeader &&
"ExitVal must be in loop header");
MadeAnyChanges = true;
PN.setIncomingValue(IncomingValIdx,
ExitVal->getIncomingValue(PreheaderIdx));
}
}
}
}
return MadeAnyChanges;
}

/// Check whether it is possible to delete the loop after rewriting exit
Expand Down Expand Up @@ -2658,7 +2661,7 @@ bool IndVarSimplify::run(Loop *L) {
// rewriteFirstIterationLoopExitValues does not rely on the computation of
// trip count and therefore can further simplify exit values in addition to
// rewriteLoopExitValues.
rewriteFirstIterationLoopExitValues(L);
Changed |= rewriteFirstIterationLoopExitValues(L);

// Clean up dead instructions.
Changed |= DeleteDeadPHIs(L->getHeader(), TLI);
Expand Down

0 comments on commit fde8857

Please sign in to comment.