Home | History | Annotate | Download | only in IR

Lines Matching full:constantrange

1 //===-- ConstantRange.cpp - ConstantRange implementation ------------------===//
27 #include "llvm/IR/ConstantRange.h"
34 ConstantRange::ConstantRange(uint32_t BitWidth, bool Full) {
43 ConstantRange::ConstantRange(APIntMoveTy V)
46 ConstantRange::ConstantRange(APIntMoveTy L, APIntMoveTy U)
49 "ConstantRange with unequal bit widths");
54 ConstantRange ConstantRange::makeAllowedICmpRegion(CmpInst::Predicate Pred,
55 const ConstantRange &CR) {
67 return ConstantRange(CR.getUpper(), CR.getLower());
68 return ConstantRange(W);
72 return ConstantRange(W, /* empty */ false);
73 return ConstantRange(APInt::getMinValue(W), UMax);
78 return ConstantRange(W, /* empty */ false);
79 return ConstantRange(APInt::getSignedMinValue(W), SMax);
84 return ConstantRange(W);
85 return ConstantRange(APInt::getMinValue(W), UMax + 1);
90 return ConstantRange(W);
91 return ConstantRange(APInt::getSignedMinValue(W), SMax + 1);
96 return ConstantRange(W, /* empty */ false);
97 return ConstantRange(UMin + 1, APInt::getNullValue(W));
102 return ConstantRange(W, /* empty */ false);
103 return ConstantRange(SMin + 1, APInt::getSignedMinValue(W));
108 return ConstantRange(W);
109 return ConstantRange(UMin, APInt::getNullValue(W));
114 return ConstantRange(W);
115 return ConstantRange(SMin, APInt::getSignedMinValue(W));
120 ConstantRange ConstantRange::makeSatisfyingICmpRegion(CmpInst::Predicate Pred,
121 const ConstantRange &CR) {
130 ConstantRange ConstantRange::makeNoWrapRegion(Instruction::BinaryOps BinOp,
136 // intersectWith in that the ConstantRange returned will only contain elements
140 [](const ConstantRange &CR0, const ConstantRange &CR1) {
155 return ConstantRange(BitWidth, false);
159 return ConstantRange(BitWidth);
161 ConstantRange Result(BitWidth);
165 ConstantRange(APInt::getNullValue(BitWidth), -C));
170 Result, ConstantRange(APInt::getSignedMinValue(BitWidth),
174 Result, ConstantRange(APInt::getSignedMinValue(BitWidth) - C,
183 bool ConstantRange::isFullSet() const {
189 bool ConstantRange::isEmptySet() const {
196 bool ConstantRange::isWrappedSet() const {
203 bool ConstantRange::isSignWrappedSet() const {
210 APInt ConstantRange::getSetSize() const {
222 /// ConstantRange.
224 APInt ConstantRange::getUnsignedMax() const {
231 /// ConstantRange.
233 APInt ConstantRange::getUnsignedMin() const {
240 /// ConstantRange.
242 APInt ConstantRange::getSignedMax() const {
255 /// ConstantRange.
257 APInt ConstantRange::getSignedMin() const {
273 bool ConstantRange::contains(const APInt &V) const {
286 bool ConstantRange::contains(const ConstantRange &Other) const {
306 ConstantRange ConstantRange::subtract(const APInt &Val) const {
311 return ConstantRange(Lower - Val, Upper - Val);
316 ConstantRange ConstantRange::difference(const ConstantRange &CR) const {
325 ConstantRange ConstantRange::intersectWith(const ConstantRange &CR) const {
327 "ConstantRange types don't agree!");
339 return ConstantRange(getBitWidth(), false);
342 return ConstantRange(CR.Lower, Upper);
350 return ConstantRange(Lower, CR.Upper);
352 return ConstantRange(getBitWidth(), false);
361 return ConstantRange(CR.Lower, Upper);
369 return ConstantRange(getBitWidth(), false);
371 return ConstantRange(Lower, CR.Upper);
384 return ConstantRange(Lower, CR.Upper);
392 return ConstantRange(CR.Lower, Upper);
406 ConstantRange ConstantRange::unionWith(const ConstantRange &CR) const {
408 "ConstantRange types don't agree!");
420 return ConstantRange(Lower, CR.Upper);
421 return ConstantRange(CR.Lower, Upper);
431 return ConstantRange(getBitWidth());
433 return ConstantRange(L, U);
445 return ConstantRange(getBitWidth());
453 return ConstantRange(Lower, CR.Upper);
454 return ConstantRange(CR.Lower, Upper);
460 return ConstantRange(CR.Lower, Upper);
465 "ConstantRange::unionWith missed a case with one range wrapped");
466 return ConstantRange(Lower, CR.Upper);
472 return ConstantRange(getBitWidth());
480 return ConstantRange(L, U);
487 ConstantRange ConstantRange::zeroExtend(uint32_t DstTySize) const {
488 if (isEmptySet()) return ConstantRange(DstTySize, /*isFullSet=*/false);
497 return ConstantRange(LowerExt, APInt::getOneBitSet(DstTySize, SrcTySize));
500 return ConstantRange(Lower.zext(DstTySize), Upper.zext(DstTySize));
507 ConstantRange ConstantRange::signExtend(uint32_t DstTySize) const {
508 if (isEmptySet()) return ConstantRange(DstTySize, /*isFullSet=*/false);
515 return ConstantRange(Lower.sext(DstTySize), Upper.zext(DstTySize));
518 return ConstantRange(APInt::getHighBitsSet(DstTySize,DstTySize-SrcTySize+1),
522 return ConstantRange(Lower.sext(DstTySize), Upper.sext(DstTySize));
529 ConstantRange ConstantRange::truncate(uint32_t DstTySize) const {
532 return ConstantRange(DstTySize, /*isFullSet=*/false);
534 return ConstantRange(DstTySize, /*isFullSet=*/true);
541 ConstantRange Union(DstTySize, /*isFullSet=*/false);
549 return ConstantRange(DstTySize, /*isFullSet=*/true);
551 Union = ConstantRange(APInt::getMaxValue(DstTySize),Upper.trunc(DstTySize));
568 return ConstantRange(LowerDiv.trunc(DstTySize),
574 return ConstantRange(LowerDiv.trunc(DstTySize),
577 return ConstantRange(DstTySize, /*isFullSet=*/true);
582 ConstantRange ConstantRange::zextOrTrunc(uint32_t DstTySize) const {
593 ConstantRange ConstantRange::sextOrTrunc(uint32_t DstTySize) const {
602 ConstantRange
603 ConstantRange::add(const ConstantRange &Other) const {
605 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
607 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
613 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
615 ConstantRange X = ConstantRange(NewLower, NewUpper);
618 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
623 ConstantRange
624 ConstantRange::sub(const ConstantRange &Other) const {
626 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
628 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
634 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
636 ConstantRange X = ConstantRange(NewLower, NewUpper);
639 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
644 ConstantRange
645 ConstantRange::multiply(const ConstantRange &Other) const {
652 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
666 ConstantRange Result_zext = ConstantRange(this_min * Other_min,
668 ConstantRange UR = Result_zext.truncate(getBitWidth());
684 ConstantRange Result_sext(std::min(L, Compare), std::max(L, Compare) + 1);
685 ConstantRange SR = Result_sext.truncate(getBitWidth());
690 ConstantRange
691 ConstantRange::smax(const ConstantRange &Other) const {
695 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
699 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
700 return ConstantRange(NewL, NewU);
703 ConstantRange
704 ConstantRange::umax(const ConstantRange &Other) const {
708 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
712 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
713 return ConstantRange(NewL, NewU);
716 ConstantRange
717 ConstantRange::udiv(const ConstantRange &RHS) const {
719 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
721 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
740 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
742 return ConstantRange(Lower, Upper);
745 ConstantRange
746 ConstantRange::binaryAnd(const ConstantRange &Other) const {
748 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
754 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
755 return ConstantRange(APInt::getNullValue(getBitWidth()), umin + 1);
758 ConstantRange
759 ConstantRange::binaryOr(const ConstantRange &Other) const {
761 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
767 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
768 return ConstantRange(umax, APInt::getNullValue(getBitWidth()));
771 ConstantRange
772 ConstantRange::shl(const ConstantRange &Other) const {
774 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
782 return ConstantRange(min, max + 1);
785 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
788 ConstantRange
789 ConstantRange::lshr(const ConstantRange &Other) const {
791 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
796 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
798 return ConstantRange(min, max + 1);
801 ConstantRange ConstantRange::inverse() const {
803 return ConstantRange(getBitWidth(), /*isFullSet=*/false);
805 return ConstantRange(getBitWidth(), /*isFullSet=*/true);
806 return ConstantRange(Upper, Lower);
811 void ConstantRange::print(raw_ostream &OS) const {
822 void ConstantRange::dump() const {