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