ConstantRange.cpp revision b576c94c15af9a440f69d9d03c2afead7971118c
1645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//===-- ConstantRange.cpp - ConstantRange implementation ------------------===// 2b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under 6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 7b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// 10645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// Represent a range of possible values that may occur when the program is run 11645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// for an integral value. This keeps track of a lower and upper bound for the 12645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// constant, which MAY wrap around the end of the numeric range. To do this, it 13645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// keeps track of a [lower, upper) bound, which specifies an interval just like 14645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// STL iterators. When used with boolean values, the following are important 15645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// ranges (other integral ranges use min/max values for special range values): 16645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// 17645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// [F, F) = {} = Empty set 18645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// [T, F) = {T} 19645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// [F, T) = {F} 20645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// [T, T) = {F, T} = Full set 21645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// 22645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//===----------------------------------------------------------------------===// 23645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 24645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner#include "llvm/Support/ConstantRange.h" 25645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner#include "llvm/Type.h" 26645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner#include "llvm/Instruction.h" 27645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner#include "llvm/ConstantHandling.h" 28645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 29645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// Initialize a full (the default) or empty set for the specified type. 30645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// 31645e00d1497dec37da92b59b47d76c4f922e6abcChris LattnerConstantRange::ConstantRange(const Type *Ty, bool Full) { 32645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner assert(Ty->isIntegral() && 33645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner "Cannot make constant range of non-integral type!"); 34645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner if (Full) 35645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner Lower = Upper = ConstantIntegral::getMaxValue(Ty); 36645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner else 37645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner Lower = Upper = ConstantIntegral::getMinValue(Ty); 38645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner} 39645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 40645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// Initialize a range of values explicitly... this will assert out if 41645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// Lower==Upper and Lower != Min or Max for its type (or if the two constants 42645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// have different types) 43645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// 44645e00d1497dec37da92b59b47d76c4f922e6abcChris LattnerConstantRange::ConstantRange(ConstantIntegral *L, 45645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner ConstantIntegral *U) : Lower(L), Upper(U) { 46645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner assert(Lower->getType() == Upper->getType() && 47645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner "Incompatible types for ConstantRange!"); 48645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 49645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // Make sure that if L & U are equal that they are either Min or Max... 50645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner assert((L != U || (L == ConstantIntegral::getMaxValue(L->getType()) || 51645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner L == ConstantIntegral::getMinValue(L->getType()))) && 52645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner "Lower == Upper, but they aren't min or max for type!"); 53645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner} 54645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 55645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerstatic ConstantIntegral *Next(ConstantIntegral *CI) { 56645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner if (CI->getType() == Type::BoolTy) 57645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return CI == ConstantBool::True ? ConstantBool::False : ConstantBool::True; 58645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 59645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // Otherwise use operator+ in the ConstantHandling Library. 60645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner Constant *Result = *ConstantInt::get(CI->getType(), 1) + *CI; 61645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner assert(Result && "ConstantHandling not implemented for integral plus!?"); 62645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return cast<ConstantIntegral>(Result); 63645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner} 64645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 65645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// Initialize a set of values that all satisfy the condition with C. 66645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// 67645e00d1497dec37da92b59b47d76c4f922e6abcChris LattnerConstantRange::ConstantRange(unsigned SetCCOpcode, ConstantIntegral *C) { 68645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner switch (SetCCOpcode) { 69645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner default: assert(0 && "Invalid SetCC opcode to ConstantRange ctor!"); 70645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner case Instruction::SetEQ: Lower = C; Upper = Next(C); return; 71645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner case Instruction::SetNE: Upper = C; Lower = Next(C); return; 72645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner case Instruction::SetLT: 73645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner Lower = ConstantIntegral::getMinValue(C->getType()); 74645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner Upper = C; 75645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return; 76645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner case Instruction::SetGT: 77645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner Lower = Next(C); 7820d4129fefb07f6c5619045372ebe7a9f5c139e1Chris Lattner Upper = ConstantIntegral::getMinValue(C->getType()); // Min = Next(Max) 79645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return; 80645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner case Instruction::SetLE: 81645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner Lower = ConstantIntegral::getMinValue(C->getType()); 82645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner Upper = Next(C); 83645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return; 84645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner case Instruction::SetGE: 85645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner Lower = C; 8620d4129fefb07f6c5619045372ebe7a9f5c139e1Chris Lattner Upper = ConstantIntegral::getMinValue(C->getType()); // Min = Next(Max) 87645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return; 88645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner } 89645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner} 90645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 91645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// getType - Return the LLVM data type of this range. 92645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// 93645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerconst Type *ConstantRange::getType() const { return Lower->getType(); } 94645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 95645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// isFullSet - Return true if this set contains all of the elements possible 96645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// for this data-type 97645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerbool ConstantRange::isFullSet() const { 98645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return Lower == Upper && Lower == ConstantIntegral::getMaxValue(getType()); 99645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner} 100645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 101645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// isEmptySet - Return true if this set contains no members. 102645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// 103645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerbool ConstantRange::isEmptySet() const { 104645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return Lower == Upper && Lower == ConstantIntegral::getMinValue(getType()); 105645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner} 106645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 107645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// isWrappedSet - Return true if this set wraps around the top of the range, 108645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// for example: [100, 8) 109645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// 110645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerbool ConstantRange::isWrappedSet() const { 111645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return (*(Constant*)Lower > *(Constant*)Upper)->getValue(); 112645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner} 113645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 114645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 115645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// getSingleElement - If this set contains a single element, return it, 116645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// otherwise return null. 117645e00d1497dec37da92b59b47d76c4f922e6abcChris LattnerConstantIntegral *ConstantRange::getSingleElement() const { 118645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner if (Upper == Next(Lower)) // Is it a single element range? 119645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return Lower; 120645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return 0; 121645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner} 122645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 123645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// getSetSize - Return the number of elements in this set. 124645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// 125645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattneruint64_t ConstantRange::getSetSize() const { 126645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner if (isEmptySet()) return 0; 127645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner if (getType() == Type::BoolTy) { 128645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner if (Lower != Upper) // One of T or F in the set... 129645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return 1; 130645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return 2; // Must be full set... 131645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner } 132645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 133645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // Simply subtract the bounds... 134645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner Constant *Result = *(Constant*)Upper - *(Constant*)Lower; 135645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner assert(Result && "Subtraction of constant integers not implemented?"); 136c07736a397012499e337c994f7f952b07c709544Chris Lattner return cast<ConstantInt>(Result)->getRawValue(); 137645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner} 138645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 139645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 140645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 141645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 142645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// intersect1Wrapped - This helper function is used to intersect two ranges when 143645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// it is known that LHS is wrapped and RHS isn't. 144645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// 145645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerstatic ConstantRange intersect1Wrapped(const ConstantRange &LHS, 146645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner const ConstantRange &RHS) { 147645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner assert(LHS.isWrappedSet() && !RHS.isWrappedSet()); 148645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 149645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // Check to see if we overlap on the Left side of RHS... 150645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // 151645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner if ((*(Constant*)RHS.getLower() < *(Constant*)LHS.getUpper())->getValue()) { 152645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // We do overlap on the left side of RHS, see if we overlap on the right of 153645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // RHS... 154645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner if ((*(Constant*)RHS.getUpper() > *(Constant*)LHS.getLower())->getValue()) { 155645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // Ok, the result overlaps on both the left and right sides. See if the 156645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // resultant interval will be smaller if we wrap or not... 157645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // 158645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner if (LHS.getSetSize() < RHS.getSetSize()) 159645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return LHS; 160645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner else 161645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return RHS; 162645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 163645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner } else { 164645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // No overlap on the right, just on the left. 165645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return ConstantRange(RHS.getLower(), LHS.getUpper()); 166645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner } 167645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 168645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner } else { 169645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // We don't overlap on the left side of RHS, see if we overlap on the right 170645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // of RHS... 171645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner if ((*(Constant*)RHS.getUpper() > *(Constant*)LHS.getLower())->getValue()) { 172645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // Simple overlap... 173645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return ConstantRange(LHS.getLower(), RHS.getUpper()); 174645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner } else { 175645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // No overlap... 176645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return ConstantRange(LHS.getType(), false); 177645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner } 178645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner } 179645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner} 180645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 181d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattnerstatic ConstantIntegral *Min(ConstantIntegral *A, ConstantIntegral *B) { 182d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner if ((*(Constant*)A < *(Constant*)B)->getValue()) 183d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner return A; 184d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner return B; 185d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner} 186d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattnerstatic ConstantIntegral *Max(ConstantIntegral *A, ConstantIntegral *B) { 187d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner if ((*(Constant*)A > *(Constant*)B)->getValue()) 188d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner return A; 189d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner return B; 190d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner} 191d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner 192645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 193645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// intersect - Return the range that results from the intersection of this 194645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// range with another range. 195645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// 196645e00d1497dec37da92b59b47d76c4f922e6abcChris LattnerConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const { 197645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner assert(getType() == CR.getType() && "ConstantRange types don't agree!"); 198d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner // Handle common special cases 199d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner if (isEmptySet() || CR.isFullSet()) return *this; 200d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner if (isFullSet() || CR.isEmptySet()) return CR; 201645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 202645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner if (!isWrappedSet()) { 203645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner if (!CR.isWrappedSet()) { 204d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner ConstantIntegral *L = Max(Lower, CR.Lower); 205d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner ConstantIntegral *U = Min(Upper, CR.Upper); 206645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 207d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner if ((*L < *U)->getValue()) // If range isn't empty... 208d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner return ConstantRange(L, U); 209645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner else 210645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return ConstantRange(getType(), false); // Otherwise, return empty set 211645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner } else 212645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return intersect1Wrapped(CR, *this); 213645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner } else { // We know "this" is wrapped... 214645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner if (!CR.isWrappedSet()) 215645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return intersect1Wrapped(*this, CR); 216645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner else { 217645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner // Both ranges are wrapped... 218d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner ConstantIntegral *L = Max(Lower, CR.Lower); 219d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner ConstantIntegral *U = Min(Upper, CR.Upper); 220d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner return ConstantRange(L, U); 221645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner } 222645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner } 223645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return *this; 224645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner} 225645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 226645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// union - Return the range that results from the union of this range with 227645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// another range. The resultant range is guaranteed to include the elements of 228645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// both sets, but may contain more. For example, [3, 9) union [12,15) is [3, 229645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// 15), which includes 9, 10, and 11, which were not included in either set 230645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// before. 231645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// 232645e00d1497dec37da92b59b47d76c4f922e6abcChris LattnerConstantRange ConstantRange::unionWith(const ConstantRange &CR) const { 233645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner assert(getType() == CR.getType() && "ConstantRange types don't agree!"); 234645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 235645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner assert(0 && "Range union not implemented yet!"); 236645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner 237645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner return *this; 238645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner} 23996f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner 24096f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner/// print - Print out the bounds to a stream... 24196f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner/// 24296f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattnervoid ConstantRange::print(std::ostream &OS) const { 24396f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner OS << "[" << Lower << "," << Upper << " )"; 24496f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner} 24596f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner 24696f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner/// dump - Allow printing from a debugger easily... 24796f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner/// 24896f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattnervoid ConstantRange::dump() const { 24996f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner print(std::cerr); 25096f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner} 251