diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/IndVarSimplify.cpp | 9 | 
1 files changed, 7 insertions, 2 deletions
| diff --git a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp index 4f6dbd994e0..4cb2d0d1bf9 100644 --- a/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp +++ b/llvm/lib/Transforms/Scalar/IndVarSimplify.cpp @@ -36,6 +36,7 @@  #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h"  #include "llvm/Analysis/TargetLibraryInfo.h"  #include "llvm/Analysis/TargetTransformInfo.h" +#include "llvm/Analysis/ValueTracking.h"  #include "llvm/IR/BasicBlock.h"  #include "llvm/IR/CFG.h"  #include "llvm/IR/Constants.h" @@ -1281,7 +1282,8 @@ Instruction *WidenIV::widenIVUse(NarrowIVDefUse DU, SCEVExpander &Rewriter) {      }    }    // Our raison d'etre! Eliminate sign and zero extension. -  if (IsSigned ? isa<SExtInst>(DU.NarrowUse) : isa<ZExtInst>(DU.NarrowUse)) { +  if ((isa<SExtInst>(DU.NarrowUse) && (IsSigned || DU.NeverNegative)) || +      (isa<ZExtInst>(DU.NarrowUse) && (!IsSigned || DU.NeverNegative))) {      Value *NewDef = DU.WideDef;      if (DU.NarrowUse->getType() != WideType) {        unsigned CastWidth = SE->getTypeSizeInBits(DU.NarrowUse->getType()); @@ -1370,9 +1372,12 @@ Instruction *WidenIV::widenIVUse(NarrowIVDefUse DU, SCEVExpander &Rewriter) {  ///  void WidenIV::pushNarrowIVUsers(Instruction *NarrowDef, Instruction *WideDef) {    const SCEV *NarrowSCEV = SE->getSCEV(NarrowDef); +  // isKnownPredicate is enough for most cases but still need isKnownNonNegative  +  // here to work around conservatism in ScalarEvolution about no-wrap flags.     bool NeverNegative =        SE->isKnownPredicate(ICmpInst::ICMP_SGE, NarrowSCEV, -                           SE->getConstant(NarrowSCEV->getType(), 0)); +                           SE->getConstant(NarrowSCEV->getType(), 0)) || +      isKnownNonNegative(NarrowDef, NarrowDef->getModule()->getDataLayout());    for (User *U : NarrowDef->users()) {      Instruction *NarrowUser = cast<Instruction>(U); | 

