diff options
| author | Max Kazantsev <max.kazantsev@azul.com> | 2018-09-06 05:52:47 +0000 |
|---|---|---|
| committer | Max Kazantsev <max.kazantsev@azul.com> | 2018-09-06 05:52:47 +0000 |
| commit | f90154069c908c628daf1b89d8fe6d96b11da688 (patch) | |
| tree | 9c2b7bae096b28a9a7602afacab9f77a9db9d677 /llvm/lib/Transforms | |
| parent | 51690c4f52a35e1008eaeb4e90a121fa3a6dc647 (diff) | |
| download | bcm5719-llvm-f90154069c908c628daf1b89d8fe6d96b11da688.tar.gz bcm5719-llvm-f90154069c908c628daf1b89d8fe6d96b11da688.zip | |
Revert "[IndVars] Turn isValidRewrite into an assertion" because it seems wrong
llvm-svn: 341517
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/IndVarSimplify.cpp | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp index e7578c58b66..06836360610 100644 --- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -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 @@ public: } // 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 |

