Teach indvars to generate nsw/nuw flags when widening an induction variable.
[oota-llvm.git] / lib / Analysis / ScalarEvolutionExpander.cpp
index fcd7ce272a221c9468cd199e7bb07899449ad45d..0dd1043b1926164bf5c46f4c07a5165098de529f 100644 (file)
@@ -1137,7 +1137,12 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
       IVIncInsertPos : Pred->getTerminator();
     Builder.SetInsertPoint(InsertPos);
     Value *IncV = expandIVInc(PN, StepV, L, ExpandTy, IntTy, useSubtract);
-
+    if (isa<OverflowingBinaryOperator>(IncV)) {
+      if (Normalized->getNoWrapFlags(SCEV::FlagNUW))
+        cast<BinaryOperator>(IncV)->setHasNoUnsignedWrap();
+      if (Normalized->getNoWrapFlags(SCEV::FlagNSW))
+        cast<BinaryOperator>(IncV)->setHasNoSignedWrap();
+    }
     PN->addIncoming(IncV, Pred);
   }