summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/ScalarEvolution.cpp
diff options
context:
space:
mode:
authorJustin Lebar <jlebar@google.com>2018-06-11 18:57:42 +0000
committerJustin Lebar <jlebar@google.com>2018-06-11 18:57:42 +0000
commitaa4fec94d8a143c3487a45c2472a5d77325dd02c (patch)
tree5a34b1d192b2f9e1701cab9eb3c1baa87602f64b /llvm/lib/Analysis/ScalarEvolution.cpp
parent7b4656c1d378879c262958c2e88329da0c111b1b (diff)
downloadbcm5719-llvm-aa4fec94d8a143c3487a45c2472a5d77325dd02c.tar.gz
bcm5719-llvm-aa4fec94d8a143c3487a45c2472a5d77325dd02c.zip
[SCEV] Add nuw/nsw to mul ops in StrengthenNoWrapFlags where safe.
Summary: Previously we would add them for adds, but not multiplies. Reviewers: sanjoy Subscribers: llvm-commits, hiraditya Differential Revision: https://reviews.llvm.org/D48038 llvm-svn: 334428
Diffstat (limited to 'llvm/lib/Analysis/ScalarEvolution.cpp')
-rw-r--r--llvm/lib/Analysis/ScalarEvolution.cpp25
1 files changed, 19 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index a48b935f88a..dee35392692 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -2205,19 +2205,32 @@ StrengthenNoWrapFlags(ScalarEvolution *SE, SCEVTypes Type,
SignOrUnsignWrap = ScalarEvolution::maskFlags(Flags, SignOrUnsignMask);
- if (SignOrUnsignWrap != SignOrUnsignMask && Type == scAddExpr &&
- Ops.size() == 2 && isa<SCEVConstant>(Ops[0])) {
-
- // (A + C) --> (A + C)<nsw> if the addition does not sign overflow
- // (A + C) --> (A + C)<nuw> if the addition does not unsign overflow
+ if (SignOrUnsignWrap != SignOrUnsignMask &&
+ (Type == scAddExpr || Type == scMulExpr) && Ops.size() == 2 &&
+ isa<SCEVConstant>(Ops[0])) {
+
+ auto Opcode = [&] {
+ switch (Type) {
+ case scAddExpr:
+ return Instruction::Add;
+ case scMulExpr:
+ return Instruction::Mul;
+ default:
+ llvm_unreachable("Unexpected SCEV op.");
+ }
+ }();
const APInt &C = cast<SCEVConstant>(Ops[0])->getAPInt();
+
+ // (A <opcode> C) --> (A <opcode> C)<nsw> if the op doesn't sign overflow.
if (!(SignOrUnsignWrap & SCEV::FlagNSW)) {
auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
- Instruction::Add, C, OBO::NoSignedWrap);
+ Opcode, C, OBO::NoSignedWrap);
if (NSWRegion.contains(SE->getSignedRange(Ops[1])))
Flags = ScalarEvolution::setFlags(Flags, SCEV::FlagNSW);
}
+
+ // (A <opcode> C) --> (A <opcode> C)<nuw> if the op doesn't unsign overflow.
if (!(SignOrUnsignWrap & SCEV::FlagNUW)) {
auto NUWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
Instruction::Add, C, OBO::NoUnsignedWrap);
OpenPOWER on IntegriCloud