Skip to content

Commit

Permalink
Revert "[IndVars] Turn isValidRewrite into an assertion" because it s…
Browse files Browse the repository at this point in the history
…eems wrong

llvm-svn: 341517
Max Kazantsev committed Sep 6, 2018
1 parent 51690c4 commit f901540
Showing 1 changed file with 9 additions and 8 deletions.
17 changes: 9 additions & 8 deletions llvm/lib/Transforms/Scalar/IndVarSimplify.cpp
Original file line number Diff line number Diff line change
@@ -136,9 +136,7 @@ class IndVarSimplify {
SmallVector<WeakTrackingVH, 16> DeadInsts;
bool Changed = false;

#ifndef NDEBUG
bool isValidRewrite(Value *FromVal, Value *ToVal);
#endif

void handleFloatingPointIV(Loop *L, PHINode *PH);
void rewriteNonIntegerIVs(Loop *L);
@@ -165,17 +163,18 @@ class IndVarSimplify {

} // end anonymous namespace

#ifndef NDEBUG
/// Return true if the SCEV expansion generated by the rewriter can replace the
/// original value. SCEV guarantees that it produces the same value, but the way
/// it is produced may be illegal IR.
/// it is produced may be illegal IR. Ideally, this function will only be
/// called for verification.
bool IndVarSimplify::isValidRewrite(Value *FromVal, Value *ToVal) {
// If an SCEV expression subsumed multiple pointers, its expansion could
// reassociate the GEP changing the base pointer. This is illegal because the
// final address produced by a GEP chain must be inbounds relative to its
// underlying object. Otherwise basic alias analysis, among other things,
// could fail in a dangerous way. Specifically, we want to make sure that SCEV
// does not convert gep Base, (&p[n] - &p[0]) into gep &p[n], Base - &p[0].
// could fail in a dangerous way. Ultimately, SCEV will be improved to avoid
// producing an expression involving multiple pointers. Until then, we must
// bail out here.
//
// Retrieve the pointer operand of the GEP. Don't use GetUnderlyingObject
// because it understands lcssa phis while SCEV does not.
@@ -215,7 +214,6 @@ bool IndVarSimplify::isValidRewrite(Value *FromVal, Value *ToVal) {
}
return true;
}
#endif

/// Determine the insertion point for this user. By default, insert immediately
/// before the user. SCEVExpander or LICM will hoist loop invariants out of the
@@ -642,7 +640,10 @@ void IndVarSimplify::rewriteLoopExitValues(Loop *L, SCEVExpander &Rewriter) {
<< '\n'
<< " LoopVal = " << *Inst << "\n");

assert(isValidRewrite(Inst, ExitVal) && "Must be!");
if (!isValidRewrite(Inst, ExitVal)) {
DeadInsts.push_back(ExitVal);
continue;
}

#ifndef NDEBUG
// If we reuse an instruction from a loop which is neither L nor one of

0 comments on commit f901540

Please sign in to comment.