diff options
| author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2018-06-19 04:09:44 +0000 |
|---|---|---|
| committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2018-06-19 04:09:44 +0000 |
| commit | 6e9b355cc9cd50da901a164f930fe1802b673969 (patch) | |
| tree | 3500a6dadf5427c1a12b15442ff97591bd7820e9 /llvm/lib/Analysis | |
| parent | 46c0b368d696744abdefeab23bb1f44179b8d2e4 (diff) | |
| download | bcm5719-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.cpp | 25 |
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); |

