summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Analysis/InstructionSimplify.cpp
diff options
context:
space:
mode:
authorSanjay Patel <spatel@rotateright.com>2018-10-31 21:37:40 +0000
committerSanjay Patel <spatel@rotateright.com>2018-10-31 21:37:40 +0000
commit72fe03f93bd249ba3ab020e77860b771542f6c89 (patch)
treed5a07e3ac722b8163548602eee833f4645ce122d /llvm/lib/Analysis/InstructionSimplify.cpp
parentb262d1631ec5c0a85adbbe90ecb481e283364214 (diff)
downloadbcm5719-llvm-72fe03f93bd249ba3ab020e77860b771542f6c89.tar.gz
bcm5719-llvm-72fe03f93bd249ba3ab020e77860b771542f6c89.zip
revert rL345717 : [InstSimplify] fold icmp based on range of abs/nabs
This can miscompile as shown in PR39510: https://bugs.llvm.org/show_bug.cgi?id=39510 llvm-svn: 345780
Diffstat (limited to 'llvm/lib/Analysis/InstructionSimplify.cpp')
-rw-r--r--llvm/lib/Analysis/InstructionSimplify.cpp42
1 files changed, 0 insertions, 42 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 8571dc2cf2f..c4b076341fc 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -2996,45 +2996,6 @@ static Value *simplifyICmpWithBinOp(CmpInst::Predicate Pred, Value *LHS,
return nullptr;
}
-static Value *simplifyICmpWithAbsNabs(CmpInst::Predicate Pred, Value *Op0,
- Value *Op1) {
- // We need a comparison with a constant.
- const APInt *C;
- if (!match(Op1, m_APInt(C)))
- return nullptr;
-
- // matchSelectPattern returns the negation part of an abs pattern in SP1.
- // If the negate has an NSW flag, abs(INT_MIN) is undefined. Without that
- // constraint, we can't make a contiguous range for the result of abs.
- ICmpInst::Predicate AbsPred = ICmpInst::BAD_ICMP_PREDICATE;
- Value *SP0, *SP1;
- SelectPatternFlavor SPF = matchSelectPattern(Op0, SP0, SP1).Flavor;
- if (SPF == SelectPatternFlavor::SPF_ABS &&
- cast<Instruction>(SP1)->hasNoSignedWrap())
- // The result of abs(X) is >= 0 (with nsw).
- AbsPred = ICmpInst::ICMP_SGE;
- if (SPF == SelectPatternFlavor::SPF_NABS)
- // The result of -abs(X) is <= 0.
- AbsPred = ICmpInst::ICMP_SLE;
-
- if (AbsPred == ICmpInst::BAD_ICMP_PREDICATE)
- return nullptr;
-
- // Intersect the range of abs/nabs with the range of this icmp.
- // If there is no intersection, the icmp must be false.
- // If the intersection equals the range of abs/nabs, the icmp must be true.
- APInt Zero = APInt::getNullValue(C->getBitWidth());
- ConstantRange AbsRange = ConstantRange::makeExactICmpRegion(AbsPred, Zero);
- ConstantRange CmpRange = ConstantRange::makeExactICmpRegion(Pred, *C);
- ConstantRange Intersection = AbsRange.intersectWith(CmpRange);
- if (Intersection.isEmptySet())
- return getFalse(GetCompareTy(Op0));
- if (Intersection == AbsRange)
- return getTrue(GetCompareTy(Op0));
-
- return nullptr;
-}
-
/// Simplify integer comparisons where at least one operand of the compare
/// matches an integer min/max idiom.
static Value *simplifyICmpWithMinMax(CmpInst::Predicate Pred, Value *LHS,
@@ -3466,9 +3427,6 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
if (Value *V = simplifyICmpWithMinMax(Pred, LHS, RHS, Q, MaxRecurse))
return V;
- if (Value *V = simplifyICmpWithAbsNabs(Pred, LHS, RHS))
- return V;
-
// Simplify comparisons of related pointers using a powerful, recursive
// GEP-walk when we have target data available..
if (LHS->getType()->isPointerTy())
OpenPOWER on IntegriCloud