diff options
| author | Richard Trieu <rtrieu@google.com> | 2015-11-05 23:20:36 +0000 |
|---|---|---|
| committer | Richard Trieu <rtrieu@google.com> | 2015-11-05 23:20:36 +0000 |
| commit | f8978e1a74026ac986daf62cac98d0dd6ff11bab (patch) | |
| tree | 7d26478a36f9bdab4c77bfd71f161f032d655dba /llvm/lib | |
| parent | f2a37eeb8f43d1c39e0857198f7a6195d9fcc5d5 (diff) | |
| download | bcm5719-llvm-f8978e1a74026ac986daf62cac98d0dd6ff11bab.tar.gz bcm5719-llvm-f8978e1a74026ac986daf62cac98d0dd6ff11bab.zip | |
Revert r251050 to fix miscompile when running Clang -O1
See bug for details: https://llvm.org/bugs/show_bug.cgi?id=25421
Some comparisons were incorrectly replaced with a constant value.
llvm-svn: 252231
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Analysis/ScalarEvolution.cpp | 57 |
1 files changed, 1 insertions, 56 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 0d4a62c9d80..4652e449f4b 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -7348,60 +7348,6 @@ ScalarEvolution::isKnownPredicateWithRanges(ICmpInst::Predicate Pred, return false; } -bool ScalarEvolution::isKnownPredicateViaNoOverflow(ICmpInst::Predicate Pred, - const SCEV *LHS, - const SCEV *RHS) { - - // Match Result to (X + Y)<ExpectedFlags> where Y is a constant integer. - // Return Y via OutY. - auto MatchBinaryAddToConst = - [this](const SCEV *Result, const SCEV *X, APInt &OutY, - SCEV::NoWrapFlags ExpectedFlags) { - const SCEV *NonConstOp, *ConstOp; - SCEV::NoWrapFlags FlagsPresent; - - if (!splitBinaryAdd(Result, ConstOp, NonConstOp, FlagsPresent) || - !isa<SCEVConstant>(ConstOp) || NonConstOp != X) - return false; - - OutY = cast<SCEVConstant>(ConstOp)->getValue()->getValue(); - return (FlagsPresent & ExpectedFlags) == ExpectedFlags; - }; - - APInt C; - - switch (Pred) { - default: - break; - - case ICmpInst::ICMP_SGE: - std::swap(LHS, RHS); - case ICmpInst::ICMP_SLE: - // X s<= (X + C)<nsw> if C >= 0 - if (MatchBinaryAddToConst(RHS, LHS, C, SCEV::FlagNSW) && C.isNonNegative()) - return true; - - // (X + C)<nsw> s<= X if C <= 0 - if (MatchBinaryAddToConst(LHS, RHS, C, SCEV::FlagNSW) && - !C.isStrictlyPositive()) - return true; - - case ICmpInst::ICMP_SGT: - std::swap(LHS, RHS); - case ICmpInst::ICMP_SLT: - // X s< (X + C)<nsw> if C > 0 - if (MatchBinaryAddToConst(RHS, LHS, C, SCEV::FlagNSW) && - C.isStrictlyPositive()) - return true; - - // (X + C)<nsw> s< X if C < 0 - if (MatchBinaryAddToConst(LHS, RHS, C, SCEV::FlagNSW) && C.isNegative()) - return true; - } - - return false; -} - bool ScalarEvolution::isKnownPredicateViaSplitting(ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS) { @@ -8058,8 +8004,7 @@ ScalarEvolution::isImpliedCondOperandsHelper(ICmpInst::Predicate Pred, [this](ICmpInst::Predicate Pred, const SCEV *LHS, const SCEV *RHS) { return isKnownPredicateWithRanges(Pred, LHS, RHS) || IsKnownPredicateViaMinOrMax(*this, Pred, LHS, RHS) || - IsKnownPredicateViaAddRecStart(*this, Pred, LHS, RHS) || - isKnownPredicateViaNoOverflow(Pred, LHS, RHS); + IsKnownPredicateViaAddRecStart(*this, Pred, LHS, RHS); }; switch (Pred) { |

