Home | History | Annotate | Download | only in Support

Lines Matching defs:ConstantRange

1 //===-- ConstantRange.cpp - ConstantRange implementation ------------------===//
25 #include "llvm/Support/ConstantRange.h"
32 ConstantRange::ConstantRange(uint32_t BitWidth, bool Full) {
41 ConstantRange::ConstantRange(const APInt &V) : Lower(V), Upper(V + 1) {}
43 ConstantRange::ConstantRange(const APInt &L, const APInt &U) :
46 "ConstantRange with unequal bit widths");
51 ConstantRange ConstantRange::makeICmpRegion(unsigned Pred,
52 const ConstantRange &CR) {
63 return ConstantRange(CR.getUpper(), CR.getLower());
64 return ConstantRange(W);
68 return ConstantRange(W, /* empty */ false);
69 return ConstantRange(APInt::getMinValue(W), UMax);
74 return ConstantRange(W, /* empty */ false);
75 return ConstantRange(APInt::getSignedMinValue(W), SMax);
80 return ConstantRange(W);
81 return ConstantRange(APInt::getMinValue(W), UMax + 1);
86 return ConstantRange(W);
87 return ConstantRange(APInt::getSignedMinValue(W), SMax + 1);
92 return ConstantRange(W, /* empty */ false);
93 return ConstantRange(UMin + 1, APInt::getNullValue(W));
98 return ConstantRange(W, /* empty */ false);
99 return ConstantRange(SMin + 1, APInt::getSignedMinValue(W));
104 return ConstantRange(W);
105 return ConstantRange(UMin, APInt::getNullValue(W));
110 return ConstantRange(W);
111 return ConstantRange(SMin, APInt::getSignedMinValue(W));
118 bool ConstantRange::isFullSet() const {
124 bool ConstantRange::isEmptySet() const {
131 bool ConstantRange::isWrappedSet() const {
138 bool ConstantRange::isSignWrappedSet() const {
145 APInt ConstantRange::getSetSize() const {
160 /// ConstantRange.
162 APInt ConstantRange::getUnsignedMax() const {
169 /// ConstantRange.
171 APInt ConstantRange::getUnsignedMin() const {
178 /// ConstantRange.
180 APInt ConstantRange::getSignedMax() const {
193 /// ConstantRange.
195 APInt ConstantRange::getSignedMin() const {
211 bool ConstantRange::contains(const APInt &V) const {
224 bool ConstantRange::contains(const ConstantRange &Other) const {
244 ConstantRange ConstantRange::subtract(const APInt &Val) const {
249 return ConstantRange(Lower - Val, Upper - Val);
254 ConstantRange ConstantRange::difference(const ConstantRange &CR) const {
263 ConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const {
265 "ConstantRange types don't agree!");
277 return ConstantRange(getBitWidth(), false);
280 return ConstantRange(CR.Lower, Upper);
288 return ConstantRange(Lower, CR.Upper);
290 return ConstantRange(getBitWidth(), false);
299 return ConstantRange(CR.Lower, Upper);
307 return ConstantRange(getBitWidth(), false);
309 return ConstantRange(Lower, CR.Upper);
322 return ConstantRange(Lower, CR.Upper);
330 return ConstantRange(CR.Lower, Upper);
344 ConstantRange ConstantRange::unionWith(const ConstantRange &CR) const {
346 "ConstantRange types don't agree!");
358 return ConstantRange(Lower, CR.Upper);
359 return ConstantRange(CR.Lower, Upper);
369 return ConstantRange(getBitWidth());
371 return ConstantRange(L, U);
383 return ConstantRange(getBitWidth());
391 return ConstantRange(Lower, CR.Upper);
392 return ConstantRange(CR.Lower, Upper);
398 return ConstantRange(CR.Lower, Upper);
403 "ConstantRange::unionWith missed a case with one range wrapped");
404 return ConstantRange(Lower, CR.Upper);
410 return ConstantRange(getBitWidth());
418 return ConstantRange(L, U);
425 ConstantRange ConstantRange::zeroExtend(uint32_t DstTySize) const {
426 if (isEmptySet()) return ConstantRange(DstTySize, /*isFullSet=*/false);
435 return ConstantRange(LowerExt, APInt(DstTySize, 1).shl(SrcTySize));
438 return ConstantRange(Lower.zext(DstTySize), Upper.zext(DstTySize));
445 ConstantRange ConstantRange::signExtend(uint32_t DstTySize) const {
446 if (isEmptySet()) return ConstantRange(DstTySize, /*isFullSet=*/false);
451 return ConstantRange(APInt::getHighBitsSet(DstTySize,DstTySize-SrcTySize+1),
455 return ConstantRange(Lower.sext(DstTySize), Upper.sext(DstTySize));
462 ConstantRange ConstantRange::truncate(uint32_t DstTySize) const {
465 return ConstantRange(DstTySize, /*isFullSet=*/false);
467 return ConstantRange(DstTySize, /*isFullSet=*/true);
474 ConstantRange Union(DstTySize, /*isFullSet=*/false);
482 return ConstantRange(DstTySize, /*isFullSet=*/true);
484 Union = ConstantRange(APInt::getMaxValue(DstTySize),Upper.trunc(DstTySize));
501 return ConstantRange(LowerDiv.trunc(DstTySize),
507 return ConstantRange(LowerDiv.trunc(DstTySize),
510 return ConstantRange(DstTySize, /*isFullSet=*/true);
515 ConstantRange ConstantRange::zextOrTrunc(uint32_t DstTySize) const {
526 ConstantRange ConstantRange::sextOrTrunc(uint32_t DstTySize) const {
535 ConstantRange
536 ConstantRange::add(const ConstantRange &Other) const {
538 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
540 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
546 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
548 ConstantRange X = ConstantRange(NewLower, NewUpper);
551 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
556 ConstantRange
557 ConstantRange::sub(const ConstantRange &Other) const {
559 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
561 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
567 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
569 ConstantRange X = ConstantRange(NewLower, NewUpper);
572 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
577 ConstantRange
578 ConstantRange::multiply(const ConstantRange &Other) const {
585 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
592 ConstantRange Result_zext = ConstantRange(this_min * Other_min,
597 ConstantRange
598 ConstantRange::smax(const ConstantRange &Other) const {
602 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
606 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
607 return ConstantRange(NewL, NewU);
610 ConstantRange
611 ConstantRange::umax(const ConstantRange &Other) const {
615 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
619 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
620 return ConstantRange(NewL, NewU);
623 ConstantRange
624 ConstantRange::udiv(const ConstantRange &RHS) const {
626 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
628 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
647 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
649 return ConstantRange(Lower, Upper);
652 ConstantRange
653 ConstantRange::binaryAnd(const ConstantRange &Other) const {
655 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
661 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
662 return ConstantRange(APInt::getNullValue(getBitWidth()), umin + 1);
665 ConstantRange
666 ConstantRange::binaryOr(const ConstantRange &Other) const {
668 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
674 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
675 return ConstantRange(umax, APInt::getNullValue(getBitWidth()));
678 ConstantRange
679 ConstantRange::shl(const ConstantRange &Other) const {
681 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
689 return ConstantRange(min, max + 1);
692 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
695 ConstantRange
696 ConstantRange::lshr(const ConstantRange &Other) const {
698 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
703 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
705 return ConstantRange(min, max + 1);
708 ConstantRange ConstantRange::inverse() const {
710 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
712 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
713 return ConstantRange(Upper, Lower);
718 void ConstantRange::print(raw_ostream &OS) const {
729 void ConstantRange::dump() const {