ConstantRange.cpp revision 96f9d7232c72867ee09641832d2db99f9166d6f0
1645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//===-- ConstantRange.cpp - ConstantRange implementation ------------------===//
2645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//
3645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// Represent a range of possible values that may occur when the program is run
4645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// for an integral value.  This keeps track of a lower and upper bound for the
5645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// constant, which MAY wrap around the end of the numeric range.  To do this, it
6645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// keeps track of a [lower, upper) bound, which specifies an interval just like
7645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// STL iterators.  When used with boolean values, the following are important
8645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// ranges (other integral ranges use min/max values for special range values):
9645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//
10645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//  [F, F) = {}     = Empty set
11645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//  [T, F) = {T}
12645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//  [F, T) = {F}
13645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//  [T, T) = {F, T} = Full set
14645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//
15645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//===----------------------------------------------------------------------===//
16645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
17645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner#include "llvm/Support/ConstantRange.h"
18645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner#include "llvm/Type.h"
19645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner#include "llvm/Instruction.h"
20645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner#include "llvm/ConstantHandling.h"
21645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
22645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// Initialize a full (the default) or empty set for the specified type.
23645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
24645e00d1497dec37da92b59b47d76c4f922e6abcChris LattnerConstantRange::ConstantRange(const Type *Ty, bool Full) {
25645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  assert(Ty->isIntegral() &&
26645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner         "Cannot make constant range of non-integral type!");
27645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  if (Full)
28645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    Lower = Upper = ConstantIntegral::getMaxValue(Ty);
29645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  else
30645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    Lower = Upper = ConstantIntegral::getMinValue(Ty);
31645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
32645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
33645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// Initialize a range of values explicitly... this will assert out if
34645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// Lower==Upper and Lower != Min or Max for its type (or if the two constants
35645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// have different types)
36645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
37645e00d1497dec37da92b59b47d76c4f922e6abcChris LattnerConstantRange::ConstantRange(ConstantIntegral *L,
38645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner                             ConstantIntegral *U) : Lower(L), Upper(U) {
39645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  assert(Lower->getType() == Upper->getType() &&
40645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner         "Incompatible types for ConstantRange!");
41645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
42645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  // Make sure that if L & U are equal that they are either Min or Max...
43645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  assert((L != U || (L == ConstantIntegral::getMaxValue(L->getType()) ||
44645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner                     L == ConstantIntegral::getMinValue(L->getType()))) &&
45645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner         "Lower == Upper, but they aren't min or max for type!");
46645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
47645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
48645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerstatic ConstantIntegral *Next(ConstantIntegral *CI) {
49645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  if (CI->getType() == Type::BoolTy)
50645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    return CI == ConstantBool::True ? ConstantBool::False : ConstantBool::True;
51645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
52645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  // Otherwise use operator+ in the ConstantHandling Library.
53645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  Constant *Result = *ConstantInt::get(CI->getType(), 1) + *CI;
54645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  assert(Result && "ConstantHandling not implemented for integral plus!?");
55645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  return cast<ConstantIntegral>(Result);
56645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
57645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
58645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// Initialize a set of values that all satisfy the condition with C.
59645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
60645e00d1497dec37da92b59b47d76c4f922e6abcChris LattnerConstantRange::ConstantRange(unsigned SetCCOpcode, ConstantIntegral *C) {
61645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  switch (SetCCOpcode) {
62645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  default: assert(0 && "Invalid SetCC opcode to ConstantRange ctor!");
63645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  case Instruction::SetEQ: Lower = C; Upper = Next(C); return;
64645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  case Instruction::SetNE: Upper = C; Lower = Next(C); return;
65645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  case Instruction::SetLT:
66645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    Lower = ConstantIntegral::getMinValue(C->getType());
67645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    Upper = C;
68645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    return;
69645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  case Instruction::SetGT:
70645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    Upper = ConstantIntegral::getMaxValue(C->getType());
71645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    Lower = Next(C);
72645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    return;
73645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  case Instruction::SetLE:
74645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    Lower = ConstantIntegral::getMinValue(C->getType());
75645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    Upper = Next(C);
76645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    return;
77645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  case Instruction::SetGE:
78645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    Upper = ConstantIntegral::getMaxValue(C->getType());
79645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    Lower = C;
80645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    return;
81645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  }
82645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
83645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
84645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// getType - Return the LLVM data type of this range.
85645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
86645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerconst Type *ConstantRange::getType() const { return Lower->getType(); }
87645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
88645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// isFullSet - Return true if this set contains all of the elements possible
89645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// for this data-type
90645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerbool ConstantRange::isFullSet() const {
91645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  return Lower == Upper && Lower == ConstantIntegral::getMaxValue(getType());
92645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
93645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
94645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// isEmptySet - Return true if this set contains no members.
95645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
96645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerbool ConstantRange::isEmptySet() const {
97645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  return Lower == Upper && Lower == ConstantIntegral::getMinValue(getType());
98645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
99645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
100645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// isWrappedSet - Return true if this set wraps around the top of the range,
101645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// for example: [100, 8)
102645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
103645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerbool ConstantRange::isWrappedSet() const {
104645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  return (*(Constant*)Lower > *(Constant*)Upper)->getValue();
105645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
106645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
107645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
108645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// getSingleElement - If this set contains a single element, return it,
109645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// otherwise return null.
110645e00d1497dec37da92b59b47d76c4f922e6abcChris LattnerConstantIntegral *ConstantRange::getSingleElement() const {
111645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  if (Upper == Next(Lower))  // Is it a single element range?
112645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    return Lower;
113645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  return 0;
114645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
115645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
116645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// getSetSize - Return the number of elements in this set.
117645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
118645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattneruint64_t ConstantRange::getSetSize() const {
119645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  if (isEmptySet()) return 0;
120645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  if (getType() == Type::BoolTy) {
121645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    if (Lower != Upper)  // One of T or F in the set...
122645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      return 1;
123645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    return 2;            // Must be full set...
124645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  }
125645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
126645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  // Simply subtract the bounds...
127645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  Constant *Result = *(Constant*)Upper - *(Constant*)Lower;
128645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  assert(Result && "Subtraction of constant integers not implemented?");
129645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  if (getType()->isSigned())
130645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    return (uint64_t)cast<ConstantSInt>(Result)->getValue();
131645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  else
132645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    return cast<ConstantUInt>(Result)->getValue();
133645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
134645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
135645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
136645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
137645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
138645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// intersect1Wrapped - This helper function is used to intersect two ranges when
139645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// it is known that LHS is wrapped and RHS isn't.
140645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//
141645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerstatic ConstantRange intersect1Wrapped(const ConstantRange &LHS,
142645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner                                       const ConstantRange &RHS) {
143645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  assert(LHS.isWrappedSet() && !RHS.isWrappedSet());
144645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
145645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  // Handle common special cases
146645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  if (RHS.isEmptySet()) return RHS;
147645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  if (RHS.isFullSet()) return LHS;
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
181645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
182645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// intersect - Return the range that results from the intersection of this
183645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// range with another range.
184645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
185645e00d1497dec37da92b59b47d76c4f922e6abcChris LattnerConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const {
186645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  assert(getType() == CR.getType() && "ConstantRange types don't agree!");
187645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
188645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  if (!isWrappedSet()) {
189645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    if (!CR.isWrappedSet()) {
190645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      const Constant &L = std::max(*(Constant*)Lower, *(Constant*)CR.Lower);
191645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      const Constant &U = std::min(*(Constant*)Upper, *(Constant*)CR.Upper);
192645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
193645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      if ((L < U)->getValue())  // If range isn't empty...
194645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner        return ConstantRange(cast<ConstantIntegral>((Constant*)&L),
195645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner                             cast<ConstantIntegral>((Constant*)&U));
196645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      else
197645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner        return ConstantRange(getType(), false);  // Otherwise, return empty set
198645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    } else
199645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      return intersect1Wrapped(CR, *this);
200645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  } else {   // We know "this" is wrapped...
201645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    if (!CR.isWrappedSet())
202645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      return intersect1Wrapped(*this, CR);
203645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    else {
204645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      // Both ranges are wrapped...
205645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      const Constant &L = std::max(*(Constant*)Lower, *(Constant*)CR.Lower);
206645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      const Constant &U = std::min(*(Constant*)Upper, *(Constant*)CR.Upper);
207645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
208645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      return ConstantRange(cast<ConstantIntegral>((Constant*)&L),
209645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner                           cast<ConstantIntegral>((Constant*)&U));
210645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    }
211645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  }
212645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  return *this;
213645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
214645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
215645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// union - Return the range that results from the union of this range with
216645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// another range.  The resultant range is guaranteed to include the elements of
217645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// both sets, but may contain more.  For example, [3, 9) union [12,15) is [3,
218645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// 15), which includes 9, 10, and 11, which were not included in either set
219645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// before.
220645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
221645e00d1497dec37da92b59b47d76c4f922e6abcChris LattnerConstantRange ConstantRange::unionWith(const ConstantRange &CR) const {
222645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  assert(getType() == CR.getType() && "ConstantRange types don't agree!");
223645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
224645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  assert(0 && "Range union not implemented yet!");
225645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
226645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  return *this;
227645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
22896f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner
22996f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner/// print - Print out the bounds to a stream...
23096f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner///
23196f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattnervoid ConstantRange::print(std::ostream &OS) const {
23296f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner  OS << "[" << Lower << "," << Upper << " )";
23396f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner}
23496f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner
23596f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner/// dump - Allow printing from a debugger easily...
23696f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner///
23796f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattnervoid ConstantRange::dump() const {
23896f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner  print(std::cerr);
23996f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner}
240