From 3400e6af6b10acea219c02ac262637220f84218f Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Sat, 10 Mar 2007 15:54:12 +0000 Subject: [PATCH] Add getter methods for the extremes of a ConstantRange. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35056 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/ConstantRange.h | 20 +++++++++ lib/Support/ConstantRange.cpp | 64 ++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/include/llvm/Support/ConstantRange.h b/include/llvm/Support/ConstantRange.h index 9da41ec3545..05859b41116 100644 --- a/include/llvm/Support/ConstantRange.h +++ b/include/llvm/Support/ConstantRange.h @@ -102,6 +102,26 @@ class ConstantRange { /// APInt getSetSize() const; + /// getUnsignedMax - Return the largest unsigned value contained in the + /// ConstantRange. + /// + APInt getUnsignedMax() const; + + /// getUnsignedMin - Return the smallest unsigned value contained in the + /// ConstantRange. + /// + APInt getUnsignedMin() const; + + /// getSignedMax - Return the largest signed value contained in the + /// ConstantRange. + /// + APInt getSignedMax() const; + + /// getSignedMin - Return the smallest signed value contained in the + /// ConstantRange. + /// + APInt getSignedMin() const; + /// operator== - Return true if this range is equal to another range. /// bool operator==(const ConstantRange &CR) const { diff --git a/lib/Support/ConstantRange.cpp b/lib/Support/ConstantRange.cpp index 410c351890c..becb8b61f78 100644 --- a/lib/Support/ConstantRange.cpp +++ b/lib/Support/ConstantRange.cpp @@ -84,6 +84,70 @@ APInt ConstantRange::getSetSize() const { return Upper - Lower; } +/// getUnsignedMax - Return the largest unsigned value contained in the +/// ConstantRange. +/// +APInt ConstantRange::getUnsignedMax() const { + if (isFullSet() || isWrappedSet()) + return APInt::getMaxValue(getBitWidth()); + else + return getUpper() - 1; +} + +/// getUnsignedMin - Return the smallest unsigned value contained in the +/// ConstantRange. +/// +APInt ConstantRange::getUnsignedMin() const { + if (isFullSet() || (isWrappedSet() && getUpper() != 0)) + return APInt::getMinValue(getBitWidth()); + else + return getLower(); +} + +/// getSignedMax - Return the largest signed value contained in the +/// ConstantRange. +/// +APInt ConstantRange::getSignedMax() const { + APInt SignedMax = APInt::getSignedMaxValue(getBitWidth()); + if (!isWrappedSet()) { + if (getLower().slt(getUpper() - 1)) + return getUpper() - 1; + else + return SignedMax; + } else { + if ((getUpper() - 1).slt(getLower())) { + if (getLower() != SignedMax) + return SignedMax; + else + return getUpper() - 1; + } else { + return getUpper() - 1; + } + } +} + +/// getSignedMin - Return the smallest signed value contained in the +/// ConstantRange. +/// +APInt ConstantRange::getSignedMin() const { + APInt SignedMin = APInt::getSignedMinValue(getBitWidth()); + if (!isWrappedSet()) { + if (getLower().slt(getUpper() - 1)) + return getLower(); + else + return SignedMin; + } else { + if ((getUpper() - 1).slt(getLower())) { + if (getUpper() != SignedMin) + return SignedMin; + else + return getLower(); + } else { + return getLower(); + } + } +} + /// contains - Return true if the specified value is in the set. /// bool ConstantRange::contains(const APInt &V) const { -- 2.34.1