25#include "llvm/Config/llvm-config.h" 
   50    : Lower(
std::
move(V)), Upper(Lower + 1) {}
 
 
   54  assert(Lower.getBitWidth() == Upper.getBitWidth() &&
 
   55         "ConstantRange with unequal bit widths");
 
   56  assert((Lower != Upper || (Lower.isMaxValue() || Lower.isMinValue())) &&
 
   57         "Lower == Upper, but they aren't min or max value!");
 
 
   90  if (std::optional<unsigned> DifferentBit =
 
 
  126    if (
UMax.isMinValue())
 
  132    if (
SMax.isMinSignedValue())
 
  142    if (
UMin.isMaxValue())
 
  148    if (
SMin.isMaxSignedValue())
 
 
  202         "Only for relational integer predicates!");
 
  208    return FlippedSignednessPred;
 
 
  227    RHS = *OnlyMissingElt;
 
 
  261      if (
const APInt *R = 
Other.getSingleElement())
 
 
  289  unsigned BitWidth = V.getBitWidth();
 
  291    return ConstantRange::getFull(V.getBitWidth());
 
 
  303  unsigned BitWidth = V.getBitWidth();
 
  305    return ConstantRange::getFull(
BitWidth);
 
  314  if (V.isNegative()) {
 
 
  327                                          unsigned NoWrapKind) {
 
  332  assert((NoWrapKind == OBO::NoSignedWrap ||
 
  333          NoWrapKind == OBO::NoUnsignedWrap) &&
 
  334         "NoWrapKind invalid!");
 
  336  bool Unsigned = NoWrapKind == OBO::NoUnsignedWrap;
 
  343  case Instruction::Add: {
 
  350        SMin.isNegative() ? SignedMinVal - 
SMin : SignedMinVal,
 
  351        SMax.isStrictlyPositive() ? SignedMinVal - 
SMax : SignedMinVal);
 
  354  case Instruction::Sub: {
 
  361        SMax.isStrictlyPositive() ? SignedMinVal + 
SMax : SignedMinVal,
 
  362        SMin.isNegative() ? SignedMinVal + 
SMin : SignedMinVal);
 
  365  case Instruction::Mul:
 
  376  case Instruction::Shl: {
 
 
  401                                                   unsigned NoWrapKind) {
 
 
  409  unsigned BitWidth = Mask.getBitWidth();
 
 
  425  return Lower == Upper && Lower.isMaxValue();
 
 
  429  return Lower == Upper && Lower.isMinValue();
 
 
  433  return Lower.ugt(Upper) && !Upper.isZero();
 
 
  437  return Lower.ugt(Upper);
 
 
  441  return Lower.sgt(Upper) && !Upper.isMinSignedValue();
 
 
  445  return Lower.sgt(Upper);
 
 
  453  if (
Other.isFullSet())
 
  455  return (Upper - Lower).ult(
Other.Upper - 
Other.Lower);
 
 
  465  return (Upper - Lower).ugt(MaxSize);
 
 
  522    return Lower.ule(V) && V.ult(Upper);
 
  523  return Lower.ule(V) || V.ult(Upper);
 
 
  531    if (
Other.isUpperWrapped())
 
  534    return Lower.ule(
Other.getLower()) && 
Other.getUpper().ule(Upper);
 
  537  if (!
Other.isUpperWrapped())
 
  538    return Other.getUpper().ule(Upper) ||
 
  539           Lower.ule(
Other.getLower());
 
  541  return Other.getUpper().ule(Upper) && Lower.ule(
Other.getLower());
 
 
  594         "ConstantRange types don't agree!");
 
  604    if (Lower.ult(CR.Lower)) {
 
  607      if (Upper.ule(CR.Lower))
 
  612      if (Upper.ult(CR.Upper))
 
  621    if (Upper.ult(CR.Upper))
 
  626    if (Lower.ult(CR.Upper))
 
  635    if (CR.Lower.
ult(Upper)) {
 
  638      if (CR.Upper.
ult(Upper))
 
  643      if (CR.Upper.
ule(Lower))
 
  650    if (CR.Lower.
ult(Lower)) {
 
  653      if (CR.Upper.
ule(Lower))
 
  666  if (CR.Upper.
ult(Upper)) {
 
  669    if (CR.Lower.
ult(Upper))
 
  674    if (CR.Lower.
ult(Lower))
 
  681  if (CR.Upper.
ule(Lower)) {
 
  684    if (CR.Lower.
ult(Lower))
 
 
  700         "ConstantRange types don't agree!");
 
  714    if (CR.Upper.
ult(Lower) || Upper.ult(CR.Lower))
 
  718    APInt L = CR.Lower.
ult(Lower) ? CR.Lower : Lower;
 
  719    APInt U = (CR.Upper - 1).ugt(Upper - 1) ? CR.Upper : Upper;
 
  721    if (L.isZero() && U.isZero())
 
  730    if (CR.Upper.
ule(Upper) || CR.Lower.
uge(Lower))
 
  735    if (CR.Lower.
ule(Upper) && Lower.ule(CR.Upper))
 
  743    if (Upper.ult(CR.Lower) && CR.Upper.
ult(Lower))
 
  749    if (Upper.ult(CR.Lower) && Lower.ule(CR.Upper))
 
  755           "ConstantRange::unionWith missed a case with one range wrapped");
 
  761  if (CR.Lower.
ule(Upper) || Lower.ule(CR.Upper))
 
  764  APInt L = CR.Lower.
ult(Lower) ? CR.Lower : Lower;
 
  765  APInt U = CR.Upper.
ugt(Upper) ? CR.Upper : Upper;
 
 
  770std::optional<ConstantRange>
 
  779std::optional<ConstantRange>
 
  793  case Instruction::Trunc:
 
  795  case Instruction::SExt:
 
  797  case Instruction::ZExt:
 
  799  case Instruction::BitCast:
 
  801  case Instruction::FPToUI:
 
  802  case Instruction::FPToSI:
 
  806      return getFull(ResultBitWidth);
 
  807  case Instruction::UIToFP: {
 
  812    if (ResultBitWidth > BW) {
 
  813      Min = Min.
zext(ResultBitWidth);
 
  814      Max = Max.zext(ResultBitWidth);
 
  816    return getNonEmpty(std::move(Min), std::move(Max) + 1);
 
  818  case Instruction::SIToFP: {
 
  823    if (ResultBitWidth > BW) {
 
  829  case Instruction::FPTrunc:
 
  830  case Instruction::FPExt:
 
  831  case Instruction::IntToPtr:
 
  832  case Instruction::PtrToAddr:
 
  833  case Instruction::PtrToInt:
 
  834  case Instruction::AddrSpaceCast:
 
  836    return getFull(ResultBitWidth);
 
 
  844  assert(SrcTySize < DstTySize && 
"Not a value extension");
 
  847    APInt LowerExt(DstTySize, 0);
 
  849      LowerExt = Lower.
zext(DstTySize);
 
  854  return ConstantRange(Lower.zext(DstTySize), Upper.zext(DstTySize));
 
 
  861  assert(SrcTySize < DstTySize && 
"Not a value extension");
 
  864  if (Upper.isMinSignedValue())
 
  865    return ConstantRange(Lower.sext(DstTySize), Upper.zext(DstTySize));
 
  872  return ConstantRange(Lower.sext(DstTySize), Upper.sext(DstTySize));
 
 
  876                                      unsigned NoWrapKind)
 const {
 
  879    return getEmpty(DstTySize);
 
  881    return getFull(DstTySize);
 
  883  APInt LowerDiv(Lower), UpperDiv(Upper);
 
  892    if (Upper.getActiveBits() > DstTySize)
 
  893      return getFull(DstTySize);
 
  902      if (Upper.countr_one() == DstTySize)
 
  903        return getFull(DstTySize);
 
  909      if (LowerDiv == UpperDiv)
 
  915  if (LowerDiv.getActiveBits() > DstTySize) {
 
  927  if (UpperDivWidth <= DstTySize)
 
  929                         UpperDiv.
trunc(DstTySize)).unionWith(Union);
 
  936  if (UpperDivWidth == DstTySize + 1) {
 
  939    if (UpperDiv.
ult(LowerDiv))
 
  941                           UpperDiv.
trunc(DstTySize)).unionWith(Union);
 
  944  return getFull(DstTySize);
 
 
  949  if (SrcTySize > DstTySize)
 
  951  if (SrcTySize < DstTySize)
 
 
  958  if (SrcTySize > DstTySize)
 
  960  if (SrcTySize < DstTySize)
 
 
  970  case Instruction::Add:
 
  972  case Instruction::Sub:
 
  974  case Instruction::Mul:
 
  976  case Instruction::UDiv:
 
  978  case Instruction::SDiv:
 
  980  case Instruction::URem:
 
  982  case Instruction::SRem:
 
  984  case Instruction::Shl:
 
  986  case Instruction::LShr:
 
  988  case Instruction::AShr:
 
  990  case Instruction::And:
 
  992  case Instruction::Or:
 
  994  case Instruction::Xor:
 
  998  case Instruction::FAdd:
 
 1000  case Instruction::FSub:
 
 1002  case Instruction::FMul:
 
 
 1012                                                 unsigned NoWrapKind)
 const {
 
 1016  case Instruction::Add:
 
 1018  case Instruction::Sub:
 
 1020  case Instruction::Mul:
 
 1022  case Instruction::Shl:
 
 
 1032  switch (IntrinsicID) {
 
 1033  case Intrinsic::uadd_sat:
 
 1034  case Intrinsic::usub_sat:
 
 1035  case Intrinsic::sadd_sat:
 
 1036  case Intrinsic::ssub_sat:
 
 1037  case Intrinsic::umin:
 
 1038  case Intrinsic::umax:
 
 1039  case Intrinsic::smin:
 
 1040  case Intrinsic::smax:
 
 1041  case Intrinsic::abs:
 
 1042  case Intrinsic::ctlz:
 
 1043  case Intrinsic::cttz:
 
 1044  case Intrinsic::ctpop:
 
 
 1053  switch (IntrinsicID) {
 
 1054  case Intrinsic::uadd_sat:
 
 1055    return Ops[0].uadd_sat(
Ops[1]);
 
 1056  case Intrinsic::usub_sat:
 
 1057    return Ops[0].usub_sat(
Ops[1]);
 
 1058  case Intrinsic::sadd_sat:
 
 1059    return Ops[0].sadd_sat(
Ops[1]);
 
 1060  case Intrinsic::ssub_sat:
 
 1061    return Ops[0].ssub_sat(
Ops[1]);
 
 1062  case Intrinsic::umin:
 
 1063    return Ops[0].umin(
Ops[1]);
 
 1064  case Intrinsic::umax:
 
 1065    return Ops[0].umax(
Ops[1]);
 
 1066  case Intrinsic::smin:
 
 1067    return Ops[0].smin(
Ops[1]);
 
 1068  case Intrinsic::smax:
 
 1069    return Ops[0].smax(
Ops[1]);
 
 1070  case Intrinsic::abs: {
 
 1071    const APInt *IntMinIsPoison = 
Ops[1].getSingleElement();
 
 1072    assert(IntMinIsPoison && 
"Must be known (immarg)");
 
 1076  case Intrinsic::ctlz: {
 
 1077    const APInt *ZeroIsPoison = 
Ops[1].getSingleElement();
 
 1078    assert(ZeroIsPoison && 
"Must be known (immarg)");
 
 1082  case Intrinsic::cttz: {
 
 1083    const APInt *ZeroIsPoison = 
Ops[1].getSingleElement();
 
 1084    assert(ZeroIsPoison && 
"Must be known (immarg)");
 
 1088  case Intrinsic::ctpop:
 
 1089    return Ops[0].ctpop();
 
 
 1105  if (NewLower == NewUpper)
 
 1109  if (
X.isSizeStrictlySmallerThan(*
this) ||
 
 1110      X.isSizeStrictlySmallerThan(
Other))
 
 
 1117                                           unsigned NoWrapKind,
 
 1134  if (NoWrapKind & OBO::NoSignedWrap)
 
 1137  if (NoWrapKind & OBO::NoUnsignedWrap)
 
 
 1152  if (NewLower == NewUpper)
 
 1156  if (
X.isSizeStrictlySmallerThan(*
this) ||
 
 1157      X.isSizeStrictlySmallerThan(
Other))
 
 
 1164                                           unsigned NoWrapKind,
 
 1181  if (NoWrapKind & OBO::NoSignedWrap)
 
 1184  if (NoWrapKind & OBO::NoUnsignedWrap) {
 
 
 1230                                            this_max * Other_max + 1);
 
 1252  auto L = {this_min * Other_min, this_min * Other_max,
 
 1253            this_max * Other_min, this_max * Other_max};
 
 1254  auto Compare = [](
const APInt &
A, 
const APInt &
B) { 
return A.slt(
B); };
 
 1255  ConstantRange Result_sext(std::min(L, Compare), std::max(L, Compare) + 1);
 
 
 1263                                  unsigned NoWrapKind,
 
 1281      !Result.isAllNonNegative()) {
 
 1283      Result = Result.intersectWith(
 
 
 1301  bool O1, O2, O3, O4;
 
 1302  auto Muls = {Min.
smul_ov(OtherMin, O1), Min.
smul_ov(OtherMax, O2),
 
 1303               Max.smul_ov(OtherMin, O3), Max.smul_ov(OtherMax, O4)};
 
 1304  if (O1 || O2 || O3 || O4)
 
 1307  auto Compare = [](
const APInt &
A, 
const APInt &
B) { 
return A.slt(
B); };
 
 1308  return getNonEmpty(std::min(Muls, Compare), std::max(Muls, Compare) + 1);
 
 
 1369  if (
isEmptySet() || RHS.isEmptySet() || RHS.getUnsignedMax().isZero())
 
 1374  APInt RHS_umin = RHS.getUnsignedMin();
 
 1378    if (RHS.getUpper() == 1)
 
 1379      RHS_umin = RHS.getLower();
 
 1385  return getNonEmpty(std::move(Lower), std::move(Upper));
 
 
 1396  auto [PosR, NegR] = RHS.splitPosNeg();
 
 1399  if (!PosL.isEmptySet() && !PosR.isEmptySet())
 
 1402                           (PosL.Upper - 1).sdiv(PosR.Lower) + 1);
 
 1404  if (!NegL.isEmptySet() && !NegR.isEmptySet()) {
 
 1412    if (NegL.Lower.isMinSignedValue() && NegR.Upper.isZero()) {
 
 1415      if (!NegR.Lower.isAllOnes()) {
 
 1417        if (RHS.Lower.isAllOnes())
 
 1419          AdjNegRUpper = RHS.Upper;
 
 1422          AdjNegRUpper = NegR.Upper - 1;
 
 1430      if (NegL.Upper != SignedMin + 1) {
 
 1432        if (Upper == SignedMin + 1)
 
 1434          AdjNegLLower = Lower;
 
 1437          AdjNegLLower = NegL.Lower + 1;
 
 1441                          AdjNegLLower.
sdiv(NegR.Upper - 1) + 1));
 
 1450  if (!PosL.isEmptySet() && !NegR.isEmptySet())
 
 1452    NegRes = 
ConstantRange((PosL.Upper - 1).sdiv(NegR.Upper - 1),
 
 1453                           PosL.Lower.sdiv(NegR.Lower) + 1);
 
 1455  if (!NegL.isEmptySet() && !PosR.isEmptySet())
 
 1459                      (NegL.Upper - 1).sdiv(PosR.Upper - 1) + 1));
 
 1465  if (
contains(Zero) && (!PosR.isEmptySet() || !NegR.isEmptySet()))
 
 
 1471  if (
isEmptySet() || RHS.isEmptySet() || RHS.getUnsignedMax().isZero())
 
 1474  if (
const APInt *RHSInt = RHS.getSingleElement()) {
 
 1476    if (RHSInt->isZero())
 
 1480      return {LHSInt->urem(*RHSInt)};
 
 
 1496  if (
const APInt *RHSInt = RHS.getSingleElement()) {
 
 1498    if (RHSInt->isZero())
 
 1502      return {LHSInt->srem(*RHSInt)};
 
 1520    if (MaxLHS.ult(MinAbsRHS))
 
 1529  if (MaxLHS.isNegative()) {
 
 1530    if (MinLHS.
ugt(-MinAbsRHS))
 
 
 1576  if ((
LHS.isFullSet() || 
RHS.isFullSet()) ||
 
 1577      (
LHS.isWrappedSet() || 
RHS.isWrappedSet()))
 
 1580  auto LLo = 
LHS.getLower();
 
 1581  auto LHi = 
LHS.getUpper() - 1;
 
 1582  auto RLo = 
RHS.getLower();
 
 1583  auto RHi = 
RHS.getUpper() - 1;
 
 1586  auto Mask = ~((LLo ^ LHi) | (RLo ^ RHi) | (LLo ^ RLo));
 
 1587  unsigned LeadingOnes = Mask.countLeadingOnes();
 
 1588  Mask.clearLowBits(
BitWidth - LeadingOnes);
 
 1592    unsigned LeadingOnes = ((BLo & BHi) | Mask).countLeadingOnes();
 
 1593    unsigned StartBit = 
BitWidth - LeadingOnes;
 
 1594    ALo.clearLowBits(StartBit);
 
 1598  auto LowerBoundByLHS = estimateBound(LLo, RLo, RHi);
 
 1599  auto LowerBoundByRHS = estimateBound(RLo, LLo, LHi);
 
 
 1645  if (
Other.isSingleElement() && 
Other.getSingleElement()->isAllOnes())
 
 1648    return Other.binaryNot();
 
 1661  if ((~LHSKnown.
Zero).isSubsetOf(RHSKnown.
One))
 
 1663  else if ((~RHSKnown.
Zero).isSubsetOf(LHSKnown.
One))
 
 
 1675  if (
const APInt *RHS = 
Other.getSingleElement()) {
 
 1680    unsigned EqualLeadingBits = (Min ^ Max).
countl_zero();
 
 1681    if (RHS->ule(EqualLeadingBits))
 
 1682      return getNonEmpty(Min << *RHS, (Max << *RHS) + 1);
 
 1692    Max <<= 
Other.getUnsignedMin();
 
 1698  if (OtherMax.
ugt(Max.countl_zero()))
 
 1703  Min <<= 
Other.getUnsignedMin();
 
 
 1713  APInt LHSMin = 
LHS.getUnsignedMin();
 
 1714  unsigned RHSMin = 
RHS.getUnsignedMin().getLimitedValue(
BitWidth);
 
 1717    return ConstantRange::getEmpty(
BitWidth);
 
 1718  APInt LHSMax = 
LHS.getUnsignedMax();
 
 1719  unsigned RHSMax = 
RHS.getUnsignedMax().getLimitedValue(
BitWidth);
 
 1720  APInt MaxShl = MinShl;
 
 1722  if (RHSMin <= MaxShAmt)
 
 1723    MaxShl = LHSMax << std::min(RHSMax, MaxShAmt);
 
 1724  RHSMin = std::max(RHSMin, MaxShAmt + 1);
 
 1726  if (RHSMin <= RHSMax)
 
 
 1733                                              const APInt &LHSMax,
 
 1740    return ConstantRange::getEmpty(
BitWidth);
 
 1741  APInt MaxShl = MinShl;
 
 1743  if (RHSMin <= MaxShAmt)
 
 1744    MaxShl = LHSMax << std::min(RHSMax, MaxShAmt);
 
 1745  RHSMin = std::max(RHSMin, MaxShAmt + 1);
 
 1747  if (RHSMin <= RHSMax)
 
 
 1754                                             const APInt &LHSMax,
 
 1755                                             unsigned RHSMin, 
unsigned RHSMax) {
 
 1760    return ConstantRange::getEmpty(
BitWidth);
 
 1761  APInt MinShl = MaxShl;
 
 1763  if (RHSMin <= MaxShAmt)
 
 1764    MinShl = LHSMin.
shl(std::min(RHSMax, MaxShAmt));
 
 1765  RHSMin = std::max(RHSMin, MaxShAmt + 1);
 
 1767  if (RHSMin <= RHSMax)
 
 
 1775  unsigned RHSMin = 
RHS.getUnsignedMin().getLimitedValue(
BitWidth);
 
 1776  unsigned RHSMax = 
RHS.getUnsignedMax().getLimitedValue(
BitWidth);
 
 
 1791                                           unsigned NoWrapKind,
 
 1796  switch (NoWrapKind) {
 
 
 1879  return getNonEmpty(std::move(NewL), std::move(NewU));
 
 
 1888  return getNonEmpty(std::move(NewL), std::move(NewU));
 
 
 1897  return getNonEmpty(std::move(NewL), std::move(NewU));
 
 
 1906  return getNonEmpty(std::move(NewL), std::move(NewU));
 
 
 1915  return getNonEmpty(std::move(NewL), std::move(NewU));
 
 
 1934            Max.smul_sat(OtherMin), Max.smul_sat(OtherMax)};
 
 1935  auto Compare = [](
const APInt &
A, 
const APInt &
B) { 
return A.slt(
B); };
 
 1936  return getNonEmpty(std::min(L, Compare), std::max(L, Compare) + 1);
 
 
 1945  return getNonEmpty(std::move(NewL), std::move(NewU));
 
 
 1953  APInt ShAmtMin = 
Other.getUnsignedMin(), ShAmtMax = 
Other.getUnsignedMax();
 
 1955  APInt NewU = Max.sshl_sat(Max.isNegative() ? ShAmtMin : ShAmtMax) + 1;
 
 1956  return getNonEmpty(std::move(NewL), std::move(NewU));
 
 
 1974    if (Upper.isStrictlyPositive() || !Lower.isStrictlyPositive())
 
 1989  if (IntMinIsPoison && 
SMin.isMinSignedValue()) {
 
 1991    if (
SMax.isMinSignedValue())
 
 1997  if (
SMin.isNonNegative())
 
 2001  if (
SMax.isNegative())
 
 
 2014  if (ZeroIsPoison && 
contains(Zero)) {
 
 
 2050         "Unexpected wrapped set.");
 
 2066            std::max(
BitWidth - LCPLength - 1, 
Lower.countr_zero()) + 1));
 
 
 2075  if (ZeroIsPoison && 
contains(Zero)) {
 
 2082    if (Lower.isZero()) {
 
 2091    } 
else if (Upper == 1) {
 
 
 2118         "Unexpected wrapped set.");
 
 2127  unsigned LCPPopCount = 
Lower.getHiBits(LCPLength).popcount();
 
 2131      LCPPopCount + (
Lower.countr_zero() < 
BitWidth - LCPLength ? 1 : 0);
 
 2136  unsigned MaxBits = LCPPopCount + (
BitWidth - LCPLength) -
 
 2137                     (Max.countr_one() < 
BitWidth - LCPLength ? 1 : 0);
 
 
 2167  APInt OtherMin = 
Other.getUnsignedMin(), OtherMax = 
Other.getUnsignedMax();
 
 2170  if (Min.
ugt(~OtherMin))
 
 2172  if (Max.ugt(~OtherMax))
 
 
 2183  APInt OtherMin = 
Other.getSignedMin(), OtherMax = 
Other.getSignedMax();
 
 2191      Min.
sgt(SignedMax - OtherMin))
 
 2193  if (Max.isNegative() && OtherMax.isNegative() &&
 
 2194      Max.slt(SignedMin - OtherMax))
 
 2197  if (Max.isNonNegative() && OtherMax.isNonNegative() &&
 
 2198      Max.sgt(SignedMax - OtherMax))
 
 2201      Min.
slt(SignedMin - OtherMin))
 
 
 2213  APInt OtherMin = 
Other.getUnsignedMin(), OtherMax = 
Other.getUnsignedMax();
 
 2216  if (Max.ult(OtherMin))
 
 2218  if (Min.
ult(OtherMax))
 
 
 2229  APInt OtherMin = 
Other.getSignedMin(), OtherMax = 
Other.getSignedMax();
 
 2237      Min.
sgt(SignedMax + OtherMax))
 
 2240      Max.slt(SignedMin + OtherMin))
 
 2243  if (Max.isNonNegative() && OtherMin.
isNegative() &&
 
 2244      Max.sgt(SignedMax + OtherMin))
 
 2246  if (Min.
isNegative() && OtherMax.isNonNegative() &&
 
 2247      Min.
slt(SignedMin + OtherMax))
 
 
 2259  APInt OtherMin = 
Other.getUnsignedMin(), OtherMax = 
Other.getUnsignedMax();
 
 2262  (void) Min.
umul_ov(OtherMin, Overflow);
 
 2266  (void) Max.umul_ov(OtherMax, Overflow);
 
 
 2279    OS << 
"[" << Lower << 
"," << Upper << 
")";
 
 
 2282#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 
 2289  const unsigned NumRanges = Ranges.getNumOperands() / 2;
 
 2290  assert(NumRanges >= 1 && 
"Must have at least one range!");
 
 2291  assert(Ranges.getNumOperands() % 2 == 0 && 
"Must be a sequence of pairs");
 
 2296  ConstantRange CR(FirstLow->getValue(), FirstHigh->getValue());
 
 2298  for (
unsigned i = 1; i < NumRanges; ++i) {
 
 
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
 
This file implements a class to represent arbitrary precision integral constant values and operations...
 
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
 
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
 
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
 
static APInt estimateBitMaskedAndLowerBound(const ConstantRange &LHS, const ConstantRange &RHS)
Estimate the 'bit-masked AND' operation's lower bound.
 
static ConstantRange computeShlNUW(const ConstantRange &LHS, const ConstantRange &RHS)
 
static ConstantRange getUnsignedPopCountRange(const APInt &Lower, const APInt &Upper)
 
static ConstantRange computeShlNSW(const ConstantRange &LHS, const ConstantRange &RHS)
 
static ConstantRange makeExactMulNUWRegion(const APInt &V)
Exact mul nuw region for single element RHS.
 
static ConstantRange computeShlNSWWithNNegLHS(const APInt &LHSMin, const APInt &LHSMax, unsigned RHSMin, unsigned RHSMax)
 
static ConstantRange makeExactMulNSWRegion(const APInt &V)
Exact mul nsw region for single element RHS.
 
static ConstantRange getPreferredRange(const ConstantRange &CR1, const ConstantRange &CR2, ConstantRange::PreferredRangeType Type)
 
static ConstantRange getUnsignedCountTrailingZerosRange(const APInt &Lower, const APInt &Upper)
 
static ConstantRange computeShlNSWWithNegLHS(const APInt &LHSMin, const APInt &LHSMax, unsigned RHSMin, unsigned RHSMax)
 
This file contains the declarations for the subclasses of Constant, which represent the different fla...
 
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
 
static bool isZero(Value *V, const DataLayout &DL, DominatorTree *DT, AssumptionCache *AC)
 
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
 
Class for arbitrary precision integers.
 
LLVM_ABI APInt umul_ov(const APInt &RHS, bool &Overflow) const
 
LLVM_ABI APInt usub_sat(const APInt &RHS) const
 
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
 
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
 
void clearBit(unsigned BitPosition)
Set a given bit to 0.
 
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
 
static APInt getSignMask(unsigned BitWidth)
Get the SignMask for a specific bit width.
 
bool isMinSignedValue() const
Determine if this is the smallest signed value.
 
unsigned getActiveBits() const
Compute the number of active bits in the value.
 
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
 
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
 
LLVM_ABI APInt sshl_ov(const APInt &Amt, bool &Overflow) const
 
LLVM_ABI APInt smul_sat(const APInt &RHS) const
 
unsigned countLeadingOnes() const
 
LLVM_ABI APInt sadd_sat(const APInt &RHS) const
 
bool sgt(const APInt &RHS) const
Signed greater than comparison.
 
bool ugt(const APInt &RHS) const
Unsigned greater than comparison.
 
static APInt getBitsSet(unsigned numBits, unsigned loBit, unsigned hiBit)
Get a value with a block of bits set.
 
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
 
void setSignBit()
Set the sign bit to 1.
 
unsigned getBitWidth() const
Return the number of bits in the APInt.
 
bool ult(const APInt &RHS) const
Unsigned less than comparison.
 
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
 
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
 
bool isNegative() const
Determine sign of this APInt.
 
LLVM_ABI APInt sdiv(const APInt &RHS) const
Signed division function for APInt.
 
bool sle(const APInt &RHS) const
Signed less or equal comparison.
 
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
 
LLVM_ABI APInt sshl_sat(const APInt &RHS) const
 
LLVM_ABI APInt ushl_sat(const APInt &RHS) const
 
LLVM_ABI APInt ushl_ov(const APInt &Amt, bool &Overflow) const
 
unsigned countLeadingZeros() const
 
unsigned countl_one() const
Count the number of leading one bits.
 
void clearLowBits(unsigned loBits)
Set bottom loBits bits to 0.
 
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
 
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
 
void setAllBits()
Set every bit to 1.
 
bool getBoolValue() const
Convert APInt to a boolean value.
 
LLVM_ABI APInt smul_ov(const APInt &RHS, bool &Overflow) const
 
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
 
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
 
LLVM_ABI APInt sext(unsigned width) const
Sign extend to a new width.
 
APInt shl(unsigned shiftAmt) const
Left-shift function.
 
LLVM_ABI APInt umul_sat(const APInt &RHS) const
 
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
 
bool slt(const APInt &RHS) const
Signed less than comparison.
 
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
 
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
 
bool sge(const APInt &RHS) const
Signed greater or equal comparison.
 
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
 
static APInt getOneBitSet(unsigned numBits, unsigned BitNo)
Return an APInt with exactly one bit set in the result.
 
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
 
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
 
LLVM_ABI APInt ssub_sat(const APInt &RHS) const
 
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
 
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
 
@ ICMP_SLT
signed less than
 
@ ICMP_SLE
signed less or equal
 
@ ICMP_UGE
unsigned greater or equal
 
@ ICMP_UGT
unsigned greater than
 
@ ICMP_SGT
signed greater than
 
@ ICMP_ULT
unsigned less than
 
@ ICMP_SGE
signed greater or equal
 
@ ICMP_ULE
unsigned less or equal
 
static bool isRelational(Predicate P)
Return true if the predicate is relational (not EQ or NE).
 
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
 
static bool isIntPredicate(Predicate P)
 
This class represents a range of values.
 
LLVM_ABI ConstantRange multiply(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a multiplication of a value in thi...
 
LLVM_ABI ConstantRange add(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an addition of a value in this ran...
 
LLVM_ABI bool isUpperSignWrapped() const
Return true if the (exclusive) upper bound wraps around the signed domain.
 
LLVM_ABI unsigned getActiveBits() const
Compute the maximal number of active bits needed to represent every value in this range.
 
LLVM_ABI ConstantRange zextOrTrunc(uint32_t BitWidth) const
Make this range have the bit width given by BitWidth.
 
PreferredRangeType
If represented precisely, the result of some range operations may consist of multiple disjoint ranges...
 
LLVM_ABI std::optional< ConstantRange > exactUnionWith(const ConstantRange &CR) const
Union the two ranges and return the result if it can be represented exactly, otherwise return std::nu...
 
LLVM_ABI bool getEquivalentICmp(CmpInst::Predicate &Pred, APInt &RHS) const
Set up Pred and RHS such that ConstantRange::makeExactICmpRegion(Pred, RHS) == *this.
 
LLVM_ABI ConstantRange umul_sat(const ConstantRange &Other) const
Perform an unsigned saturating multiplication of two constant ranges.
 
static LLVM_ABI CmpInst::Predicate getEquivalentPredWithFlippedSignedness(CmpInst::Predicate Pred, const ConstantRange &CR1, const ConstantRange &CR2)
If the comparison between constant ranges this and Other is insensitive to the signedness of the comp...
 
LLVM_ABI ConstantRange subtract(const APInt &CI) const
Subtract the specified constant from the endpoints of this constant range.
 
const APInt * getSingleElement() const
If this set contains a single element, return it, otherwise return null.
 
LLVM_ABI ConstantRange binaryXor(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a binary-xor of a value in this ra...
 
const APInt * getSingleMissingElement() const
If this set contains all but a single element, return it, otherwise return null.
 
static LLVM_ABI ConstantRange fromKnownBits(const KnownBits &Known, bool IsSigned)
Initialize a range based on a known bits constraint.
 
const APInt & getLower() const
Return the lower value for this range.
 
LLVM_ABI OverflowResult unsignedSubMayOverflow(const ConstantRange &Other) const
Return whether unsigned sub of the two ranges always/never overflows.
 
LLVM_ABI bool isAllNegative() const
Return true if all values in this range are negative.
 
LLVM_ABI OverflowResult unsignedAddMayOverflow(const ConstantRange &Other) const
Return whether unsigned add of the two ranges always/never overflows.
 
LLVM_ABI ConstantRange urem(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned remainder operation of...
 
LLVM_ABI ConstantRange sshl_sat(const ConstantRange &Other) const
Perform a signed saturating left shift of this constant range by a value in Other.
 
LLVM_ABI ConstantRange smul_fast(const ConstantRange &Other) const
Return range of possible values for a signed multiplication of this and Other.
 
LLVM_ABI ConstantRange lshr(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a logical right shift of a value i...
 
LLVM_ABI KnownBits toKnownBits() const
Return known bits for values in this range.
 
LLVM_ABI ConstantRange castOp(Instruction::CastOps CastOp, uint32_t BitWidth) const
Return a new range representing the possible values resulting from an application of the specified ca...
 
LLVM_ABI ConstantRange umin(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned minimum of a value in ...
 
LLVM_ABI APInt getUnsignedMin() const
Return the smallest unsigned value contained in the ConstantRange.
 
LLVM_ABI ConstantRange difference(const ConstantRange &CR) const
Subtract the specified range from this range (aka relative complement of the sets).
 
LLVM_ABI bool isFullSet() const
Return true if this set contains all of the elements possible for this data-type.
 
LLVM_ABI ConstantRange srem(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed remainder operation of a ...
 
LLVM_ABI bool icmp(CmpInst::Predicate Pred, const ConstantRange &Other) const
Does the predicate Pred hold between ranges this and Other?
 
LLVM_ABI ConstantRange sadd_sat(const ConstantRange &Other) const
Perform a signed saturating addition of two constant ranges.
 
LLVM_ABI ConstantRange ushl_sat(const ConstantRange &Other) const
Perform an unsigned saturating left shift of this constant range by a value in Other.
 
static LLVM_ABI ConstantRange intrinsic(Intrinsic::ID IntrinsicID, ArrayRef< ConstantRange > Ops)
Compute range of intrinsic result for the given operand ranges.
 
LLVM_ABI void dump() const
Allow printing from a debugger easily.
 
LLVM_ABI bool isEmptySet() const
Return true if this set contains no members.
 
LLVM_ABI ConstantRange smul_sat(const ConstantRange &Other) const
Perform a signed saturating multiplication of two constant ranges.
 
LLVM_ABI bool isAllPositive() const
Return true if all values in this range are positive.
 
LLVM_ABI ConstantRange shl(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a left shift of a value in this ra...
 
LLVM_ABI ConstantRange zeroExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
 
LLVM_ABI bool isSignWrappedSet() const
Return true if this set wraps around the signed domain.
 
LLVM_ABI bool isSizeLargerThan(uint64_t MaxSize) const
Compare set size of this range with Value.
 
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
 
LLVM_ABI ConstantRange abs(bool IntMinIsPoison=false) const
Calculate absolute value range.
 
static LLVM_ABI bool isIntrinsicSupported(Intrinsic::ID IntrinsicID)
Returns true if ConstantRange calculations are supported for intrinsic with IntrinsicID.
 
static LLVM_ABI ConstantRange makeSatisfyingICmpRegion(CmpInst::Predicate Pred, const ConstantRange &Other)
Produce the largest range such that all values in the returned range satisfy the given predicate with...
 
LLVM_ABI bool isWrappedSet() const
Return true if this set wraps around the unsigned domain.
 
LLVM_ABI ConstantRange usub_sat(const ConstantRange &Other) const
Perform an unsigned saturating subtraction of two constant ranges.
 
LLVM_ABI ConstantRange uadd_sat(const ConstantRange &Other) const
Perform an unsigned saturating addition of two constant ranges.
 
LLVM_ABI ConstantRange overflowingBinaryOp(Instruction::BinaryOps BinOp, const ConstantRange &Other, unsigned NoWrapKind) const
Return a new range representing the possible values resulting from an application of the specified ov...
 
LLVM_ABI void print(raw_ostream &OS) const
Print out the bounds to a stream.
 
LLVM_ABI ConstantRange(uint32_t BitWidth, bool isFullSet)
Initialize a full or empty set for the specified bit width.
 
LLVM_ABI OverflowResult unsignedMulMayOverflow(const ConstantRange &Other) const
Return whether unsigned mul of the two ranges always/never overflows.
 
LLVM_ABI std::pair< ConstantRange, ConstantRange > splitPosNeg() const
Split the ConstantRange into positive and negative components, ignoring zero values.
 
LLVM_ABI ConstantRange subWithNoWrap(const ConstantRange &Other, unsigned NoWrapKind, PreferredRangeType RangeType=Smallest) const
Return a new range representing the possible values resulting from an subtraction with wrap type NoWr...
 
bool isSingleElement() const
Return true if this set contains exactly one member.
 
LLVM_ABI ConstantRange truncate(uint32_t BitWidth, unsigned NoWrapKind=0) const
Return a new range in the specified integer type, which must be strictly smaller than the current typ...
 
LLVM_ABI ConstantRange ssub_sat(const ConstantRange &Other) const
Perform a signed saturating subtraction of two constant ranges.
 
LLVM_ABI bool isAllNonNegative() const
Return true if all values in this range are non-negative.
 
LLVM_ABI ConstantRange umax(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned maximum of a value in ...
 
LLVM_ABI ConstantRange signExtend(uint32_t BitWidth) const
Return a new range in the specified integer type, which must be strictly larger than the current type...
 
static LLVM_ABI ConstantRange makeAllowedICmpRegion(CmpInst::Predicate Pred, const ConstantRange &Other)
Produce the smallest range such that all values that may satisfy the given predicate with any value c...
 
LLVM_ABI ConstantRange sdiv(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed division of a value in th...
 
const APInt & getUpper() const
Return the upper value for this range.
 
LLVM_ABI bool isUpperWrapped() const
Return true if the exclusive upper bound wraps around the unsigned domain.
 
LLVM_ABI ConstantRange shlWithNoWrap(const ConstantRange &Other, unsigned NoWrapKind, PreferredRangeType RangeType=Smallest) const
Return a new range representing the possible values resulting from a left shift with wrap type NoWrap...
 
LLVM_ABI ConstantRange unionWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the union of this range with another range.
 
static LLVM_ABI ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
 
LLVM_ABI ConstantRange inverse() const
Return a new range that is the logical not of the current set.
 
LLVM_ABI std::optional< ConstantRange > exactIntersectWith(const ConstantRange &CR) const
Intersect the two ranges and return the result if it can be represented exactly, otherwise return std...
 
LLVM_ABI ConstantRange ashr(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a arithmetic right shift of a valu...
 
LLVM_ABI ConstantRange binaryAnd(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a binary-and of a value in this ra...
 
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
 
static LLVM_ABI bool areInsensitiveToSignednessOfInvertedICmpPredicate(const ConstantRange &CR1, const ConstantRange &CR2)
Return true iff CR1 ult CR2 is equivalent to CR1 sge CR2.
 
LLVM_ABI OverflowResult signedAddMayOverflow(const ConstantRange &Other) const
Return whether signed add of the two ranges always/never overflows.
 
LLVM_ABI APInt getUnsignedMax() const
Return the largest unsigned value contained in the ConstantRange.
 
LLVM_ABI ConstantRange addWithNoWrap(const ConstantRange &Other, unsigned NoWrapKind, PreferredRangeType RangeType=Smallest) const
Return a new range representing the possible values resulting from an addition with wrap type NoWrapK...
 
LLVM_ABI ConstantRange intersectWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the intersection of this range with another range.
 
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
 
OverflowResult
Represents whether an operation on the given constant range is known to always or never overflow.
 
@ NeverOverflows
Never overflows.
 
@ AlwaysOverflowsHigh
Always overflows in the direction of signed/unsigned max value.
 
@ AlwaysOverflowsLow
Always overflows in the direction of signed/unsigned min value.
 
@ MayOverflow
May or may not overflow.
 
static LLVM_ABI ConstantRange makeMaskNotEqualRange(const APInt &Mask, const APInt &C)
Initialize a range containing all values X that satisfy (X & Mask) / != C.
 
static LLVM_ABI bool areInsensitiveToSignednessOfICmpPredicate(const ConstantRange &CR1, const ConstantRange &CR2)
Return true iff CR1 ult CR2 is equivalent to CR1 slt CR2.
 
LLVM_ABI ConstantRange cttz(bool ZeroIsPoison=false) const
Calculate cttz range.
 
static ConstantRange getNonEmpty(APInt Lower, APInt Upper)
Create non-empty constant range with the given bounds.
 
LLVM_ABI ConstantRange ctpop() const
Calculate ctpop range.
 
static LLVM_ABI ConstantRange makeGuaranteedNoWrapRegion(Instruction::BinaryOps BinOp, const ConstantRange &Other, unsigned NoWrapKind)
Produce the largest range containing all X such that "X BinOp Y" is guaranteed not to wrap (overflow)...
 
LLVM_ABI ConstantRange smin(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed minimum of a value in thi...
 
LLVM_ABI ConstantRange udiv(const ConstantRange &Other) const
Return a new range representing the possible values resulting from an unsigned division of a value in...
 
LLVM_ABI unsigned getMinSignedBits() const
Compute the maximal number of bits needed to represent every value in this signed range.
 
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
 
LLVM_ABI ConstantRange binaryNot() const
Return a new range representing the possible values resulting from a binary-xor of a value in this ra...
 
LLVM_ABI ConstantRange smax(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a signed maximum of a value in thi...
 
LLVM_ABI ConstantRange binaryOp(Instruction::BinaryOps BinOp, const ConstantRange &Other) const
Return a new range representing the possible values resulting from an application of the specified bi...
 
LLVM_ABI ConstantRange binaryOr(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a binary-or of a value in this ran...
 
LLVM_ABI OverflowResult signedSubMayOverflow(const ConstantRange &Other) const
Return whether signed sub of the two ranges always/never overflows.
 
LLVM_ABI ConstantRange ctlz(bool ZeroIsPoison=false) const
Calculate ctlz range.
 
LLVM_ABI ConstantRange sub(const ConstantRange &Other) const
Return a new range representing the possible values resulting from a subtraction of a value in this r...
 
LLVM_ABI ConstantRange sextOrTrunc(uint32_t BitWidth) const
Make this range have the bit width given by BitWidth.
 
static LLVM_ABI ConstantRange makeExactNoWrapRegion(Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.
 
LLVM_ABI bool isSizeStrictlySmallerThan(const ConstantRange &CR) const
Compare set size of this range with the range CR.
 
LLVM_ABI ConstantRange multiplyWithNoWrap(const ConstantRange &Other, unsigned NoWrapKind, PreferredRangeType RangeType=Smallest) const
Return a new range representing the possible values resulting from a multiplication with wrap type No...
 
Predicate getFlippedSignednessPredicate() const
For example, SLT->ULT, ULT->SLT, SLE->ULE, ULE->SLE, EQ->EQ.
 
Utility class for integer operators which may exhibit overflow - Add, Sub, Mul, and Shl.
 
The instances of the Type class are immutable: once they are created, they are never changed.
 
This class implements an extremely fast bulk output stream that can only output to a stream.
 
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
 
LLVM_ABI std::optional< unsigned > GetMostSignificantDifferentBit(const APInt &A, const APInt &B)
Compare two values, and if they are different, return the position of the most significant bit that i...
 
LLVM_ABI APInt RoundingUDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A unsign-divided by B, rounded by the given rounding mode.
 
LLVM_ABI APInt RoundingSDiv(const APInt &A, const APInt &B, APInt::Rounding RM)
Return A sign-divided by B, rounded by the given rounding mode.
 
const APInt & smin(const APInt &A, const APInt &B)
Determine the smaller of two APInts considered to be signed.
 
const APInt & smax(const APInt &A, const APInt &B)
Determine the larger of two APInts considered to be signed.
 
const APInt & umin(const APInt &A, const APInt &B)
Determine the smaller of two APInts considered to be unsigned.
 
const APInt & umax(const APInt &A, const APInt &B)
Determine the larger of two APInts considered to be unsigned.
 
@ C
The default llvm calling convention, compatible with C.
 
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
 
This is an optimization pass for GlobalISel generic memory operations.
 
GCNRegPressure max(const GCNRegPressure &P1, const GCNRegPressure &P2)
 
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
 
LLVM_ABI ConstantRange getConstantRangeFromMetadata(const MDNode &RangeMD)
Parse out a conservative ConstantRange from !range metadata.
 
int countl_zero(T Val)
Count number of 0's from the most significant bit to the least stopping at the first 1.
 
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
 
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
 
@ SMax
Signed integer max implemented in terms of select(cmp()).
 
@ SMin
Signed integer min implemented in terms of select(cmp()).
 
@ UMax
Unsigned integer max implemented in terms of select(cmp()).
 
constexpr unsigned BitWidth
 
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
 
Implement std::hash so that hash_code can be used in STL containers.
 
static KnownBits makeConstant(const APInt &C)
Create known bits from a known constant.
 
bool isNonNegative() const
Returns true if this value is known to be non-negative.
 
bool isUnknown() const
Returns true if we don't know any bits.
 
bool hasConflict() const
Returns true if there is conflicting information.
 
unsigned getBitWidth() const
Get the bit width of this value.
 
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
 
APInt getMinValue() const
Return the minimal unsigned value possible given these KnownBits.
 
bool isNegative() const
Returns true if this value is known to be negative.