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