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 | d122f4b648571867c0f8f72290b6c1a0aac02ebb (patch) | |
tree | 577f3c8122b637e148bdc057d0dd924add82c151 /support/lib/Support | |
parent | 62b14df410caf0a7f323f3d86658529ab62ab0ad (diff) | |
download | external_llvm-d122f4b648571867c0f8f72290b6c1a0aac02ebb.zip external_llvm-d122f4b648571867c0f8f72290b6c1a0aac02ebb.tar.gz external_llvm-d122f4b648571867c0f8f72290b6c1a0aac02ebb.tar.bz2 |
Fix bugs
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3569 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'support/lib/Support')
-rw-r--r-- | support/lib/Support/ConstantRange.cpp | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/support/lib/Support/ConstantRange.cpp b/support/lib/Support/ConstantRange.cpp index 1414b9b..bda4a83 100644 --- a/support/lib/Support/ConstantRange.cpp +++ b/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; |