diff options
author | Chris Lattner <sabre@nondot.org> | 2002-09-02 20:49:27 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-09-02 20:49:27 +0000 |
commit | 5d2bce8555214da237043688fb4670c8302098d9 (patch) | |
tree | 7a184a5a13c39b8ab8c60df075486be123b5c5bc /llvm/support/lib/Support/ConstantRange.cpp | |
parent | 99f48c614dfbe8b4ad45dbe7c7cff3923682a891 (diff) | |
download | bcm5719-llvm-5d2bce8555214da237043688fb4670c8302098d9.tar.gz bcm5719-llvm-5d2bce8555214da237043688fb4670c8302098d9.zip |
Fix bugs
llvm-svn: 3569
Diffstat (limited to 'llvm/support/lib/Support/ConstantRange.cpp')
-rw-r--r-- | llvm/support/lib/Support/ConstantRange.cpp | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/llvm/support/lib/Support/ConstantRange.cpp b/llvm/support/lib/Support/ConstantRange.cpp index 1414b9becac..bda4a83f159 100644 --- a/llvm/support/lib/Support/ConstantRange.cpp +++ b/llvm/support/lib/Support/ConstantRange.cpp @@ -142,10 +142,6 @@ static ConstantRange intersect1Wrapped(const ConstantRange &LHS, const ConstantRange &RHS) { assert(LHS.isWrappedSet() && !RHS.isWrappedSet()); - // Handle common special cases - if (RHS.isEmptySet()) return RHS; - if (RHS.isFullSet()) return LHS; - // Check to see if we overlap on the Left side of RHS... // if ((*(Constant*)RHS.getLower() < *(Constant*)LHS.getUpper())->getValue()) { @@ -178,21 +174,34 @@ static ConstantRange intersect1Wrapped(const ConstantRange &LHS, } } +static ConstantIntegral *Min(ConstantIntegral *A, ConstantIntegral *B) { + if ((*(Constant*)A < *(Constant*)B)->getValue()) + return A; + return B; +} +static ConstantIntegral *Max(ConstantIntegral *A, ConstantIntegral *B) { + if ((*(Constant*)A > *(Constant*)B)->getValue()) + return A; + return B; +} + /// intersect - Return the range that results from the intersection of this /// range with another range. /// ConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const { assert(getType() == CR.getType() && "ConstantRange types don't agree!"); + // Handle common special cases + if (isEmptySet() || CR.isFullSet()) return *this; + if (isFullSet() || CR.isEmptySet()) return CR; if (!isWrappedSet()) { if (!CR.isWrappedSet()) { - const Constant &L = std::max(*(Constant*)Lower, *(Constant*)CR.Lower); - const Constant &U = std::min(*(Constant*)Upper, *(Constant*)CR.Upper); + ConstantIntegral *L = Max(Lower, CR.Lower); + ConstantIntegral *U = Min(Upper, CR.Upper); - if ((L < U)->getValue()) // If range isn't empty... - return ConstantRange(cast<ConstantIntegral>((Constant*)&L), - cast<ConstantIntegral>((Constant*)&U)); + if ((*L < *U)->getValue()) // If range isn't empty... + return ConstantRange(L, U); else return ConstantRange(getType(), false); // Otherwise, return empty set } else @@ -202,11 +211,9 @@ ConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const { return intersect1Wrapped(*this, CR); else { // Both ranges are wrapped... - const Constant &L = std::max(*(Constant*)Lower, *(Constant*)CR.Lower); - const Constant &U = std::min(*(Constant*)Upper, *(Constant*)CR.Upper); - - return ConstantRange(cast<ConstantIntegral>((Constant*)&L), - cast<ConstantIntegral>((Constant*)&U)); + ConstantIntegral *L = Max(Lower, CR.Lower); + ConstantIntegral *U = Min(Upper, CR.Upper); + return ConstantRange(L, U); } } return *this; |