summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2018-06-19 04:09:44 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2018-06-19 04:09:44 +0000
commit6e9b355cc9cd50da901a164f930fe1802b673969 (patch)
tree3500a6dadf5427c1a12b15442ff97591bd7820e9 /llvm/lib/Analysis
parent46c0b368d696744abdefeab23bb1f44179b8d2e4 (diff)
downloadbcm5719-llvm-6e9b355cc9cd50da901a164f930fe1802b673969.tar.gz
bcm5719-llvm-6e9b355cc9cd50da901a164f930fe1802b673969.zip
Revert "[SCEV] Add nuw/nsw to mul ops in StrengthenNoWrapFlags"
This reverts r334428. It incorrectly marks some multiplications as nuw. Tim Shen is working on a proper fix. Original commit message: [SCEV] Add nuw/nsw to mul ops in StrengthenNoWrapFlags where safe. Summary: Previously we would add them for adds, but not multiplies. llvm-svn: 335016
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r--llvm/lib/Analysis/ScalarEvolution.cpp25
1 files changed, 6 insertions, 19 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index a2a2d8bbb95..705272cd73d 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -2233,32 +2233,19 @@ StrengthenNoWrapFlags(ScalarEvolution *SE, SCEVTypes Type,
SignOrUnsignWrap = ScalarEvolution::maskFlags(Flags, SignOrUnsignMask);
- 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.");
- }
- }();
+ if (SignOrUnsignWrap != SignOrUnsignMask && Type == scAddExpr &&
+ Ops.size() == 2 && isa<SCEVConstant>(Ops[0])) {
- const APInt &C = cast<SCEVConstant>(Ops[0])->getAPInt();
+ // (A + C) --> (A + C)<nsw> if the addition does not sign overflow
+ // (A + C) --> (A + C)<nuw> if the addition does not unsign overflow
- // (A <opcode> C) --> (A <opcode> C)<nsw> if the op doesn't sign overflow.
+ const APInt &C = cast<SCEVConstant>(Ops[0])->getAPInt();
if (!(SignOrUnsignWrap & SCEV::FlagNSW)) {
auto NSWRegion = ConstantRange::makeGuaranteedNoWrapRegion(
- Opcode, C, OBO::NoSignedWrap);
+ Instruction::Add, 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