1645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner//===-- ConstantRange.cpp - ConstantRange implementation ------------------===//
2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// 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
24f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/IR/Instruction.h"
250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/InstrTypes.h"
26f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/IR/Operator.h"
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/ConstantRange.h"
287fd5fb4b4755c3df86da5a0ebedf0d328fafbc81David Greene#include "llvm/Support/Debug.h"
29944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner#include "llvm/Support/raw_ostream.h"
302cdd21c2e4d855500dfb53f77aa74da53ccf9de6Chris Lattnerusing namespace llvm;
31d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
32645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// Initialize a full (the default) or empty set for the specified type.
33645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
3438b06447615440f935008a2141bd0a1fe078d437Dan GohmanConstantRange::ConstantRange(uint32_t BitWidth, bool Full) {
35645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  if (Full)
36663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    Lower = Upper = APInt::getMaxValue(BitWidth);
37645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  else
38663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    Lower = Upper = APInt::getMinValue(BitWidth);
39645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
40645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
41fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// Initialize a range to hold the single specified value.
42fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner///
43318b7cc7f10d41370929ff93274de29c11f87b81Benjamin KramerConstantRange::ConstantRange(APIntMoveTy V)
4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    : Lower(std::move(V)), Upper(Lower + 1) {}
45645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
46318b7cc7f10d41370929ff93274de29c11f87b81Benjamin KramerConstantRange::ConstantRange(APIntMoveTy L, APIntMoveTy U)
4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    : Lower(std::move(L)), Upper(std::move(U)) {
48318b7cc7f10d41370929ff93274de29c11f87b81Benjamin Kramer  assert(Lower.getBitWidth() == Upper.getBitWidth() &&
4938b06447615440f935008a2141bd0a1fe078d437Dan Gohman         "ConstantRange with unequal bit widths");
50318b7cc7f10d41370929ff93274de29c11f87b81Benjamin Kramer  assert((Lower != Upper || (Lower.isMaxValue() || Lower.isMinValue())) &&
51663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer         "Lower == Upper, but they aren't min or max value!");
52663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer}
53663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer
544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarConstantRange ConstantRange::makeAllowedICmpRegion(CmpInst::Predicate Pred,
554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                                   const ConstantRange &CR) {
56f2d7b7c879548090beae51b21c4b363da7dbbaadNick Lewycky  if (CR.isEmptySet())
57f2d7b7c879548090beae51b21c4b363da7dbbaadNick Lewycky    return CR;
58f2d7b7c879548090beae51b21c4b363da7dbbaadNick Lewycky
59bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky  uint32_t W = CR.getBitWidth();
60bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky  switch (Pred) {
614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  default:
624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    llvm_unreachable("Invalid ICmp predicate to makeAllowedICmpRegion()");
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case CmpInst::ICMP_EQ:
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return CR;
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case CmpInst::ICMP_NE:
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (CR.isSingleElement())
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return ConstantRange(CR.getUpper(), CR.getLower());
68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantRange(W);
69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case CmpInst::ICMP_ULT: {
70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    APInt UMax(CR.getUnsignedMax());
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (UMax.isMinValue())
72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return ConstantRange(W, /* empty */ false);
73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantRange(APInt::getMinValue(W), UMax);
74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case CmpInst::ICMP_SLT: {
76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    APInt SMax(CR.getSignedMax());
77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (SMax.isMinSignedValue())
78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return ConstantRange(W, /* empty */ false);
79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantRange(APInt::getSignedMinValue(W), SMax);
80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case CmpInst::ICMP_ULE: {
82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    APInt UMax(CR.getUnsignedMax());
83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (UMax.isMaxValue())
84bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky      return ConstantRange(W);
85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantRange(APInt::getMinValue(W), UMax + 1);
86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case CmpInst::ICMP_SLE: {
88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    APInt SMax(CR.getSignedMax());
89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (SMax.isMaxSignedValue())
90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return ConstantRange(W);
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantRange(APInt::getSignedMinValue(W), SMax + 1);
92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case CmpInst::ICMP_UGT: {
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    APInt UMin(CR.getUnsignedMin());
95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (UMin.isMaxValue())
96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return ConstantRange(W, /* empty */ false);
97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantRange(UMin + 1, APInt::getNullValue(W));
98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case CmpInst::ICMP_SGT: {
100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    APInt SMin(CR.getSignedMin());
101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (SMin.isMaxSignedValue())
102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return ConstantRange(W, /* empty */ false);
103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantRange(SMin + 1, APInt::getSignedMinValue(W));
104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case CmpInst::ICMP_UGE: {
106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    APInt UMin(CR.getUnsignedMin());
107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (UMin.isMinValue())
108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return ConstantRange(W);
109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantRange(UMin, APInt::getNullValue(W));
110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  case CmpInst::ICMP_SGE: {
112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    APInt SMin(CR.getSignedMin());
113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (SMin.isMinSignedValue())
114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return ConstantRange(W);
115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantRange(SMin, APInt::getSignedMinValue(W));
116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
117bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky  }
118bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky}
119bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky
1204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarConstantRange ConstantRange::makeSatisfyingICmpRegion(CmpInst::Predicate Pred,
1214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                                      const ConstantRange &CR) {
1224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // Follows from De-Morgan's laws:
1234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  //
1244c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // ~(~A union ~B) == A intersect B.
1254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  //
1264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return makeAllowedICmpRegion(CmpInst::getInversePredicate(Pred), CR)
1274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      .inverse();
1284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
1294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarConstantRange ConstantRange::makeExactICmpRegion(CmpInst::Predicate Pred,
131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                 const APInt &C) {
132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Computes the exact range that is equal to both the constant ranges returned
133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // by makeAllowedICmpRegion and makeSatisfyingICmpRegion. This is always true
134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // when RHS is a singleton such as an APInt and so the assert is valid.
135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // However for non-singleton RHS, for example ult [2,5) makeAllowedICmpRegion
136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // returns [0,4) but makeSatisfyICmpRegion returns [0,2).
137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  //
138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  assert(makeAllowedICmpRegion(Pred, C) == makeSatisfyingICmpRegion(Pred, C));
139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return makeAllowedICmpRegion(Pred, C);
140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool ConstantRange::getEquivalentICmp(CmpInst::Predicate &Pred,
143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                      APInt &RHS) const {
144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = false;
145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (isFullSet() || isEmptySet()) {
147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Pred = isEmptySet() ? CmpInst::ICMP_ULT : CmpInst::ICMP_UGE;
148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    RHS = APInt(getBitWidth(), 0);
149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Success = true;
150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else if (getLower().isMinSignedValue() || getLower().isMinValue()) {
151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Pred =
152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        getLower().isMinSignedValue() ? CmpInst::ICMP_SLT : CmpInst::ICMP_ULT;
153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    RHS = getUpper();
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Success = true;
155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  } else if (getUpper().isMinSignedValue() || getUpper().isMinValue()) {
156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Pred =
157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        getUpper().isMinSignedValue() ? CmpInst::ICMP_SGE : CmpInst::ICMP_UGE;
158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    RHS = getLower();
159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Success = true;
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  assert((!Success || ConstantRange::makeExactICmpRegion(Pred, RHS) == *this) &&
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar         "Bad result!");
164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarConstantRange
169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarConstantRange::makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp,
170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          const ConstantRange &Other,
171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          unsigned NoWrapKind) {
172f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  typedef OverflowingBinaryOperator OBO;
173f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
174f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // Computes the intersection of CR0 and CR1.  It is different from
175f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // intersectWith in that the ConstantRange returned will only contain elements
176f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // in both CR0 and CR1 (i.e. SubsetIntersect(X, Y) is a *subset*, proper or
177f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  // not, of both X and Y).
178f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  auto SubsetIntersect =
179f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      [](const ConstantRange &CR0, const ConstantRange &CR1) {
180f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return CR0.inverse().unionWith(CR1.inverse()).inverse();
181f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  };
182f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
183f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  assert(BinOp >= Instruction::BinaryOpsBegin &&
184f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar         BinOp < Instruction::BinaryOpsEnd && "Binary operators only!");
185f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
186f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  assert((NoWrapKind == OBO::NoSignedWrap ||
187f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          NoWrapKind == OBO::NoUnsignedWrap ||
188f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar          NoWrapKind == (OBO::NoUnsignedWrap | OBO::NoSignedWrap)) &&
189f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar         "NoWrapKind invalid!");
190f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned BitWidth = Other.getBitWidth();
192f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (BinOp != Instruction::Add)
193f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    // Conservative answer: empty set
194f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar    return ConstantRange(BitWidth, false);
195f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (auto *C = Other.getSingleElement())
197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (C->isMinValue())
198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      // Full set: nothing signed / unsigned wraps when added to 0.
199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return ConstantRange(BitWidth);
200f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
201f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  ConstantRange Result(BitWidth);
202f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
203f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (NoWrapKind & OBO::NoUnsignedWrap)
204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Result =
205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        SubsetIntersect(Result, ConstantRange(APInt::getNullValue(BitWidth),
206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                              -Other.getUnsignedMax()));
207f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
208f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  if (NoWrapKind & OBO::NoSignedWrap) {
209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    APInt SignedMin = Other.getSignedMin();
210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    APInt SignedMax = Other.getSignedMax();
211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (SignedMax.isStrictlyPositive())
213f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Result = SubsetIntersect(
214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          Result,
215de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          ConstantRange(APInt::getSignedMinValue(BitWidth),
216de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                        APInt::getSignedMinValue(BitWidth) - SignedMax));
217de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
218de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (SignedMin.isNegative())
219f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar      Result = SubsetIntersect(
220de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar          Result, ConstantRange(APInt::getSignedMinValue(BitWidth) - SignedMin,
221f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar                                APInt::getSignedMinValue(BitWidth)));
222f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  }
223f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
224f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar  return Result;
225f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar}
226f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar
227645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// isFullSet - Return true if this set contains all of the elements possible
228645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// for this data-type
229645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerbool ConstantRange::isFullSet() const {
230c125c00e68138b8ae7861b589277a491ee217893Zhou Sheng  return Lower == Upper && Lower.isMaxValue();
231645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
232fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
233645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// isEmptySet - Return true if this set contains no members.
234645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
235645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattnerbool ConstantRange::isEmptySet() const {
236c125c00e68138b8ae7861b589277a491ee217893Zhou Sheng  return Lower == Upper && Lower.isMinValue();
237645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
238645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
239645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// isWrappedSet - Return true if this set wraps around the top of the range,
240645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// for example: [100, 8)
241645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
242a6e8a955d6ab82911a1909fac7a9f4256a4d090eReid Spencerbool ConstantRange::isWrappedSet() const {
243663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  return Lower.ugt(Upper);
244645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
245645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
24632cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewycky/// isSignWrappedSet - Return true if this set wraps around the INT_MIN of
24732cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewycky/// its bitwidth, for example: i8 [120, 140).
24832cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewycky///
24932cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewyckybool ConstantRange::isSignWrappedSet() const {
25032cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewycky  return contains(APInt::getSignedMaxValue(getBitWidth())) &&
25132cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewycky         contains(APInt::getSignedMinValue(getBitWidth()));
25232cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewycky}
25332cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewycky
254645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// getSetSize - Return the number of elements in this set.
255645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
256663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid SpencerAPInt ConstantRange::getSetSize() const {
2575d2fada44ce77c6db15173a8107bf253c2293170Nuno Lopes  if (isFullSet()) {
2585d2fada44ce77c6db15173a8107bf253c2293170Nuno Lopes    APInt Size(getBitWidth()+1, 0);
2595d2fada44ce77c6db15173a8107bf253c2293170Nuno Lopes    Size.setBit(getBitWidth());
2605d2fada44ce77c6db15173a8107bf253c2293170Nuno Lopes    return Size;
261645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner  }
262fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman
2635d2fada44ce77c6db15173a8107bf253c2293170Nuno Lopes  // This is also correct for wrapped sets.
264367308f798338e162b4ab76efa785caa847487c0Nuno Lopes  return (Upper - Lower).zext(getBitWidth()+1);
265645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
266645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
2673400e6af6b10acea219c02ac262637220f84218fNick Lewycky/// getUnsignedMax - Return the largest unsigned value contained in the
2683400e6af6b10acea219c02ac262637220f84218fNick Lewycky/// ConstantRange.
2693400e6af6b10acea219c02ac262637220f84218fNick Lewycky///
2703400e6af6b10acea219c02ac262637220f84218fNick LewyckyAPInt ConstantRange::getUnsignedMax() const {
2713400e6af6b10acea219c02ac262637220f84218fNick Lewycky  if (isFullSet() || isWrappedSet())
2723400e6af6b10acea219c02ac262637220f84218fNick Lewycky    return APInt::getMaxValue(getBitWidth());
27348a09aec60c5daf67430811e24256d501a576766Nick Lewycky  return getUpper() - 1;
2743400e6af6b10acea219c02ac262637220f84218fNick Lewycky}
2753400e6af6b10acea219c02ac262637220f84218fNick Lewycky
2763400e6af6b10acea219c02ac262637220f84218fNick Lewycky/// getUnsignedMin - Return the smallest unsigned value contained in the
2773400e6af6b10acea219c02ac262637220f84218fNick Lewycky/// ConstantRange.
2783400e6af6b10acea219c02ac262637220f84218fNick Lewycky///
2793400e6af6b10acea219c02ac262637220f84218fNick LewyckyAPInt ConstantRange::getUnsignedMin() const {
2803400e6af6b10acea219c02ac262637220f84218fNick Lewycky  if (isFullSet() || (isWrappedSet() && getUpper() != 0))
2813400e6af6b10acea219c02ac262637220f84218fNick Lewycky    return APInt::getMinValue(getBitWidth());
28248a09aec60c5daf67430811e24256d501a576766Nick Lewycky  return getLower();
2833400e6af6b10acea219c02ac262637220f84218fNick Lewycky}
2843400e6af6b10acea219c02ac262637220f84218fNick Lewycky
2853400e6af6b10acea219c02ac262637220f84218fNick Lewycky/// getSignedMax - Return the largest signed value contained in the
2863400e6af6b10acea219c02ac262637220f84218fNick Lewycky/// ConstantRange.
2873400e6af6b10acea219c02ac262637220f84218fNick Lewycky///
2883400e6af6b10acea219c02ac262637220f84218fNick LewyckyAPInt ConstantRange::getSignedMax() const {
289daacf22537e0d140c379a39a11a83d3321395d4dZhou Sheng  APInt SignedMax(APInt::getSignedMaxValue(getBitWidth()));
2903400e6af6b10acea219c02ac262637220f84218fNick Lewycky  if (!isWrappedSet()) {
291ae5eb7accf65ee94e22b3d235d466d71268f1e83Nick Lewycky    if (getLower().sle(getUpper() - 1))
2923400e6af6b10acea219c02ac262637220f84218fNick Lewycky      return getUpper() - 1;
29348a09aec60c5daf67430811e24256d501a576766Nick Lewycky    return SignedMax;
2943400e6af6b10acea219c02ac262637220f84218fNick Lewycky  }
29548a09aec60c5daf67430811e24256d501a576766Nick Lewycky  if (getLower().isNegative() == getUpper().isNegative())
29648a09aec60c5daf67430811e24256d501a576766Nick Lewycky    return SignedMax;
29748a09aec60c5daf67430811e24256d501a576766Nick Lewycky  return getUpper() - 1;
2983400e6af6b10acea219c02ac262637220f84218fNick Lewycky}
2993400e6af6b10acea219c02ac262637220f84218fNick Lewycky
3003400e6af6b10acea219c02ac262637220f84218fNick Lewycky/// getSignedMin - Return the smallest signed value contained in the
3013400e6af6b10acea219c02ac262637220f84218fNick Lewycky/// ConstantRange.
3023400e6af6b10acea219c02ac262637220f84218fNick Lewycky///
3033400e6af6b10acea219c02ac262637220f84218fNick LewyckyAPInt ConstantRange::getSignedMin() const {
304daacf22537e0d140c379a39a11a83d3321395d4dZhou Sheng  APInt SignedMin(APInt::getSignedMinValue(getBitWidth()));
3053400e6af6b10acea219c02ac262637220f84218fNick Lewycky  if (!isWrappedSet()) {
306ae5eb7accf65ee94e22b3d235d466d71268f1e83Nick Lewycky    if (getLower().sle(getUpper() - 1))
3073400e6af6b10acea219c02ac262637220f84218fNick Lewycky      return getLower();
30848a09aec60c5daf67430811e24256d501a576766Nick Lewycky    return SignedMin;
30948a09aec60c5daf67430811e24256d501a576766Nick Lewycky  }
31048a09aec60c5daf67430811e24256d501a576766Nick Lewycky  if ((getUpper() - 1).slt(getLower())) {
31148a09aec60c5daf67430811e24256d501a576766Nick Lewycky    if (getUpper() != SignedMin)
3123400e6af6b10acea219c02ac262637220f84218fNick Lewycky      return SignedMin;
3133400e6af6b10acea219c02ac262637220f84218fNick Lewycky  }
31448a09aec60c5daf67430811e24256d501a576766Nick Lewycky  return getLower();
3153400e6af6b10acea219c02ac262637220f84218fNick Lewycky}
3163400e6af6b10acea219c02ac262637220f84218fNick Lewycky
317fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// contains - Return true if the specified value is in the set.
318fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner///
319a6e8a955d6ab82911a1909fac7a9f4256a4d090eReid Spencerbool ConstantRange::contains(const APInt &V) const {
320a6e8a955d6ab82911a1909fac7a9f4256a4d090eReid Spencer  if (Lower == Upper)
321a6e8a955d6ab82911a1909fac7a9f4256a4d090eReid Spencer    return isFullSet();
322fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner
323a6e8a955d6ab82911a1909fac7a9f4256a4d090eReid Spencer  if (!isWrappedSet())
324a6e8a955d6ab82911a1909fac7a9f4256a4d090eReid Spencer    return Lower.ule(V) && V.ult(Upper);
32548a09aec60c5daf67430811e24256d501a576766Nick Lewycky  return Lower.ule(V) || V.ult(Upper);
326fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner}
327645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
328bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky/// contains - Return true if the argument is a subset of this range.
3297f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky/// Two equal sets contain each other. The empty set contained by all other
3307f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky/// sets.
331bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky///
332bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewyckybool ConstantRange::contains(const ConstantRange &Other) const {
3337f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  if (isFullSet() || Other.isEmptySet()) return true;
3347f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  if (isEmptySet() || Other.isFullSet()) return false;
335bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky
336bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky  if (!isWrappedSet()) {
337bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky    if (Other.isWrappedSet())
338bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky      return false;
339bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky
340bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky    return Lower.ule(Other.getLower()) && Other.getUpper().ule(Upper);
341bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky  }
342bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky
343bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky  if (!Other.isWrappedSet())
344bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky    return Other.getUpper().ule(Upper) ||
345bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky           Lower.ule(Other.getLower());
346bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky
347bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky  return Other.getUpper().ule(Upper) && Lower.ule(Other.getLower());
348bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky}
349bf8c7f0adf90c8271c790be9922a2f97d19d4c01Nick Lewycky
350fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// subtract - Subtract the specified constant from the endpoints of this
351fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// constant range.
352581b0d453a63f7f657248f80317976995262be11Reid SpencerConstantRange ConstantRange::subtract(const APInt &Val) const {
353bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer  assert(Val.getBitWidth() == getBitWidth() && "Wrong bit width");
354fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner  // If the set is empty or full, don't modify the endpoints.
355663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  if (Lower == Upper)
356663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer    return *this;
357663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  return ConstantRange(Lower - Val, Upper - Val);
358fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner}
359fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner
36062d7afad8faf7a1fbbf3402f8e23ce4ece9ab108Nuno Lopes/// \brief Subtract the specified range from this range (aka relative complement
36162d7afad8faf7a1fbbf3402f8e23ce4ece9ab108Nuno Lopes/// of the sets).
36262d7afad8faf7a1fbbf3402f8e23ce4ece9ab108Nuno LopesConstantRange ConstantRange::difference(const ConstantRange &CR) const {
36362d7afad8faf7a1fbbf3402f8e23ce4ece9ab108Nuno Lopes  return intersectWith(CR.inverse());
36462d7afad8faf7a1fbbf3402f8e23ce4ece9ab108Nuno Lopes}
36562d7afad8faf7a1fbbf3402f8e23ce4ece9ab108Nuno Lopes
3663e051647c079fe29db049646b39611fc0135327dNick Lewycky/// intersectWith - Return the range that results from the intersection of this
3673a4a884c1618d94202ee714ea5c899cd80d1c536Nick Lewycky/// range with another range.  The resultant range is guaranteed to include all
3683a4a884c1618d94202ee714ea5c899cd80d1c536Nick Lewycky/// elements contained in both input ranges, and to have the smallest possible
3693a4a884c1618d94202ee714ea5c899cd80d1c536Nick Lewycky/// set size that does so.  Because there may be two intersections with the
3703a4a884c1618d94202ee714ea5c899cd80d1c536Nick Lewycky/// same set size, A.intersectWith(B) might not be equal to B.intersectWith(A).
371a6e8a955d6ab82911a1909fac7a9f4256a4d090eReid SpencerConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const {
372bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer  assert(getBitWidth() == CR.getBitWidth() &&
373bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer         "ConstantRange types don't agree!");
374377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
375377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky  // Handle common cases.
376377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky  if (   isEmptySet() || CR.isFullSet()) return *this;
377377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky  if (CR.isEmptySet() ||    isFullSet()) return CR;
378377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
379377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky  if (!isWrappedSet() && CR.isWrappedSet())
3803a4a884c1618d94202ee714ea5c899cd80d1c536Nick Lewycky    return CR.intersectWith(*this);
381377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
382377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky  if (!isWrappedSet() && !CR.isWrappedSet()) {
383377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky    if (Lower.ult(CR.Lower)) {
384377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky      if (Upper.ule(CR.Lower))
385377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky        return ConstantRange(getBitWidth(), false);
386377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
387377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky      if (Upper.ult(CR.Upper))
388377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky        return ConstantRange(CR.Lower, Upper);
389377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
390377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky      return CR;
39148a09aec60c5daf67430811e24256d501a576766Nick Lewycky    }
39248a09aec60c5daf67430811e24256d501a576766Nick Lewycky    if (Upper.ult(CR.Upper))
39348a09aec60c5daf67430811e24256d501a576766Nick Lewycky      return *this;
394377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
39548a09aec60c5daf67430811e24256d501a576766Nick Lewycky    if (Lower.ult(CR.Upper))
39648a09aec60c5daf67430811e24256d501a576766Nick Lewycky      return ConstantRange(Lower, CR.Upper);
397377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
39848a09aec60c5daf67430811e24256d501a576766Nick Lewycky    return ConstantRange(getBitWidth(), false);
399377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky  }
400377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
401377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky  if (isWrappedSet() && !CR.isWrappedSet()) {
402377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky    if (CR.Lower.ult(Upper)) {
403377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky      if (CR.Upper.ult(Upper))
404377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky        return CR;
405377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
406fbb7a73631e3c23510abb3904e8ad38c87ff2a24Nuno Lopes      if (CR.Upper.ule(Lower))
407377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky        return ConstantRange(CR.Lower, Upper);
408377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
409377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky      if (getSetSize().ult(CR.getSetSize()))
410377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky        return *this;
41148a09aec60c5daf67430811e24256d501a576766Nick Lewycky      return CR;
41248a09aec60c5daf67430811e24256d501a576766Nick Lewycky    }
41348a09aec60c5daf67430811e24256d501a576766Nick Lewycky    if (CR.Lower.ult(Lower)) {
414377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky      if (CR.Upper.ule(Lower))
415377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky        return ConstantRange(getBitWidth(), false);
416377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
417377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky      return ConstantRange(Lower, CR.Upper);
418377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky    }
419377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky    return CR;
420377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky  }
421377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
422377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky  if (CR.Upper.ult(Upper)) {
423377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky    if (CR.Lower.ult(Upper)) {
424377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky      if (getSetSize().ult(CR.getSetSize()))
425377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky        return *this;
42648a09aec60c5daf67430811e24256d501a576766Nick Lewycky      return CR;
427377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky    }
428377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
429377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky    if (CR.Lower.ult(Lower))
430377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky      return ConstantRange(Lower, CR.Upper);
431377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
432377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky    return CR;
43348a09aec60c5daf67430811e24256d501a576766Nick Lewycky  }
434532516a87bc57f21e6d99f49548e4c2adf835551Nuno Lopes  if (CR.Upper.ule(Lower)) {
435377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky    if (CR.Lower.ult(Lower))
436377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky      return *this;
437377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
438377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky    return ConstantRange(CR.Lower, Upper);
439377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky  }
440377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky  if (getSetSize().ult(CR.getSetSize()))
441377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky    return *this;
44248a09aec60c5daf67430811e24256d501a576766Nick Lewycky  return CR;
443377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky}
444377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
445377b1190cbcf99e9298300d890c4b744dd2ed2c7Nick Lewycky
4463e051647c079fe29db049646b39611fc0135327dNick Lewycky/// unionWith - Return the range that results from the union of this range with
447645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner/// another range.  The resultant range is guaranteed to include the elements of
4489babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky/// both sets, but may contain more.  For example, [3, 9) union [12,15) is
4499babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky/// [3, 15), which includes 9, 10, and 11, which were not included in either
4509babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky/// set before.
451645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner///
452a6e8a955d6ab82911a1909fac7a9f4256a4d090eReid SpencerConstantRange ConstantRange::unionWith(const ConstantRange &CR) const {
453bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer  assert(getBitWidth() == CR.getBitWidth() &&
454bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer         "ConstantRange types don't agree!");
455645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
456c6a28fcf5db2b6e81607e45cd5210e3e07834eedNick Lewycky  if (   isFullSet() || CR.isEmptySet()) return *this;
457c6a28fcf5db2b6e81607e45cd5210e3e07834eedNick Lewycky  if (CR.isFullSet() ||    isEmptySet()) return CR;
458645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner
4599babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky  if (!isWrappedSet() && CR.isWrappedSet()) return CR.unionWith(*this);
4609babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky
4619babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky  if (!isWrappedSet() && !CR.isWrappedSet()) {
4627e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    if (CR.Upper.ult(Lower) || Upper.ult(CR.Lower)) {
4637e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky      // If the two ranges are disjoint, find the smaller gap and bridge it.
4647e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky      APInt d1 = CR.Lower - Upper, d2 = Lower - CR.Upper;
4657e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky      if (d1.ult(d2))
4667e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky        return ConstantRange(Lower, CR.Upper);
46748a09aec60c5daf67430811e24256d501a576766Nick Lewycky      return ConstantRange(CR.Lower, Upper);
4687e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    }
4697e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky
4707e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    APInt L = Lower, U = Upper;
4719babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky    if (CR.Lower.ult(L))
4729babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky      L = CR.Lower;
4737e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    if ((CR.Upper - 1).ugt(U - 1))
4749babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky      U = CR.Upper;
4757e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky
4767e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    if (L == 0 && U == 0)
4777e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky      return ConstantRange(getBitWidth());
4787e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky
4797e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    return ConstantRange(L, U);
4809babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky  }
4819babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky
4827e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky  if (!CR.isWrappedSet()) {
4837e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    // ------U   L-----  and  ------U   L----- : this
4847e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    //   L--U                            L--U  : CR
4857e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    if (CR.Upper.ule(Upper) || CR.Lower.uge(Lower))
4869babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky      return *this;
4879babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky
4887e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    // ------U   L----- : this
4897e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    //    L---------U   : CR
4907e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    if (CR.Lower.ule(Upper) && Lower.ule(CR.Upper))
4919babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky      return ConstantRange(getBitWidth());
4929babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky
4937e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    // ----U       L---- : this
4947e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    //       L---U       : CR
4957e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    //    <d1>  <d2>
4967e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    if (Upper.ule(CR.Lower) && CR.Upper.ule(Lower)) {
4979babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky      APInt d1 = CR.Lower - Upper, d2 = Lower - CR.Upper;
4987e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky      if (d1.ult(d2))
4997e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky        return ConstantRange(Lower, CR.Upper);
50048a09aec60c5daf67430811e24256d501a576766Nick Lewycky      return ConstantRange(CR.Lower, Upper);
5019babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky    }
502c6a28fcf5db2b6e81607e45cd5210e3e07834eedNick Lewycky
5037e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    // ----U     L----- : this
5047e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    //        L----U    : CR
5057e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    if (Upper.ult(CR.Lower) && Lower.ult(CR.Upper))
5067e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky      return ConstantRange(CR.Lower, Upper);
5079babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky
5087e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    // ------U    L---- : this
5097e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    //    L-----U       : CR
51048a09aec60c5daf67430811e24256d501a576766Nick Lewycky    assert(CR.Lower.ult(Upper) && CR.Upper.ult(Lower) &&
51148a09aec60c5daf67430811e24256d501a576766Nick Lewycky           "ConstantRange::unionWith missed a case with one range wrapped");
51248a09aec60c5daf67430811e24256d501a576766Nick Lewycky    return ConstantRange(Lower, CR.Upper);
5139babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky  }
5149babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky
5157e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky  // ------U    L----  and  ------U    L---- : this
5167e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky  // -U  L-----------  and  ------------U  L : CR
5177e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky  if (CR.Lower.ule(Upper) || Lower.ule(CR.Upper))
5187e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    return ConstantRange(getBitWidth());
5199babd0e0f2f380dcb84561c1d9f9ebc773c588f2Nick Lewycky
5207e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky  APInt L = Lower, U = Upper;
5217e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky  if (CR.Upper.ugt(U))
5227e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    U = CR.Upper;
5237e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky  if (CR.Lower.ult(L))
5247e7dc45eb15d3739564f2a63ab1c468c57d94ff8Nick Lewycky    L = CR.Lower;
525c6a28fcf5db2b6e81607e45cd5210e3e07834eedNick Lewycky
526c6a28fcf5db2b6e81607e45cd5210e3e07834eedNick Lewycky  return ConstantRange(L, U);
527645e00d1497dec37da92b59b47d76c4f922e6abcChris Lattner}
52896f9d7232c72867ee09641832d2db99f9166d6f0Chris Lattner
529fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// zeroExtend - Return a new range in the specified integer type, which must
530fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// be strictly larger than the current type.  The returned range will
531e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer/// correspond to the possible range of values as if the source range had been
532fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// zero extended.
533bb626a6751db9a63d159d32522bdf88cedf46eebReid SpencerConstantRange ConstantRange::zeroExtend(uint32_t DstTySize) const {
53432cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewycky  if (isEmptySet()) return ConstantRange(DstTySize, /*isFullSet=*/false);
53532cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewycky
536bb626a6751db9a63d159d32522bdf88cedf46eebReid Spencer  unsigned SrcTySize = getBitWidth();
537663e711dc235cae94eb50abb1c0571fd0b3a6a35Reid Spencer  assert(SrcTySize < DstTySize && "Not a value extension");
538b42729b53a061e2a3def61eb10e2a648cecd60aeNuno Lopes  if (isFullSet() || isWrappedSet()) {
53932cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewycky    // Change into [0, 1 << src bit width)
540b42729b53a061e2a3def61eb10e2a648cecd60aeNuno Lopes    APInt LowerExt(DstTySize, 0);
541b42729b53a061e2a3def61eb10e2a648cecd60aeNuno Lopes    if (!Upper) // special case: [X, 0) -- not really wrapping around
542b42729b53a061e2a3def61eb10e2a648cecd60aeNuno Lopes      LowerExt = Lower.zext(DstTySize);
5430a230e0d985625a3909cb78fd867a3abaf434565Benjamin Kramer    return ConstantRange(LowerExt, APInt::getOneBitSet(DstTySize, SrcTySize));
544b42729b53a061e2a3def61eb10e2a648cecd60aeNuno Lopes  }
545fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner
54640f8f6264d5af2c38e797e0dc59827cd231e8ff7Jay Foad  return ConstantRange(Lower.zext(DstTySize), Upper.zext(DstTySize));
547e32157c6098ee7536315e9793eed98d21bf71fd0Nick Lewycky}
548e32157c6098ee7536315e9793eed98d21bf71fd0Nick Lewycky
549e32157c6098ee7536315e9793eed98d21bf71fd0Nick Lewycky/// signExtend - Return a new range in the specified integer type, which must
550e32157c6098ee7536315e9793eed98d21bf71fd0Nick Lewycky/// be strictly larger than the current type.  The returned range will
551e32157c6098ee7536315e9793eed98d21bf71fd0Nick Lewycky/// correspond to the possible range of values as if the source range had been
552e32157c6098ee7536315e9793eed98d21bf71fd0Nick Lewycky/// sign extended.
553e32157c6098ee7536315e9793eed98d21bf71fd0Nick LewyckyConstantRange ConstantRange::signExtend(uint32_t DstTySize) const {
55432cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewycky  if (isEmptySet()) return ConstantRange(DstTySize, /*isFullSet=*/false);
55532cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewycky
556e32157c6098ee7536315e9793eed98d21bf71fd0Nick Lewycky  unsigned SrcTySize = getBitWidth();
557e32157c6098ee7536315e9793eed98d21bf71fd0Nick Lewycky  assert(SrcTySize < DstTySize && "Not a value extension");
558d3b64efcb33415e980035371b3e8de1e501a6f12Nuno Lopes
559d3b64efcb33415e980035371b3e8de1e501a6f12Nuno Lopes  // special case: [X, INT_MIN) -- not really wrapping around
5607de1b3bd458c33949b9b3f7eb1b9e0c07cfdf65aNuno Lopes  if (Upper.isMinSignedValue())
561d3b64efcb33415e980035371b3e8de1e501a6f12Nuno Lopes    return ConstantRange(Lower.sext(DstTySize), Upper.zext(DstTySize));
562d3b64efcb33415e980035371b3e8de1e501a6f12Nuno Lopes
56332cda119ef63ae1f1ee4b60e1d9e4a5ea8e00604Nick Lewycky  if (isFullSet() || isSignWrappedSet()) {
564e32157c6098ee7536315e9793eed98d21bf71fd0Nick Lewycky    return ConstantRange(APInt::getHighBitsSet(DstTySize,DstTySize-SrcTySize+1),
565ff84de767a9baded740abd1e846938477a4b285aNick Lewycky                         APInt::getLowBitsSet(DstTySize, SrcTySize-1) + 1);
566e32157c6098ee7536315e9793eed98d21bf71fd0Nick Lewycky  }
567e32157c6098ee7536315e9793eed98d21bf71fd0Nick Lewycky
56840f8f6264d5af2c38e797e0dc59827cd231e8ff7Jay Foad  return ConstantRange(Lower.sext(DstTySize), Upper.sext(DstTySize));
569fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner}
570fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner
571fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// truncate - Return a new range in the specified integer type, which must be
572fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// strictly smaller than the current type.  The returned range will
573e4d87aa2de6e52952dca73716386db09aad5a8fdReid Spencer/// correspond to the possible range of values as if the source range had been
574fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner/// truncated to the specified type.
575bb626a6751db9a63d159d32522bdf88cedf46eebReid SpencerConstantRange ConstantRange::truncate(uint32_t DstTySize) const {
576b3ff49e923225d0f7242ef5ac554bdef34c1b216Benjamin Kramer  assert(getBitWidth() > DstTySize && "Not a value truncation");
57755c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  if (isEmptySet())
57855c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes    return ConstantRange(DstTySize, /*isFullSet=*/false);
57955c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  if (isFullSet())
5807f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky    return ConstantRange(DstTySize, /*isFullSet=*/true);
581fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner
58255c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  APInt MaxValue = APInt::getMaxValue(DstTySize).zext(getBitWidth());
58355c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  APInt MaxBitValue(getBitWidth(), 0);
58455c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  MaxBitValue.setBit(DstTySize);
58555c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes
58655c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  APInt LowerDiv(Lower), UpperDiv(Upper);
58755c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  ConstantRange Union(DstTySize, /*isFullSet=*/false);
58855c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes
58955c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  // Analyze wrapped sets in their two parts: [0, Upper) \/ [Lower, MaxValue]
59055c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  // We use the non-wrapped set code to analyze the [Lower, MaxValue) part, and
59155c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  // then we do the union with [MaxValue, Upper)
59255c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  if (isWrappedSet()) {
593de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // If Upper is greater than Max Value, it covers the whole truncated range.
59455c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes    if (Upper.uge(MaxValue))
59555c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes      return ConstantRange(DstTySize, /*isFullSet=*/true);
59655c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes
59755c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes    Union = ConstantRange(APInt::getMaxValue(DstTySize),Upper.trunc(DstTySize));
59855c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes    UpperDiv = APInt::getMaxValue(getBitWidth());
59955c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes
60055c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes    // Union covers the MaxValue case, so return if the remaining range is just
60155c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes    // MaxValue.
60255c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes    if (LowerDiv == UpperDiv)
60355c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes      return Union;
60455c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  }
60555c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes
60655c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  // Chop off the most significant bits that are past the destination bitwidth.
60755c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  if (LowerDiv.uge(MaxValue)) {
60855c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes    APInt Div(getBitWidth(), 0);
60955c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes    APInt::udivrem(LowerDiv, MaxBitValue, Div, LowerDiv);
61055c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes    UpperDiv = UpperDiv - MaxBitValue * Div;
61155c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  }
61255c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes
61355c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  if (UpperDiv.ule(MaxValue))
61455c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes    return ConstantRange(LowerDiv.trunc(DstTySize),
61555c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes                         UpperDiv.trunc(DstTySize)).unionWith(Union);
61655c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes
617de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // The truncated value wraps around. Check if we can do better than fullset.
61855c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  APInt UpperModulo = UpperDiv - MaxBitValue;
61955c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  if (UpperModulo.ult(LowerDiv))
62055c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes    return ConstantRange(LowerDiv.trunc(DstTySize),
62155c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes                         UpperModulo.trunc(DstTySize)).unionWith(Union);
62255c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes
62355c9ecba47953aa8a4a1baffef81461aee660e9aNuno Lopes  return ConstantRange(DstTySize, /*isFullSet=*/true);
624fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner}
625fc33d30446843009b0eadf63c0bfca35ae2baac6Chris Lattner
62695a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes/// zextOrTrunc - make this range have the bit width given by \p DstTySize. The
62795a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes/// value is zero extended, truncated, or left alone to make it that width.
62895a3be0ba44e96308c65c28ee859acc36149ddd8Nuno LopesConstantRange ConstantRange::zextOrTrunc(uint32_t DstTySize) const {
62995a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes  unsigned SrcTySize = getBitWidth();
63095a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes  if (SrcTySize > DstTySize)
63195a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes    return truncate(DstTySize);
63248a09aec60c5daf67430811e24256d501a576766Nick Lewycky  if (SrcTySize < DstTySize)
63395a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes    return zeroExtend(DstTySize);
63448a09aec60c5daf67430811e24256d501a576766Nick Lewycky  return *this;
63595a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes}
63695a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes
63795a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes/// sextOrTrunc - make this range have the bit width given by \p DstTySize. The
63895a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes/// value is sign extended, truncated, or left alone to make it that width.
63995a3be0ba44e96308c65c28ee859acc36149ddd8Nuno LopesConstantRange ConstantRange::sextOrTrunc(uint32_t DstTySize) const {
64095a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes  unsigned SrcTySize = getBitWidth();
64195a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes  if (SrcTySize > DstTySize)
64295a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes    return truncate(DstTySize);
64348a09aec60c5daf67430811e24256d501a576766Nick Lewycky  if (SrcTySize < DstTySize)
64495a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes    return signExtend(DstTySize);
64548a09aec60c5daf67430811e24256d501a576766Nick Lewycky  return *this;
64695a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes}
64795a3be0ba44e96308c65c28ee859acc36149ddd8Nuno Lopes
648a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan GohmanConstantRange
649a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan GohmanConstantRange::add(const ConstantRange &Other) const {
650a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  if (isEmptySet() || Other.isEmptySet())
651a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman    return ConstantRange(getBitWidth(), /*isFullSet=*/false);
652cf9e07dea8aad32c5e7e2631d135566b20e1763cNick Lewycky  if (isFullSet() || Other.isFullSet())
653cf9e07dea8aad32c5e7e2631d135566b20e1763cNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
654a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman
655a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  APInt Spread_X = getSetSize(), Spread_Y = Other.getSetSize();
656a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  APInt NewLower = getLower() + Other.getLower();
657a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  APInt NewUpper = getUpper() + Other.getUpper() - 1;
658a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  if (NewLower == NewUpper)
659a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
660a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman
661a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  ConstantRange X = ConstantRange(NewLower, NewUpper);
662a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  if (X.getSetSize().ult(Spread_X) || X.getSetSize().ult(Spread_Y))
663a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman    // We've wrapped, therefore, full set.
664a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
665a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman
666a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  return X;
667a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman}
668a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman
669a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan GohmanConstantRange
6707f9ef4bb514d5a28637789d8f397dadd4344dc1bNick LewyckyConstantRange::sub(const ConstantRange &Other) const {
6717f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  if (isEmptySet() || Other.isEmptySet())
6727f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/false);
6737f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  if (isFullSet() || Other.isFullSet())
6747f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
6757f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky
6767f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  APInt Spread_X = getSetSize(), Spread_Y = Other.getSetSize();
677e6240e8b83e9bd60e622650e9e801ebc957172b4Nick Lewycky  APInt NewLower = getLower() - Other.getUpper() + 1;
678e6240e8b83e9bd60e622650e9e801ebc957172b4Nick Lewycky  APInt NewUpper = getUpper() - Other.getLower();
6797f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  if (NewLower == NewUpper)
6807f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
6817f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky
6827f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  ConstantRange X = ConstantRange(NewLower, NewUpper);
6837f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  if (X.getSetSize().ult(Spread_X) || X.getSetSize().ult(Spread_Y))
6847f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky    // We've wrapped, therefore, full set.
6857f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
6867f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky
6877f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  return X;
6887f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky}
6897f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky
6907f9ef4bb514d5a28637789d8f397dadd4344dc1bNick LewyckyConstantRange
691a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan GohmanConstantRange::multiply(const ConstantRange &Other) const {
6928dcc58e6b44fbaab39a24b1f75e67f05275084dcDan Gohman  // TODO: If either operand is a single element and the multiply is known to
6938dcc58e6b44fbaab39a24b1f75e67f05275084dcDan Gohman  // be non-wrapping, round the result min and max value to the appropriate
6948dcc58e6b44fbaab39a24b1f75e67f05275084dcDan Gohman  // multiple of that element. If wrapping is possible, at least adjust the
6958dcc58e6b44fbaab39a24b1f75e67f05275084dcDan Gohman  // range according to the greatest power-of-two factor of the single element.
696153f1ebeb8fd394e5b11b27edde9472de0cbb57fDan Gohman
6972ff893f48698005f87163c8029224c718cf4cba9Nick Lewycky  if (isEmptySet() || Other.isEmptySet())
6982ff893f48698005f87163c8029224c718cf4cba9Nick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/false);
6997e733eab2f11fceb24d6b4f25c27d7ba7d92d97eNuno Lopes
7004c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // Multiplication is signedness-independent. However different ranges can be
7014c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // obtained depending on how the input ranges are treated. These different
7024c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // ranges are all conservatively correct, but one might be better than the
7034c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // other. We calculate two ranges; one treating the inputs as unsigned
7044c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // and the other signed, then return the smallest of these ranges.
7054c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
7064c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // Unsigned range first.
707f1db120d0494ec55d9265cea7dab22e80dcae10cNick Lewycky  APInt this_min = getUnsignedMin().zext(getBitWidth() * 2);
708f1db120d0494ec55d9265cea7dab22e80dcae10cNick Lewycky  APInt this_max = getUnsignedMax().zext(getBitWidth() * 2);
709f1db120d0494ec55d9265cea7dab22e80dcae10cNick Lewycky  APInt Other_min = Other.getUnsignedMin().zext(getBitWidth() * 2);
710f1db120d0494ec55d9265cea7dab22e80dcae10cNick Lewycky  APInt Other_max = Other.getUnsignedMax().zext(getBitWidth() * 2);
7112ff893f48698005f87163c8029224c718cf4cba9Nick Lewycky
712f1db120d0494ec55d9265cea7dab22e80dcae10cNick Lewycky  ConstantRange Result_zext = ConstantRange(this_min * Other_min,
713f1db120d0494ec55d9265cea7dab22e80dcae10cNick Lewycky                                            this_max * Other_max + 1);
7144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  ConstantRange UR = Result_zext.truncate(getBitWidth());
7154c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
716de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // If the unsigned range doesn't wrap, and isn't negative then it's a range
717de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // from one positive number to another which is as good as we can generate.
718de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // In this case, skip the extra work of generating signed ranges which aren't
719de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // going to be better than this range.
720de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!UR.isWrappedSet() && UR.getLower().isNonNegative())
721de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return UR;
722de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
7234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // Now the signed range. Because we could be dealing with negative numbers
7244c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // here, the lower bound is the smallest of the cartesian product of the
7254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // lower and upper ranges; for example:
7264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  //   [-1,4) * [-2,3) = min(-1*-2, -1*2, 3*-2, 3*2) = -6.
7274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  // Similarly for the upper bound, swapping min for max.
7284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
7294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  this_min = getSignedMin().sext(getBitWidth() * 2);
7304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  this_max = getSignedMax().sext(getBitWidth() * 2);
7314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Other_min = Other.getSignedMin().sext(getBitWidth() * 2);
7324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Other_max = Other.getSignedMax().sext(getBitWidth() * 2);
7334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
7344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  auto L = {this_min * Other_min, this_min * Other_max,
7354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar            this_max * Other_min, this_max * Other_max};
7364c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  auto Compare = [](const APInt &A, const APInt &B) { return A.slt(B); };
7374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  ConstantRange Result_sext(std::min(L, Compare), std::max(L, Compare) + 1);
7384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  ConstantRange SR = Result_sext.truncate(getBitWidth());
7394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
7404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return UR.getSetSize().ult(SR.getSetSize()) ? UR : SR;
741a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman}
742a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman
743a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan GohmanConstantRange
744a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan GohmanConstantRange::smax(const ConstantRange &Other) const {
74538b06447615440f935008a2141bd0a1fe078d437Dan Gohman  // X smax Y is: range(smax(X_smin, Y_smin),
74638b06447615440f935008a2141bd0a1fe078d437Dan Gohman  //                    smax(X_smax, Y_smax))
74738b06447615440f935008a2141bd0a1fe078d437Dan Gohman  if (isEmptySet() || Other.isEmptySet())
74838b06447615440f935008a2141bd0a1fe078d437Dan Gohman    return ConstantRange(getBitWidth(), /*isFullSet=*/false);
74938b06447615440f935008a2141bd0a1fe078d437Dan Gohman  APInt NewL = APIntOps::smax(getSignedMin(), Other.getSignedMin());
75038b06447615440f935008a2141bd0a1fe078d437Dan Gohman  APInt NewU = APIntOps::smax(getSignedMax(), Other.getSignedMax()) + 1;
75138b06447615440f935008a2141bd0a1fe078d437Dan Gohman  if (NewU == NewL)
75238b06447615440f935008a2141bd0a1fe078d437Dan Gohman    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
75338b06447615440f935008a2141bd0a1fe078d437Dan Gohman  return ConstantRange(NewL, NewU);
754a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman}
755a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman
756a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan GohmanConstantRange
757a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan GohmanConstantRange::umax(const ConstantRange &Other) const {
758a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  // X umax Y is: range(umax(X_umin, Y_umin),
759a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  //                    umax(X_umax, Y_umax))
760a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  if (isEmptySet() || Other.isEmptySet())
761a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman    return ConstantRange(getBitWidth(), /*isFullSet=*/false);
762a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  APInt NewL = APIntOps::umax(getUnsignedMin(), Other.getUnsignedMin());
763a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  APInt NewU = APIntOps::umax(getUnsignedMax(), Other.getUnsignedMax()) + 1;
764a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  if (NewU == NewL)
765a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
766a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman  return ConstantRange(NewL, NewU);
767a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman}
768a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman
769a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan GohmanConstantRange
770de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarConstantRange::smin(const ConstantRange &Other) const {
771de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // X smin Y is: range(smin(X_smin, Y_smin),
772de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  //                    smin(X_smax, Y_smax))
773de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (isEmptySet() || Other.isEmptySet())
774de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantRange(getBitWidth(), /*isFullSet=*/false);
775de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  APInt NewL = APIntOps::smin(getSignedMin(), Other.getSignedMin());
776de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  APInt NewU = APIntOps::smin(getSignedMax(), Other.getSignedMax()) + 1;
777de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (NewU == NewL)
778de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
779de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return ConstantRange(NewL, NewU);
780de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
781de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
782de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarConstantRange
783de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarConstantRange::umin(const ConstantRange &Other) const {
784de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // X umin Y is: range(umin(X_umin, Y_umin),
785de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  //                    umin(X_umax, Y_umax))
786de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (isEmptySet() || Other.isEmptySet())
787de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantRange(getBitWidth(), /*isFullSet=*/false);
788de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  APInt NewL = APIntOps::umin(getUnsignedMin(), Other.getUnsignedMin());
789de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  APInt NewU = APIntOps::umin(getUnsignedMax(), Other.getUnsignedMax()) + 1;
790de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (NewU == NewL)
791de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
792de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return ConstantRange(NewL, NewU);
793de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
794de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
795de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarConstantRange
796956daf0f7f7fa473cf92c8193905a8a441932b69Nick LewyckyConstantRange::udiv(const ConstantRange &RHS) const {
797956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky  if (isEmptySet() || RHS.isEmptySet() || RHS.getUnsignedMax() == 0)
798956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/false);
799956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky  if (RHS.isFullSet())
800956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
801956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky
802956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky  APInt Lower = getUnsignedMin().udiv(RHS.getUnsignedMax());
803956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky
804956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky  APInt RHS_umin = RHS.getUnsignedMin();
805956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky  if (RHS_umin == 0) {
806956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky    // We want the lowest value in RHS excluding zero. Usually that would be 1
807956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky    // except for a range in the form of [X, 1) in which case it would be X.
808956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky    if (RHS.getUpper() == 1)
809956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky      RHS_umin = RHS.getLower();
810956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky    else
811956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky      RHS_umin = APInt(getBitWidth(), 1);
812956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky  }
813956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky
814956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky  APInt Upper = getUnsignedMax().udiv(RHS_umin) + 1;
815956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky
816956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky  // If the LHS is Full and the RHS is a wrapped interval containing 1 then
817956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky  // this could occur.
818956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky  if (Lower == Upper)
819956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
820956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky
821956daf0f7f7fa473cf92c8193905a8a441932b69Nick Lewycky  return ConstantRange(Lower, Upper);
822a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman}
823a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman
82434e992da381bf8b1a9cbcc1bde0b117207809649Nuno LopesConstantRange
825198381e542320265e1c5fed18e938db3563a45bfNick LewyckyConstantRange::binaryAnd(const ConstantRange &Other) const {
826198381e542320265e1c5fed18e938db3563a45bfNick Lewycky  if (isEmptySet() || Other.isEmptySet())
827198381e542320265e1c5fed18e938db3563a45bfNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/false);
828198381e542320265e1c5fed18e938db3563a45bfNick Lewycky
829198381e542320265e1c5fed18e938db3563a45bfNick Lewycky  // TODO: replace this with something less conservative
830198381e542320265e1c5fed18e938db3563a45bfNick Lewycky
831198381e542320265e1c5fed18e938db3563a45bfNick Lewycky  APInt umin = APIntOps::umin(Other.getUnsignedMax(), getUnsignedMax());
832198381e542320265e1c5fed18e938db3563a45bfNick Lewycky  if (umin.isAllOnesValue())
833198381e542320265e1c5fed18e938db3563a45bfNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
834198381e542320265e1c5fed18e938db3563a45bfNick Lewycky  return ConstantRange(APInt::getNullValue(getBitWidth()), umin + 1);
835198381e542320265e1c5fed18e938db3563a45bfNick Lewycky}
836198381e542320265e1c5fed18e938db3563a45bfNick Lewycky
837198381e542320265e1c5fed18e938db3563a45bfNick LewyckyConstantRange
838198381e542320265e1c5fed18e938db3563a45bfNick LewyckyConstantRange::binaryOr(const ConstantRange &Other) const {
839198381e542320265e1c5fed18e938db3563a45bfNick Lewycky  if (isEmptySet() || Other.isEmptySet())
840198381e542320265e1c5fed18e938db3563a45bfNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/false);
841198381e542320265e1c5fed18e938db3563a45bfNick Lewycky
842198381e542320265e1c5fed18e938db3563a45bfNick Lewycky  // TODO: replace this with something less conservative
843198381e542320265e1c5fed18e938db3563a45bfNick Lewycky
844198381e542320265e1c5fed18e938db3563a45bfNick Lewycky  APInt umax = APIntOps::umax(getUnsignedMin(), Other.getUnsignedMin());
845198381e542320265e1c5fed18e938db3563a45bfNick Lewycky  if (umax.isMinValue())
846198381e542320265e1c5fed18e938db3563a45bfNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
847198381e542320265e1c5fed18e938db3563a45bfNick Lewycky  return ConstantRange(umax, APInt::getNullValue(getBitWidth()));
848198381e542320265e1c5fed18e938db3563a45bfNick Lewycky}
849198381e542320265e1c5fed18e938db3563a45bfNick Lewycky
850198381e542320265e1c5fed18e938db3563a45bfNick LewyckyConstantRange
8517f9ef4bb514d5a28637789d8f397dadd4344dc1bNick LewyckyConstantRange::shl(const ConstantRange &Other) const {
8527f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  if (isEmptySet() || Other.isEmptySet())
8537f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/false);
85434e992da381bf8b1a9cbcc1bde0b117207809649Nuno Lopes
8557f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  APInt min = getUnsignedMin().shl(Other.getUnsignedMin());
8567f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  APInt max = getUnsignedMax().shl(Other.getUnsignedMax());
85734e992da381bf8b1a9cbcc1bde0b117207809649Nuno Lopes
85834e992da381bf8b1a9cbcc1bde0b117207809649Nuno Lopes  // there's no overflow!
8594459145c2ccb5d063841a5d8c76b8b8ac9adaf2fNuno Lopes  APInt Zeros(getBitWidth(), getUnsignedMax().countLeadingZeros());
8607f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  if (Zeros.ugt(Other.getUnsignedMax()))
8617f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky    return ConstantRange(min, max + 1);
86234e992da381bf8b1a9cbcc1bde0b117207809649Nuno Lopes
86334e992da381bf8b1a9cbcc1bde0b117207809649Nuno Lopes  // FIXME: implement the other tricky cases
8647f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  return ConstantRange(getBitWidth(), /*isFullSet=*/true);
86534e992da381bf8b1a9cbcc1bde0b117207809649Nuno Lopes}
86634e992da381bf8b1a9cbcc1bde0b117207809649Nuno Lopes
86734e992da381bf8b1a9cbcc1bde0b117207809649Nuno LopesConstantRange
8687f9ef4bb514d5a28637789d8f397dadd4344dc1bNick LewyckyConstantRange::lshr(const ConstantRange &Other) const {
8697f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  if (isEmptySet() || Other.isEmptySet())
8707f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/false);
87134e992da381bf8b1a9cbcc1bde0b117207809649Nuno Lopes
8727f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  APInt max = getUnsignedMax().lshr(Other.getUnsignedMin());
8737f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  APInt min = getUnsignedMin().lshr(Other.getUnsignedMax());
8747f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  if (min == max + 1)
8757f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
8767f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky
8777f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky  return ConstantRange(min, max + 1);
87834e992da381bf8b1a9cbcc1bde0b117207809649Nuno Lopes}
87934e992da381bf8b1a9cbcc1bde0b117207809649Nuno Lopes
8809773e45a1e97f5098905bac26b8b8b7c844473f0Owen AndersonConstantRange ConstantRange::inverse() const {
88148a09aec60c5daf67430811e24256d501a576766Nick Lewycky  if (isFullSet())
8827f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/false);
88348a09aec60c5daf67430811e24256d501a576766Nick Lewycky  if (isEmptySet())
8847f9ef4bb514d5a28637789d8f397dadd4344dc1bNick Lewycky    return ConstantRange(getBitWidth(), /*isFullSet=*/true);
8859773e45a1e97f5098905bac26b8b8b7c844473f0Owen Anderson  return ConstantRange(Upper, Lower);
8869773e45a1e97f5098905bac26b8b8b7c844473f0Owen Anderson}
8879773e45a1e97f5098905bac26b8b8b7c844473f0Owen Anderson
88838b06447615440f935008a2141bd0a1fe078d437Dan Gohman/// print - Print out the bounds to a stream...
889a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman///
89038b06447615440f935008a2141bd0a1fe078d437Dan Gohmanvoid ConstantRange::print(raw_ostream &OS) const {
891df6d5e03940c8a2a560b74a69061aff4ae1badf3Dan Gohman  if (isFullSet())
892df6d5e03940c8a2a560b74a69061aff4ae1badf3Dan Gohman    OS << "full-set";
893df6d5e03940c8a2a560b74a69061aff4ae1badf3Dan Gohman  else if (isEmptySet())
894df6d5e03940c8a2a560b74a69061aff4ae1badf3Dan Gohman    OS << "empty-set";
895df6d5e03940c8a2a560b74a69061aff4ae1badf3Dan Gohman  else
896df6d5e03940c8a2a560b74a69061aff4ae1badf3Dan Gohman    OS << "[" << Lower << "," << Upper << ")";
897a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman}
898a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman
89938b06447615440f935008a2141bd0a1fe078d437Dan Gohman/// dump - Allow printing from a debugger easily...
900a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman///
901de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarLLVM_DUMP_METHOD void ConstantRange::dump() const {
9027fd5fb4b4755c3df86da5a0ebedf0d328fafbc81David Greene  print(dbgs());
903a3755d8d366fdd7a2415b93ac0253f8e677c9dfdDan Gohman}
904