ConstantRange.cpp revision bb626a6751db9a63d159d32522bdf88cedf46eeb
1645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//===-- ConstantRange.cpp - ConstantRange implementation ------------------===//
2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
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.
7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
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"
256f81b510217bd87f265cca054c5d9885250d8525Bill Wendling#include "llvm/Support/Streams.h"
266f81b510217bd87f265cca054c5d9885250d8525Bill Wendling#include <ostream>
272cdd21c2e4d855500dfb53f77aa74da53ccf9de6Chris Lattnerusing namespace llvm;
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
29645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// Initialize a full (the default) or empty set for the specified type.
30645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
31bb626a6751db9a63d159d32522bdf88cedf46eebReid SpencerConstantRange::ConstantRange(uint32_t BitWidth, bool Full) :
32bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer  Lower(BitWidth, 0), Upper(BitWidth, 0) {
33645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  if (Full)
34663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    Lower = Upper = APInt::getMaxValue(BitWidth);
35645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  else
36663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    Lower = Upper = APInt::getMinValue(BitWidth);
37645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
38645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
39fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// Initialize a range to hold the single specified value.
40fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner///
41dc5c1597014fa5c47c94db2b9fd424d2266053dbReid SpencerConstantRange::ConstantRange(const APInt & V) : Lower(V), Upper(V + 1) { }
42645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
43663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid SpencerConstantRange::ConstantRange(const APInt &L, const APInt &U) :
44663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  Lower(L), Upper(U) {
45663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  assert(L.getBitWidth() == U.getBitWidth() &&
46663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer         "ConstantRange with unequal bit widths");
47663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  uint32_t BitWidth = L.getBitWidth();
48663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  assert((L != U || (L == APInt::getMaxValue(BitWidth) ||
49663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer                     L == APInt::getMinValue(BitWidth))) &&
50663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer         "Lower == Upper, but they aren't min or max value!");
51663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer}
52663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer
53645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// isFullSet - Return true if this set contains all of the elements possible
54645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// for this data-type
55645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerbool ConstantRange::isFullSet() const {
56bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer  return Lower == Upper && Lower == APInt::getMaxValue(getBitWidth());
57645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
58fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
59645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// isEmptySet - Return true if this set contains no members.
60645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
61645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerbool ConstantRange::isEmptySet() const {
62bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer  return Lower == Upper && Lower == APInt::getMinValue(getBitWidth());
63645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
64645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
65645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// isWrappedSet - Return true if this set wraps around the top of the range,
66645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// for example: [100, 8)
67645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
68e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencerbool ConstantRange::isWrappedSet(bool isSigned) const {
69663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  if (isSigned)
70663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    return Lower.sgt(Upper);
71663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  return Lower.ugt(Upper);
72645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
73645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
74645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// getSetSize - Return the number of elements in this set.
75645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
76663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid SpencerAPInt ConstantRange::getSetSize() const {
77663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  if (isEmptySet())
78bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer    return APInt(getBitWidth(), 0);
79bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer  if (getBitWidth() == 1) {
80645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    if (Lower != Upper)  // One of T or F in the set...
81bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer      return APInt(2, 1);
82bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer    return APInt(2, 2);      // Must be full set...
83645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  }
84fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
85645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  // Simply subtract the bounds...
86663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  return Upper - Lower;
87645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
88645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
89fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// contains - Return true if the specified value is in the set.
90fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner///
91581b0d453a63f7f657248f80317976995262be11Reid Spencerbool ConstantRange::contains(const APInt &V, bool isSigned) const {
92fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner  if (Lower == Upper) {
93663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    if (isFullSet())
94663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer      return true;
95fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner    return false;
96fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner  }
97fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner
98e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer  if (!isWrappedSet(isSigned))
99663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    if (isSigned)
100663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer      return Lower.sle(V) && V.slt(Upper);
101663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    else
102663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer      return Lower.ule(V) && V.ult(Upper);
103663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  if (isSigned)
104663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    return Lower.sle(V) || V.slt(Upper);
105663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  else
106663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    return Lower.ule(V) || V.ult(Upper);
107fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner}
108645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
109fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// subtract - Subtract the specified constant from the endpoints of this
110fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// constant range.
111581b0d453a63f7f657248f80317976995262be11Reid SpencerConstantRange ConstantRange::subtract(const APInt &Val) const {
112bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer  assert(Val.getBitWidth() == getBitWidth() && "Wrong bit width");
113fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner  // If the set is empty or full, don't modify the endpoints.
114663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  if (Lower == Upper)
115663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    return *this;
116663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  return ConstantRange(Lower - Val, Upper - Val);
117fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner}
118fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner
119fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner
120645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// intersect1Wrapped - This helper function is used to intersect two ranges when
121645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner// it is known that LHS is wrapped and RHS isn't.
122645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//
123663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid SpencerConstantRange
124663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid SpencerConstantRange::intersect1Wrapped(const ConstantRange &LHS,
125663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer                                 const ConstantRange &RHS, bool isSigned) {
126e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer  assert(LHS.isWrappedSet(isSigned) && !RHS.isWrappedSet(isSigned));
127645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
128645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  // Check to see if we overlap on the Left side of RHS...
129645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  //
130663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  bool LT = (isSigned ? RHS.Lower.slt(LHS.Upper) : RHS.Lower.ult(LHS.Upper));
131663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  bool GT = (isSigned ? RHS.Upper.sgt(LHS.Lower) : RHS.Upper.ugt(LHS.Lower));
132663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  if (LT) {
133645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    // We do overlap on the left side of RHS, see if we overlap on the right of
134645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    // RHS...
135663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    if (GT) {
136645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      // Ok, the result overlaps on both the left and right sides.  See if the
137645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      // resultant interval will be smaller if we wrap or not...
138645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      //
139663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer      if (LHS.getSetSize().ult(RHS.getSetSize()))
140645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner        return LHS;
141645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      else
142645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner        return RHS;
143645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
144645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    } else {
145645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      // No overlap on the right, just on the left.
146dc5c1597014fa5c47c94db2b9fd424d2266053dbReid Spencer      return ConstantRange(RHS.Lower, LHS.Upper);
147645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    }
148645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  } else {
149645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    // We don't overlap on the left side of RHS, see if we overlap on the right
150645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    // of RHS...
151663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    if (GT) {
152645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      // Simple overlap...
153dc5c1597014fa5c47c94db2b9fd424d2266053dbReid Spencer      return ConstantRange(LHS.Lower, RHS.Upper);
154645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    } else {
155645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      // No overlap...
156bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer      return ConstantRange(LHS.getBitWidth(), false);
157645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    }
158645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  }
159645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
160645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
1613e051647c079fe29db049646b39611fc0135327dNick Lewycky/// intersectWith - Return the range that results from the intersection of this
162645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// range with another range.
163645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
164e4d87aa2de6e52952dca73716386db09aad5a8fdReid SpencerConstantRange ConstantRange::intersectWith(const ConstantRange &CR,
165e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer                                           bool isSigned) const {
166bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer  assert(getBitWidth() == CR.getBitWidth() &&
167bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer         "ConstantRange types don't agree!");
168d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner  // Handle common special cases
169663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  if (isEmptySet() || CR.isFullSet())
170663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    return *this;
171663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  if (isFullSet()  || CR.isEmptySet())
172663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    return CR;
173645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
174e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer  if (!isWrappedSet(isSigned)) {
175e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer    if (!CR.isWrappedSet(isSigned)) {
176663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer      using namespace APIntOps;
177663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer      APInt L = isSigned ? smax(Lower, CR.Lower) : umax(Lower, CR.Lower);
178663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer      APInt U = isSigned ? smin(Upper, CR.Upper) : umin(Upper, CR.Upper);
179645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
180663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer      if (isSigned ? L.slt(U) : L.ult(U)) // If range isn't empty...
181d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner        return ConstantRange(L, U);
182645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      else
183bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer        return ConstantRange(getBitWidth(), false);// Otherwise, empty set
184645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    } else
185e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer      return intersect1Wrapped(CR, *this, isSigned);
186645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  } else {   // We know "this" is wrapped...
187e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer    if (!CR.isWrappedSet(isSigned))
188e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer      return intersect1Wrapped(*this, CR, isSigned);
189645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    else {
190645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner      // Both ranges are wrapped...
191663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer      using namespace APIntOps;
192663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer      APInt L = isSigned ? smax(Lower, CR.Lower) : umax(Lower, CR.Lower);
193663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer      APInt U = isSigned ? smin(Upper, CR.Upper) : umin(Upper, CR.Upper);
194d122f4b648571867c0f8f72290b6c1a0aac02ebbChris Lattner      return ConstantRange(L, U);
195645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner    }
196645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  }
197645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  return *this;
198645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
199645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
2003e051647c079fe29db049646b39611fc0135327dNick Lewycky/// unionWith - Return the range that results from the union of this range with
201645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// another range.  The resultant range is guaranteed to include the elements of
202645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// both sets, but may contain more.  For example, [3, 9) union [12,15) is [3,
203645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// 15), which includes 9, 10, and 11, which were not included in either set
204645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// before.
205645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
206e4d87aa2de6e52952dca73716386db09aad5a8fdReid SpencerConstantRange ConstantRange::unionWith(const ConstantRange &CR,
207e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer                                       bool isSigned) const {
208bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer  assert(getBitWidth() == CR.getBitWidth() &&
209bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer         "ConstantRange types don't agree!");
210645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
211645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  assert(0 && "Range union not implemented yet!");
212645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
213645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  return *this;
214645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
21596f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner
216fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// zeroExtend - Return a new range in the specified integer type, which must
217fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// be strictly larger than the current type.  The returned range will
218e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer/// correspond to the possible range of values as if the source range had been
219fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// zero extended.
220bb626a6751db9a63d159d32522bdf88cedf46eebReid SpencerConstantRange ConstantRange::zeroExtend(uint32_t DstTySize) const {
221bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer  unsigned SrcTySize = getBitWidth();
222663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  assert(SrcTySize < DstTySize && "Not a value extension");
223dc5c1597014fa5c47c94db2b9fd424d2266053dbReid Spencer  if (isFullSet())
224fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner    // Change a source full set into [0, 1 << 8*numbytes)
225dc5c1597014fa5c47c94db2b9fd424d2266053dbReid Spencer    return ConstantRange(APInt(DstTySize,0), APInt(DstTySize,1).shl(SrcTySize));
226fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner
227663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  APInt L = Lower; L.zext(DstTySize);
228663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  APInt U = Upper; U.zext(DstTySize);
229663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  return ConstantRange(L, U);
230fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner}
231fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner
232fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// truncate - Return a new range in the specified integer type, which must be
233fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// strictly smaller than the current type.  The returned range will
234e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer/// correspond to the possible range of values as if the source range had been
235fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// truncated to the specified type.
236bb626a6751db9a63d159d32522bdf88cedf46eebReid SpencerConstantRange ConstantRange::truncate(uint32_t DstTySize) const {
237bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer  unsigned SrcTySize = getBitWidth();
238663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  assert(SrcTySize > DstTySize && "Not a value truncation");
239663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  APInt Size = APInt::getMaxValue(DstTySize).zext(SrcTySize);
240663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  if (isFullSet() || getSetSize().ugt(Size))
241bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer    return ConstantRange(DstTySize);
242fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner
243663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  APInt L = Lower; L.trunc(DstTySize);
244663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  APInt U = Upper; U.trunc(DstTySize);
245663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  return ConstantRange(L, U);
246fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner}
247fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner
24896f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner/// print - Print out the bounds to a stream...
24996f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner///
25096f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattnervoid ConstantRange::print(std::ostream &OS) const {
251663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  OS << "[" << Lower.toStringSigned(10) << ","
252663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer            << Upper.toStringSigned(10) << " )";
25396f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner}
25496f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner
25596f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner/// dump - Allow printing from a debugger easily...
25696f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner///
25796f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattnervoid ConstantRange::dump() const {
258e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling  print(cerr);
25996f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner}
260