From bf8c7f0adf90c8271c790be9922a2f97d19d4c01 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Sat, 11 Jul 2009 06:15:39 +0000 Subject: Move a method that creates constant ranges relative to another constant range per icmp predicate out of predsimplify and into ConstantRange. Add another utility method that determines whether one range is a subset of another. Combine with the former to determine whether icmp pred range, range is known to be true or not. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75357 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/PredicateSimplifier.cpp | 59 +++------------------------ 1 file changed, 5 insertions(+), 54 deletions(-) (limited to 'lib/Transforms/Scalar/PredicateSimplifier.cpp') diff --git a/lib/Transforms/Scalar/PredicateSimplifier.cpp b/lib/Transforms/Scalar/PredicateSimplifier.cpp index 24707bd..c82c4ff 100644 --- a/lib/Transforms/Scalar/PredicateSimplifier.cpp +++ b/lib/Transforms/Scalar/PredicateSimplifier.cpp @@ -990,7 +990,7 @@ namespace { assert(!CR.isEmptySet() && "Can't deal with empty set."); if (LV == NE) - return makeConstantRange(ICmpInst::ICMP_NE, CR); + return ConstantRange::makeICmpRegion(ICmpInst::ICMP_NE, CR); unsigned LV_s = LV & (SGT_BIT|SLT_BIT); unsigned LV_u = LV & (UGT_BIT|ULT_BIT); @@ -999,73 +999,24 @@ namespace { ConstantRange Range(CR.getBitWidth()); if (LV_s == SGT_BIT) { - Range = Range.maximalIntersectWith(makeConstantRange( + Range = Range.maximalIntersectWith(ConstantRange::makeICmpRegion( hasEQ ? ICmpInst::ICMP_SGE : ICmpInst::ICMP_SGT, CR)); } else if (LV_s == SLT_BIT) { - Range = Range.maximalIntersectWith(makeConstantRange( + Range = Range.maximalIntersectWith(ConstantRange::makeICmpRegion( hasEQ ? ICmpInst::ICMP_SLE : ICmpInst::ICMP_SLT, CR)); } if (LV_u == UGT_BIT) { - Range = Range.maximalIntersectWith(makeConstantRange( + Range = Range.maximalIntersectWith(ConstantRange::makeICmpRegion( hasEQ ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_UGT, CR)); } else if (LV_u == ULT_BIT) { - Range = Range.maximalIntersectWith(makeConstantRange( + Range = Range.maximalIntersectWith(ConstantRange::makeICmpRegion( hasEQ ? ICmpInst::ICMP_ULE : ICmpInst::ICMP_ULT, CR)); } return Range; } - /// makeConstantRange - Creates a ConstantRange representing the set of all - /// value that match the ICmpInst::Predicate with any of the values in CR. - ConstantRange makeConstantRange(ICmpInst::Predicate ICmpOpcode, - const ConstantRange &CR) { - uint32_t W = CR.getBitWidth(); - switch (ICmpOpcode) { - default: assert(!"Invalid ICmp opcode to makeConstantRange()"); - case ICmpInst::ICMP_EQ: - return ConstantRange(CR.getLower(), CR.getUpper()); - case ICmpInst::ICMP_NE: - if (CR.isSingleElement()) - return ConstantRange(CR.getUpper(), CR.getLower()); - return ConstantRange(W); - case ICmpInst::ICMP_ULT: - return ConstantRange(APInt::getMinValue(W), CR.getUnsignedMax()); - case ICmpInst::ICMP_SLT: - return ConstantRange(APInt::getSignedMinValue(W), CR.getSignedMax()); - case ICmpInst::ICMP_ULE: { - APInt UMax(CR.getUnsignedMax()); - if (UMax.isMaxValue()) - return ConstantRange(W); - return ConstantRange(APInt::getMinValue(W), UMax + 1); - } - case ICmpInst::ICMP_SLE: { - APInt SMax(CR.getSignedMax()); - if (SMax.isMaxSignedValue() || (SMax+1).isMaxSignedValue()) - return ConstantRange(W); - return ConstantRange(APInt::getSignedMinValue(W), SMax + 1); - } - case ICmpInst::ICMP_UGT: - return ConstantRange(CR.getUnsignedMin() + 1, APInt::getNullValue(W)); - case ICmpInst::ICMP_SGT: - return ConstantRange(CR.getSignedMin() + 1, - APInt::getSignedMinValue(W)); - case ICmpInst::ICMP_UGE: { - APInt UMin(CR.getUnsignedMin()); - if (UMin.isMinValue()) - return ConstantRange(W); - return ConstantRange(UMin, APInt::getNullValue(W)); - } - case ICmpInst::ICMP_SGE: { - APInt SMin(CR.getSignedMin()); - if (SMin.isMinSignedValue()) - return ConstantRange(W); - return ConstantRange(SMin, APInt::getSignedMinValue(W)); - } - } - } - #ifndef NDEBUG bool isCanonical(Value *V, DomTreeDFS::Node *Subtree) { return V == VN.canonicalize(V, Subtree); -- cgit v1.1