Set NSW/NUW flags on SCEVAddExpr when the operation is flagged as
authorAndrew Trick <atrick@apple.com>
Sat, 10 Sep 2011 01:09:50 +0000 (01:09 +0000)
committerAndrew Trick <atrick@apple.com>
Sat, 10 Sep 2011 01:09:50 +0000 (01:09 +0000)
such.

I'm doing this now for completeness because I can't think of/remember
any reason that it was left out. I'm not sure it will help anything,
but if we don't do it we need to explain why in comments.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139450 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ScalarEvolution.cpp

index 57c42656481086e8d9d652ac78abdb8b555ff890..b1662a026086e0d1bd9471fbadc22fe2a4a742af 100644 (file)
@@ -3546,7 +3546,13 @@ const SCEV *ScalarEvolution::createSCEV(Value *V) {
         AddOps.push_back(Op1);
     }
     AddOps.push_back(getSCEV(U->getOperand(0)));
-    return getAddExpr(AddOps);
+    SCEV::NoWrapFlags Flags = SCEV::FlagAnyWrap;
+    OverflowingBinaryOperator *OBO = cast<OverflowingBinaryOperator>(V);
+    if (OBO->hasNoSignedWrap())
+      setFlags(Flags, SCEV::FlagNSW);
+    if (OBO->hasNoUnsignedWrap())
+      setFlags(Flags, SCEV::FlagNUW);
+    return getAddExpr(AddOps, Flags);
   }
   case Instruction::Mul: {
     // See the Add code above.