Preserve HasNSW and HasNUW when constructing SCEVs for Add and Mul
instructions.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83606 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp
index 9300de1..bdf31f9 100644
--- a/lib/Analysis/ScalarEvolution.cpp
+++ b/lib/Analysis/ScalarEvolution.cpp
@@ -2951,12 +2951,20 @@
Operator *U = cast<Operator>(V);
switch (Opcode) {
- case Instruction::Add:
+ case Instruction::Add: {
+ AddOperator *A = cast<AddOperator>(U);
return getAddExpr(getSCEV(U->getOperand(0)),
- getSCEV(U->getOperand(1)));
- case Instruction::Mul:
+ getSCEV(U->getOperand(1)),
+ A->hasNoUnsignedWrap(),
+ A->hasNoSignedWrap());
+ }
+ case Instruction::Mul: {
+ MulOperator *M = cast<MulOperator>(U);
return getMulExpr(getSCEV(U->getOperand(0)),
- getSCEV(U->getOperand(1)));
+ getSCEV(U->getOperand(1)),
+ M->hasNoUnsignedWrap(),
+ M->hasNoSignedWrap());
+ }
case Instruction::UDiv:
return getUDivExpr(getSCEV(U->getOperand(0)),
getSCEV(U->getOperand(1)));