34#define DEBUG_TYPE "instcombine"
53 unsigned Opc =
I->getOpcode();
55 case Instruction::Add:
56 case Instruction::Sub:
57 case Instruction::Mul:
58 case Instruction::And:
60 case Instruction::Xor:
61 case Instruction::AShr:
62 case Instruction::LShr:
63 case Instruction::Shl:
64 case Instruction::UDiv:
65 case Instruction::URem: {
71 if (
Opc == Instruction::LShr ||
Opc == Instruction::AShr)
75 case Instruction::Trunc:
76 case Instruction::ZExt:
77 case Instruction::SExt:
81 if (
I->getOperand(0)->getType() == Ty)
82 return I->getOperand(0);
87 Opc == Instruction::SExt);
90 if (Trunc->getType()->getScalarSizeInBits() <=
91 Ty->getScalarSizeInBits()) {
92 NewTrunc->setHasNoSignedWrap(Trunc->hasNoSignedWrap());
93 NewTrunc->setHasNoUnsignedWrap(Trunc->hasNoUnsignedWrap());
96 if (Trunc->hasNoUnsignedWrap())
101 case Instruction::Select: {
109 case Instruction::PHI: {
120 case Instruction::FPToUI:
121 case Instruction::FPToSI:
123 I->getOperand(0), Ty);
125 case Instruction::Call:
127 switch (
II->getIntrinsicID()) {
130 case Intrinsic::vscale: {
132 I->getModule(), Intrinsic::vscale, {Ty});
136 case Intrinsic::umin:
137 case Intrinsic::umax:
138 case Intrinsic::smin:
139 case Intrinsic::smax: {
145 I->getModule(),
II->getIntrinsicID(), {Ty});
149 case Intrinsic::abs: {
153 I->getModule(),
II->getIntrinsicID(), {Ty});
155 {Arg, ConstantInt::getFalse(I->getContext())});
161 case Instruction::ShuffleVector: {
184 Processed[V] = Result;
198InstCombinerImpl::isEliminableCastPair(
const CastInst *CI1,
215 if ((Res == Instruction::IntToPtr && SrcTy != DstIntPtrTy) ||
216 (Res == Instruction::PtrToInt && DstTy != SrcIntPtrTy))
238 if (CSrc->hasOneUse())
258 if (CI.
getOpcode() != Instruction::BitCast ||
288 if (SrcTy && DestTy &&
289 SrcTy->getNumElements() == DestTy->getNumElements() &&
290 SrcTy->getPrimitiveSizeInBits() == DestTy->getPrimitiveSizeInBits()) {
303class TypeEvaluationHelper {
308 [[nodiscard]]
static bool canEvaluateTruncated(
Value *V,
Type *Ty,
314 [[nodiscard]]
static bool canEvaluateZExtd(
Value *V,
Type *Ty,
315 unsigned &BitsToClear,
322 [[nodiscard]]
static bool canEvaluateSExtd(
Value *V,
Type *Ty);
327 [[nodiscard]]
static bool canAlwaysEvaluateInType(
Value *V,
Type *Ty);
330 [[nodiscard]]
bool allPendingVisited()
const {
332 [
this](
Value *V) {
return Visited.contains(V); });
340 if (canAlwaysEvaluateInType(V, Ty))
349 const auto [It,
Inserted] = Visited.insert({
V,
false});
366 return It->getSecond();
427 if (!
I->hasOneUse()) {
428 for (Use &U :
I->uses()) {
436 Pending.push_back(
U.getUser());
440 const bool Result = Pred(V, Ty);
449 [[nodiscard]]
bool canNotEvaluateInType(
Value *V,
Type *Ty);
451 [[nodiscard]]
bool canEvaluateTruncatedImpl(
Value *V,
Type *Ty,
452 InstCombinerImpl &IC,
454 [[nodiscard]]
bool canEvaluateTruncatedPred(
Value *V,
Type *Ty,
455 InstCombinerImpl &IC,
457 [[nodiscard]]
bool canEvaluateZExtdImpl(
Value *V,
Type *Ty,
458 unsigned &BitsToClear,
459 InstCombinerImpl &IC,
461 [[nodiscard]]
bool canEvaluateSExtdImpl(
Value *V,
Type *Ty);
462 [[nodiscard]]
bool canEvaluateSExtdPred(
Value *V,
Type *Ty);
466 SmallDenseMap<Value *, bool, 8> Visited;
469 SmallVector<Value *, 8> Pending;
476bool TypeEvaluationHelper::canAlwaysEvaluateInType(
Value *V,
Type *Ty) {
490bool TypeEvaluationHelper::canNotEvaluateInType(
Value *V,
Type *Ty) {
512bool TypeEvaluationHelper::canEvaluateTruncated(
Value *V,
Type *Ty,
515 TypeEvaluationHelper TYH;
516 return TYH.canEvaluateTruncatedImpl(V, Ty, IC, CxtI) &&
519 TYH.allPendingVisited();
522bool TypeEvaluationHelper::canEvaluateTruncatedImpl(
Value *V,
Type *Ty,
525 return canEvaluate(V, Ty, [
this, &IC, CxtI](
Value *V,
Type *Ty) {
526 return canEvaluateTruncatedPred(V, Ty, IC, CxtI);
530bool TypeEvaluationHelper::canEvaluateTruncatedPred(
Value *V,
Type *Ty,
534 Type *OrigTy =
V->getType();
535 switch (
I->getOpcode()) {
536 case Instruction::Add:
537 case Instruction::Sub:
538 case Instruction::Mul:
539 case Instruction::And:
540 case Instruction::Or:
541 case Instruction::Xor:
543 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
544 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
546 case Instruction::UDiv:
547 case Instruction::URem: {
557 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
558 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
562 case Instruction::Shl: {
569 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
570 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
573 case Instruction::LShr: {
588 auto DemandedBits = Trunc->getType()->getScalarSizeInBits();
590 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
591 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
594 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
595 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
599 case Instruction::AShr: {
609 unsigned ShiftedBits = OrigBitWidth -
BitWidth;
612 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
613 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
616 case Instruction::Trunc:
619 case Instruction::ZExt:
620 case Instruction::SExt:
624 case Instruction::Select: {
626 return canEvaluateTruncatedImpl(
SI->getTrueValue(), Ty, IC, CxtI) &&
627 canEvaluateTruncatedImpl(
SI->getFalseValue(), Ty, IC, CxtI);
629 case Instruction::PHI: {
636 return canEvaluateTruncatedImpl(IncValue, Ty, IC, CxtI);
639 case Instruction::FPToUI:
640 case Instruction::FPToSI: {
647 Semantics,
I->getOpcode() == Instruction::FPToSI);
650 case Instruction::ShuffleVector:
651 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
652 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
654 case Instruction::Call: {
659 return canEvaluateTruncatedImpl(AbsOp, Ty, IC, CxtI);
666 Value *Op0 = MM->getLHS();
667 Value *Op1 = MM->getRHS();
669 if (MM->isSigned()) {
680 return canEvaluateTruncatedImpl(Op0, Ty, IC, CxtI) &&
681 canEvaluateTruncatedImpl(Op1, Ty, IC, CxtI);
704 Value *VecInput =
nullptr;
713 unsigned VecWidth = VecType->getPrimitiveSizeInBits();
715 unsigned ShiftAmount = ShiftVal ? ShiftVal->
getZExtValue() : 0;
717 if ((VecWidth % DestWidth != 0) || (ShiftAmount % DestWidth != 0))
722 unsigned NumVecElts = VecWidth / DestWidth;
723 if (VecType->getElementType() != DestType) {
728 unsigned Elt = ShiftAmount / DestWidth;
730 Elt = NumVecElts - 1 - Elt;
750 Type *SrcType = Src->getType();
756 unsigned DstBits = DstType->getScalarSizeInBits();
757 unsigned TruncRatio = SrcBits / DstBits;
758 if ((SrcBits % DstBits) != 0)
763 const APInt *ShiftAmount =
nullptr;
771 auto VecElts = VecOpTy->getElementCount();
773 uint64_t BitCastNumElts = VecElts.getKnownMinValue() * TruncRatio;
776 if (Cst->
uge(std::numeric_limits<uint64_t>::max() / TruncRatio))
780 ? (VecOpIdx + 1) * TruncRatio - 1
781 : VecOpIdx * TruncRatio;
787 if (ShiftAmount->
uge(SrcBits) || ShiftAmount->
urem(DstBits) != 0)
793 assert(IdxOfs < TruncRatio &&
794 "IdxOfs is expected to be less than TruncRatio.");
799 assert(BitCastNumElts <= std::numeric_limits<uint32_t>::max() &&
813 "Don't narrow to an illegal scalar type");
825 BinaryOperator *Or0, *Or1;
829 Value *ShVal0, *ShVal1, *ShAmt0, *ShAmt1;
836 if (Or0->
getOpcode() == BinaryOperator::LShr) {
842 Or1->
getOpcode() == BinaryOperator::LShr &&
843 "Illegal or(shift,shift) pair");
852 unsigned MaxShiftAmountWidth =
Log2_32(NarrowWidth);
853 APInt HiBitMask = ~APInt::getLowBitsSet(WideWidth, MaxShiftAmountWidth);
860 if (ShVal0 != ShVal1)
866 unsigned Mask = Width - 1;
879 Value *ShAmt = matchShiftAmount(ShAmt0, ShAmt1, NarrowWidth);
882 ShAmt = matchShiftAmount(ShAmt1, ShAmt0, NarrowWidth);
900 Value *NarrowShAmt =
Builder.CreateZExtOrTrunc(ShAmt, DestTy);
903 X =
Y =
Builder.CreateTrunc(ShVal0, DestTy);
904 if (ShVal0 != ShVal1)
905 Y =
Builder.CreateTrunc(ShVal1, DestTy);
906 Intrinsic::ID IID = IsFshl ? Intrinsic::fshl : Intrinsic::fshr;
923 BinaryOperator *BinOp;
930 case Instruction::And:
931 case Instruction::Or:
932 case Instruction::Xor:
933 case Instruction::Add:
934 case Instruction::Sub:
935 case Instruction::Mul: {
962 case Instruction::LShr:
963 case Instruction::AShr: {
968 unsigned MaxShiftAmt = SrcWidth - DestWidth;
972 APInt(SrcWidth, MaxShiftAmt)))) {
974 bool IsExact = OldShift->isExact();
979 OldShift->getOpcode() == Instruction::AShr
980 ?
Builder.CreateAShr(
A, ShAmt, OldShift->getName(), IsExact)
981 :
Builder.CreateLShr(
A, ShAmt, OldShift->getName(), IsExact);
991 if (Instruction *NarrowOr = narrowFunnelShift(Trunc))
1013 Value *NarrowOp = Builder.CreateTrunc(ShufVec, NewTruncTy);
1028 assert((Opcode == Instruction::Trunc || Opcode == Instruction::FPTrunc) &&
1029 "Unexpected instruction for shrinking");
1050 Type *DestTy = Trunc.
getType(), *SrcTy = Src->getType();
1052 unsigned SrcWidth = SrcTy->getScalarSizeInBits();
1058 if ((DestTy->
isVectorTy() || shouldChangeType(SrcTy, DestTy)) &&
1059 TypeEvaluationHelper::canEvaluateTruncated(Src, DestTy, *
this, &Trunc)) {
1064 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1077 if (DestWidth * 2 < SrcWidth) {
1078 auto *NewDestTy = DestITy->getExtendedType();
1079 if (shouldChangeType(SrcTy, NewDestTy) &&
1080 TypeEvaluationHelper::canEvaluateTruncated(Src, NewDestTy, *
this,
1083 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1084 " to reduce the width of operand of"
1092 if (DestWidth == 1 &&
1102 if (DestWidth == 1) {
1124 Constant *One = ConstantInt::get(SrcTy,
APInt(SrcWidth, 1));
1132 Constant *One = ConstantInt::get(SrcTy,
APInt(SrcWidth, 1));
1170 Trunc,
Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat,
A,
B));
1179 Trunc,
Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat,
A,
B));
1183 unsigned AWidth =
A->getType()->getScalarSizeInBits();
1184 unsigned MaxShiftAmt = SrcWidth - std::max(DestWidth, AWidth);
1186 bool IsExact = OldSh->isExact();
1191 APInt(SrcWidth, MaxShiftAmt)))) {
1192 auto GetNewShAmt = [&](
unsigned Width) {
1193 Constant *MaxAmt = ConstantInt::get(SrcTy, Width - 1,
false);
1202 if (
A->getType() == DestTy) {
1203 Constant *ShAmt = GetNewShAmt(DestWidth);
1205 return IsExact ? BinaryOperator::CreateExactAShr(
A, ShAmt)
1206 : BinaryOperator::CreateAShr(
A, ShAmt);
1210 if (Src->hasOneUse()) {
1211 Constant *ShAmt = GetNewShAmt(AWidth);
1228 if (Src->hasOneUse() &&
1236 APInt Threshold =
APInt(
C->getType()->getScalarSizeInBits(), DestWidth);
1243 Value *NewTrunc =
Builder.CreateTrunc(
A, DestTy,
A->getName() +
".tr",
1247 NewShl->setHasNoUnsignedWrap(NUW);
1248 NewShl->setHasNoSignedWrap(NSW);
1256 if (SrcTy->isIntegerTy() &&
isPowerOf2_64(SrcTy->getPrimitiveSizeInBits()) &&
1264 APInt UpperBound =
C->getUniqueInteger();
1267 if (!UpperBound.
isZero() && UpperBound - 1 == TruncatedMax) {
1269 {ConstantInt::get(SrcTy, 0),
A});
1271 Intrinsic::smin, {SrcTy},
1272 {
SMax, ConstantInt::get(SrcTy, TruncatedMax)});
1285 unsigned AWidth =
A->getType()->getScalarSizeInBits();
1286 if (AWidth == DestWidth && AWidth >
Log2_32(SrcWidth)) {
1287 Value *WidthDiff = ConstantInt::get(
A->getType(), SrcWidth - AWidth);
1290 return BinaryOperator::CreateAdd(NarrowCtlz, WidthDiff);
1300 if (
Log2_32(*MaxVScale) < DestWidth)
1312 Trunc,
Builder.CreateIntrinsic(DestTy, CI->getIntrinsicID(),
1313 {CI->getLHS(), CI->getRHS()}));
1315 if (DestWidth == 1 &&
1358 return Changed ? &Trunc :
nullptr;
1378 Value *In = Cmp->getOperand(0);
1379 Value *Sh = ConstantInt::get(In->getType(),
1380 In->getType()->getScalarSizeInBits() - 1);
1381 In = Builder.CreateLShr(In, Sh, In->getName() +
".lobit");
1382 if (In->getType() != Zext.
getType())
1383 In = Builder.CreateIntCast(In, Zext.
getType(),
false );
1393 if (Op1CV->
isZero() && Cmp->isEquality()) {
1398 uint32_t ShAmt = KnownZeroMask.logBase2();
1399 bool IsExpectShAmt = KnownZeroMask.isPowerOf2() &&
1401 if (IsExpectShAmt &&
1402 (Cmp->getOperand(0)->getType() == Zext.
getType() ||
1404 Value *In = Cmp->getOperand(0);
1408 In = Builder.CreateLShr(In, ConstantInt::get(In->getType(), ShAmt),
1409 In->getName() +
".lobit");
1414 In =
Builder.CreateXor(In, ConstantInt::get(
In->getType(), 1));
1425 if (
Cmp->isEquality()) {
1434 Value *Shift =
And->getOperand(
X ==
And->getOperand(0) ? 1 : 0);
1441 Builder.CreateAnd(Lshr, ConstantInt::get(
X->getType(), 1));
1469bool TypeEvaluationHelper::canEvaluateZExtd(
Value *V,
Type *Ty,
1470 unsigned &BitsToClear,
1473 TypeEvaluationHelper TYH;
1474 return TYH.canEvaluateZExtdImpl(V, Ty, BitsToClear, IC, CxtI);
1476bool TypeEvaluationHelper::canEvaluateZExtdImpl(
Value *V,
Type *Ty,
1477 unsigned &BitsToClear,
1481 if (canAlwaysEvaluateInType(V, Ty))
1485 if (canNotEvaluateInType(V, Ty))
1490 switch (
I->getOpcode()) {
1491 case Instruction::ZExt:
1492 case Instruction::SExt:
1493 case Instruction::Trunc:
1495 case Instruction::And:
1496 case Instruction::Or:
1497 case Instruction::Xor:
1498 case Instruction::Add:
1499 case Instruction::Sub:
1500 case Instruction::Mul:
1501 if (!canEvaluateZExtdImpl(
I->getOperand(0), Ty, BitsToClear, IC, CxtI) ||
1502 !canEvaluateZExtdImpl(
I->getOperand(1), Ty, Tmp, IC, CxtI))
1505 if (BitsToClear == 0 && Tmp == 0)
1510 if (Tmp == 0 &&
I->isBitwiseLogicOp()) {
1513 unsigned VSize =
V->getType()->getScalarSizeInBits();
1519 if (
I->getOpcode() == Instruction::And)
1528 case Instruction::Shl: {
1533 if (!canEvaluateZExtdImpl(
I->getOperand(0), Ty, BitsToClear, IC, CxtI))
1535 BitsToClear = ShiftAmt < BitsToClear ? BitsToClear - ShiftAmt : 0;
1540 case Instruction::LShr: {
1545 if (!canEvaluateZExtdImpl(
I->getOperand(0), Ty, BitsToClear, IC, CxtI))
1547 BitsToClear += ShiftAmt;
1548 if (BitsToClear >
V->getType()->getScalarSizeInBits())
1549 BitsToClear =
V->getType()->getScalarSizeInBits();
1555 case Instruction::Select:
1556 if (!canEvaluateZExtdImpl(
I->getOperand(1), Ty, Tmp, IC, CxtI) ||
1557 !canEvaluateZExtdImpl(
I->getOperand(2), Ty, BitsToClear, IC, CxtI) ||
1564 case Instruction::PHI: {
1580 case Instruction::Call:
1584 if (
II->getIntrinsicID() == Intrinsic::vscale)
1608 Type *SrcTy = Src->getType(), *DestTy = Zext.
getType();
1611 if (SrcTy->isIntOrIntVectorTy(1) && Zext.
hasNonNeg())
1620 bool EvaluateAsSigned =
1621 Zext.
hasNonNeg() && TypeEvaluationHelper::canEvaluateSExtd(Src, DestTy);
1624 unsigned BitsToClear = 0;
1625 if (shouldChangeType(SrcTy, DestTy) &&
1626 (EvaluateAsSigned || TypeEvaluationHelper::canEvaluateZExtd(
1627 Src, DestTy, BitsToClear, *
this, &Zext))) {
1629 "Can't clear more bits than in SrcTy");
1633 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1634 " to avoid zero extend: "
1641 if (
SrcOp->hasOneUse())
1644 uint32_t SrcBitsKept = SrcTy->getScalarSizeInBits() - BitsToClear;
1650 if (EvaluateAsSigned
1661 return BinaryOperator::CreateAnd(Res,
C);
1672 Value *
A = CSrc->getOperand(0);
1673 unsigned SrcSize =
A->getType()->getScalarSizeInBits();
1674 unsigned MidSize = CSrc->getType()->getScalarSizeInBits();
1680 if (SrcSize < DstSize) {
1682 Constant *AndConst = ConstantInt::get(
A->getType(), AndValue);
1687 if (SrcSize == DstSize) {
1689 return BinaryOperator::CreateAnd(
A, ConstantInt::get(
A->getType(),
1692 if (SrcSize > DstSize) {
1695 return BinaryOperator::CreateAnd(Trunc,
1696 ConstantInt::get(Trunc->
getType(),
1702 return transformZExtICmp(Cmp, Zext);
1712 return BinaryOperator::CreateXor(
Builder.CreateAnd(
X, ZC), ZC);
1718 SrcTy->getScalarSizeInBits());
1719 Value *Neg =
Builder.CreateSub(ConstantInt::get(DestTy, 0),
X);
1720 return BinaryOperator::CreateAnd(Neg, ConstantInt::get(DestTy, Mask));
1730 return BinaryOperator::CreateAnd(
X, ZextC);
1747 unsigned TypeWidth = Src->getType()->getScalarSizeInBits();
1748 if (
Log2_32(*MaxVScale) < TypeWidth)
1757 SrcTy->getScalarSizeInBits() >
1776 Value *Op0 = Cmp->getOperand(0), *Op1 = Cmp->getOperand(1);
1787 Value *In = Builder.CreateAShr(Op0, Sh, Op0->
getName() +
".lobit");
1788 if (In->getType() != Sext.
getType())
1789 In = Builder.CreateIntCast(In, Sext.
getType(),
true );
1798 if (Cmp->hasOneUse() &&
1799 Cmp->isEquality() && (Op1C->isZero() || Op1C->getValue().isPowerOf2())){
1803 if (KnownZeroMask.isPowerOf2()) {
1804 Value *In = Cmp->getOperand(0);
1807 if (!Op1C->isZero() && Op1C->getValue() != KnownZeroMask) {
1817 unsigned ShiftAmt = KnownZeroMask.countr_zero();
1821 ConstantInt::get(
In->getType(), ShiftAmt));
1831 unsigned ShiftAmt = KnownZeroMask.countl_zero();
1835 ConstantInt::get(
In->getType(), ShiftAmt));
1838 In =
Builder.CreateAShr(In, ConstantInt::get(
In->getType(),
1839 KnownZeroMask.getBitWidth() - 1),
"sext");
1859bool TypeEvaluationHelper::canEvaluateSExtd(
Value *V,
Type *Ty) {
1860 TypeEvaluationHelper TYH;
1861 return TYH.canEvaluateSExtdImpl(V, Ty) && TYH.allPendingVisited();
1864bool TypeEvaluationHelper::canEvaluateSExtdImpl(
Value *V,
Type *Ty) {
1865 return canEvaluate(V, Ty, [
this](
Value *V,
Type *Ty) {
1866 return canEvaluateSExtdPred(V, Ty);
1870bool TypeEvaluationHelper::canEvaluateSExtdPred(
Value *V,
Type *Ty) {
1872 "Can't sign extend type to a smaller type");
1875 switch (
I->getOpcode()) {
1876 case Instruction::SExt:
1877 case Instruction::ZExt:
1878 case Instruction::Trunc:
1880 case Instruction::And:
1881 case Instruction::Or:
1882 case Instruction::Xor:
1883 case Instruction::Add:
1884 case Instruction::Sub:
1885 case Instruction::Mul:
1887 return canEvaluateSExtdImpl(
I->getOperand(0), Ty) &&
1888 canEvaluateSExtdImpl(
I->getOperand(1), Ty);
1893 case Instruction::Select:
1894 return canEvaluateSExtdImpl(
I->getOperand(1), Ty) &&
1895 canEvaluateSExtdImpl(
I->getOperand(2), Ty);
1897 case Instruction::PHI: {
1903 if (!canEvaluateSExtdImpl(IncValue, Ty))
1925 Type *SrcTy = Src->getType(), *DestTy = Sext.
getType();
1932 CI->setNonNeg(
true);
1937 bool ShouldExtendExpression =
true;
1938 Value *TruncSrc =
nullptr;
1943 ShouldExtendExpression =
false;
1944 if (ShouldExtendExpression && shouldChangeType(SrcTy, DestTy) &&
1945 TypeEvaluationHelper::canEvaluateSExtd(Src, DestTy)) {
1948 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1949 " to avoid sign extend: "
1960 Value *ShAmt = ConstantInt::get(DestTy, DestBitSize - SrcBitSize);
1961 return BinaryOperator::CreateAShr(
Builder.CreateShl(Res, ShAmt,
"sext"),
1969 unsigned XBitSize =
X->getType()->getScalarSizeInBits();
1974 ResTrunc->setHasNoSignedWrap(
true);
1979 if (Src->hasOneUse() &&
X->getType() == DestTy) {
1981 Constant *ShAmt = ConstantInt::get(DestTy, DestBitSize - SrcBitSize);
1982 return BinaryOperator::CreateAShr(
Builder.CreateShl(
X, ShAmt), ShAmt);
1990 if (Src->hasOneUse() &&
1999 return transformSExtICmp(Cmp, Sext);
2016 Constant *BA =
nullptr, *CA =
nullptr;
2023 assert(WideCurrShAmt &&
"Constant folding of ImmConstant cannot fail");
2032 return BinaryOperator::CreateAShr(
A, NewShAmt);
2040 Type *XTy =
X->getType();
2042 Constant *ShlAmtC = ConstantInt::get(XTy, XBitSize - SrcBitSize);
2043 Constant *AshrAmtC = ConstantInt::get(XTy, XBitSize - 1);
2045 return BinaryOperator::CreateAShr(
Builder.CreateShl(
X, ShlAmtC),
2059 if (
Log2_32(*MaxVScale) < (SrcBitSize - 1))
2070 Sext,
Builder.CreateIntrinsic(DestTy, CI->getIntrinsicID(),
2071 {CI->getLHS(), CI->getRHS()}));
2093 bool PreferBFloat) {
2114 if (Ty->getScalarType()->isPPC_FP128Ty())
2134 Type *MinType =
nullptr;
2136 unsigned NumElts = CVVTy->getNumElements();
2140 for (
unsigned I = 0;
I != NumElts; ++
I) {
2165 return FPExt->getOperand(0)->getType();
2193 return V->getType();
2199 Type *SrcTy = V->getType();
2200 assert(SrcTy->isIntOrIntVectorTy() &&
"Expected an integer type");
2201 int SrcSize = (int)SrcTy->getScalarSizeInBits() - IsSigned;
2206 if (SrcSize <= DestNumSigBits)
2215 int SrcNumSigBits =
F->getType()->getFPMantissaWidth();
2222 if (SrcNumSigBits > 0 && DestNumSigBits > 0 &&
2223 SrcNumSigBits <= DestNumSigBits)
2230 int SigBits = (int)SrcTy->getScalarSizeInBits() -
2233 if (SigBits <= DestNumSigBits)
2240 if (SigBits <= DestNumSigBits)
2249 assert((Opcode == CastInst::SIToFP || Opcode == CastInst::UIToFP) &&
2251 Value *Src =
I.getOperand(0);
2252 Type *FPTy =
I.getType();
2269 if (BO && BO->hasOneUse()) {
2272 unsigned OpWidth = BO->getType()->getFPMantissaWidth();
2275 unsigned SrcWidth = std::max(LHSWidth, RHSWidth);
2276 unsigned DstWidth = Ty->getFPMantissaWidth();
2284 switch (BO->getOpcode()) {
2286 case Instruction::FAdd:
2287 case Instruction::FSub:
2306 if (OpWidth >= 2*DstWidth+1 && DstWidth >= SrcWidth) {
2307 Value *LHS =
Builder.CreateFPTrunc(BO->getOperand(0), Ty);
2308 Value *RHS =
Builder.CreateFPTrunc(BO->getOperand(1), Ty);
2314 case Instruction::FMul:
2320 if (OpWidth >= LHSWidth + RHSWidth && DstWidth >= SrcWidth) {
2321 Value *LHS =
Builder.CreateFPTrunc(BO->getOperand(0), Ty);
2322 Value *RHS =
Builder.CreateFPTrunc(BO->getOperand(1), Ty);
2326 case Instruction::FDiv:
2333 if (OpWidth >= 2*DstWidth && DstWidth >= SrcWidth) {
2334 Value *LHS =
Builder.CreateFPTrunc(BO->getOperand(0), Ty);
2335 Value *RHS =
Builder.CreateFPTrunc(BO->getOperand(1), Ty);
2339 case Instruction::FRem: {
2344 if (SrcWidth == OpWidth)
2347 if (LHSWidth == SrcWidth) {
2348 LHS =
Builder.CreateFPTrunc(BO->getOperand(0), LHSMinType);
2349 RHS =
Builder.CreateFPTrunc(BO->getOperand(1), LHSMinType);
2351 LHS =
Builder.CreateFPTrunc(BO->getOperand(0), RHSMinType);
2352 RHS =
Builder.CreateFPTrunc(BO->getOperand(1), RHSMinType);
2355 Value *ExactResult =
Builder.CreateFRemFMF(LHS, RHS, BO);
2364 if (
Op &&
Op->hasOneUse()) {
2367 FMF &= FPMO->getFastMathFlags();
2383 Builder.CreateSelectFMF(
Cond,
X, NarrowY, FMF,
"narrow.sel",
Op);
2391 Builder.CreateSelectFMF(
Cond, NarrowY,
X, FMF,
"narrow.sel",
Op);
2397 switch (
II->getIntrinsicID()) {
2399 case Intrinsic::ceil:
2400 case Intrinsic::fabs:
2401 case Intrinsic::floor:
2402 case Intrinsic::nearbyint:
2403 case Intrinsic::rint:
2404 case Intrinsic::round:
2405 case Intrinsic::roundeven:
2406 case Intrinsic::trunc: {
2407 Value *Src =
II->getArgOperand(0);
2408 if (!Src->hasOneUse())
2414 if (
II->getIntrinsicID() != Intrinsic::fabs) {
2416 if (!FPExtSrc || FPExtSrc->
getSrcTy() != Ty)
2426 II->getOperandBundlesAsDefs(OpBundles);
2468template <
typename FPToIntTy>
2470 constexpr bool IsSaturating = std::is_same_v<FPToIntTy, IntrinsicInst>;
2476 Value *
X = OpI->getOperand(0);
2477 Type *XType =
X->getType();
2478 Type *DestType = FI.getType();
2481 bool IsOutputSigned;
2482 if constexpr (IsSaturating)
2483 IsOutputSigned = FI.getIntrinsicID() == Intrinsic::fptosi_sat;
2494 if constexpr (!IsSaturating) {
2502 if (OutputSize > OpI->getType()->getFPMantissaWidth())
2514 if constexpr (IsSaturating) {
2517 if (IsInputSigned != IsOutputSigned || DestWidth < SrcWidth)
2521 if (DestWidth > SrcWidth) {
2522 if (IsInputSigned && IsOutputSigned)
2526 if (DestWidth < SrcWidth)
2529 assert(XType == DestType &&
"Unexpected types for int to FP to int casts");
2563 bool IsSigned = FI.
getOpcode() == Instruction::FPToSI;
2575 Type *IntTy =
X->getType();
2579 unsigned IntWidth = IntTy->getScalarSizeInBits();
2581 if (Precision + IsSigned < IntWidth)
2587 APSInt Divisor(IntWidth, !IsSigned);
2588 bool IsExact =
false;
2601 Constant *
C = ConstantInt::get(IntTy, Divisor);
2602 return IsSigned ? BinaryOperator::CreateSDiv(
X,
C)
2603 : BinaryOperator::CreateUDiv(
X,
C);
2642 UI->setNonNeg(
true);
2654 DL.getPointerSizeInBits(AS)) {
2666 auto UsesPointerAsInt = [](
User *U) {
2677 Base->getType()->getPointerAddressSpace() &&
2694 if (!
GEP || !
GEP->hasOneUse())
2697 Ptr =
GEP->getPointerOperand();
2706 Type *IdxTy =
DL.getIndexType(PtrTy);
2708 Res->
getType() == IntTy && IntTy == IdxTy) {
2721 return Builder.CreateZExtOrTrunc(Res, IntTy);
2732 unsigned TySize = Ty->getScalarSizeInBits();
2733 unsigned PtrSize =
DL.getPointerSizeInBits(AS);
2734 if (TySize != PtrSize) {
2736 SrcTy->getWithNewType(
DL.getIntPtrType(CI.
getContext(), AS));
2747 return BinaryOperator::CreateAnd(
Builder.CreatePtrToInt(Ptr, Ty), Mask);
2752 Value *Vec, *Scalar, *Index;
2758 Value *NewCast =
Builder.CreatePtrToInt(Scalar, Ty->getScalarType());
2775 return BinaryOperator::CreateAnd(
Builder.CreatePtrToAddr(Ptr), Mask);
2808 if (SrcTy->getElementType() != DestTy->getElementType()) {
2813 if (SrcTy->getElementType()->getPrimitiveSizeInBits() !=
2814 DestTy->getElementType()->getPrimitiveSizeInBits())
2827 assert(SrcElts != DestElts &&
"Element counts should be different.");
2836 if (SrcElts > DestElts) {
2845 ShuffleMask = ShuffleMaskStorage;
2847 ShuffleMask = ShuffleMask.take_back(DestElts);
2849 ShuffleMask = ShuffleMask.take_front(DestElts);
2860 unsigned DeltaElts = DestElts - SrcElts;
2862 ShuffleMaskStorage.insert(ShuffleMaskStorage.begin(), DeltaElts, NullElt);
2864 ShuffleMaskStorage.append(DeltaElts, NullElt);
2865 ShuffleMask = ShuffleMaskStorage;
2872 return Value % Ty->getPrimitiveSizeInBits() == 0;
2876 return Value / Ty->getPrimitiveSizeInBits();
2893 "Shift should be a multiple of the element type size");
2901 if (V->getType() == VecEltTy) {
2904 if (
C->isNullValue())
2909 ElementIndex = Elements.size() - ElementIndex - 1;
2912 if (Elements[ElementIndex])
2915 Elements[ElementIndex] = V;
2934 C->getType()->getPrimitiveSizeInBits()));
2938 for (
unsigned i = 0; i != NumElts; ++i) {
2939 unsigned ShiftI = i * ElementSize;
2941 Instruction::LShr,
C, ConstantInt::get(
C->getType(), ShiftI));
2953 if (!V->hasOneUse())
return false;
2956 if (!
I)
return false;
2957 switch (
I->getOpcode()) {
2958 default:
return false;
2959 case Instruction::BitCast:
2960 if (
I->getOperand(0)->getType()->isVectorTy())
2964 case Instruction::ZExt:
2966 I->getOperand(0)->getType()->getPrimitiveSizeInBits(),
2971 case Instruction::Or:
2976 case Instruction::Shl: {
2979 if (!CI)
return false;
3016 DestVecTy->getElementType(),
3024 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
3025 if (!Elements[i])
continue;
3039 Value *VecOp, *Index;
3057 if (DestType->
isVectorTy() && FixedVType && FixedVType->getNumElements() == 1)
3084 if (
X->getType()->isFPOrFPVectorTy() &&
3085 Y->getType()->isIntOrIntVectorTy()) {
3087 Builder.CreateBitCast(BO->
getOperand(0),
Y->getType());
3091 if (
X->getType()->isIntOrIntVectorTy() &&
3092 Y->getType()->isFPOrFPVectorTy()) {
3094 Builder.CreateBitCast(BO->
getOperand(1),
X->getType());
3130 Value *CastedC = Builder.CreateBitCast(
C, DestTy);
3153 CondVTy->getElementCount() != DestVecTy->getElementCount())
3162 SrcVecTy->getElementCount())))) {
3165 Value *CastedTVal = Builder.CreateBitCast(TVal, DestTy);
3166 Value *CastedFVal = Builder.CreateBitCast(FVal, DestTy);
3174 if ((DestVecTy !=
nullptr) != (SrcVecTy !=
nullptr))
3181 Value *CastedVal = Builder.CreateBitCast(FVal, DestTy);
3188 Value *CastedVal = Builder.CreateBitCast(TVal, DestTy);
3219 Type *SrcTy = Src->getType();
3223 SmallSetVector<PHINode *, 4> OldPhiNodes;
3231 while (!PhiWorklist.
empty()) {
3233 for (
Value *IncValue : OldPN->incoming_values()) {
3242 Value *Addr = LI->getOperand(0);
3251 if (LI->hasOneUse() && LI->isSimple())
3259 if (OldPhiNodes.
insert(PNode))
3270 Type *TyA = BCI->getOperand(0)->getType();
3271 Type *TyB = BCI->getType();
3272 if (TyA != DestTy || TyB != SrcTy)
3279 for (
auto *OldPN : OldPhiNodes) {
3280 for (User *V : OldPN->users()) {
3282 if (!
SI->isSimple() ||
SI->getOperand(0) != OldPN)
3286 Type *TyB = BCI->getOperand(0)->getType();
3287 Type *TyA = BCI->getType();
3288 if (TyA != DestTy || TyB != SrcTy)
3294 if (!OldPhiNodes.contains(
PHI))
3303 SmallDenseMap<PHINode *, PHINode *> NewPNodes;
3304 for (
auto *OldPN : OldPhiNodes) {
3305 Builder.SetInsertPoint(OldPN);
3306 PHINode *NewPN =
Builder.CreatePHI(DestTy, OldPN->getNumOperands());
3307 NewPNodes[OldPN] = NewPN;
3311 for (
auto *OldPN : OldPhiNodes) {
3312 PHINode *NewPN = NewPNodes[OldPN];
3313 for (
unsigned j = 0, e = OldPN->getNumOperands(); j != e; ++j) {
3314 Value *
V = OldPN->getOperand(j);
3315 Value *NewV =
nullptr;
3328 NewV = BCI->getOperand(0);
3330 NewV = NewPNodes[PrevPN];
3333 NewPN->
addIncoming(NewV, OldPN->getIncomingBlock(j));
3347 for (
auto *OldPN : OldPhiNodes) {
3348 PHINode *NewPN = NewPNodes[OldPN];
3351 assert(
SI->isSimple() &&
SI->getOperand(0) == OldPN);
3355 SI->setOperand(0, NewBC);
3360 Type *TyB = BCI->getOperand(0)->getType();
3361 Type *TyA = BCI->getType();
3362 assert(TyA == DestTy && TyB == SrcTy);
3393 if (
X->getType() != FTy)
3398 return Builder.CreateCopySign(Builder.CreateBitCast(
Y, FTy),
X);
3405 Type *SrcTy = Src->getType();
3410 if (DestTy == Src->getType())
3436 if (SrcVTy->getNumElements() == 1) {
3440 Value *Elem =
Builder.CreateExtractElement(Src, uint64_t{0});
3448 return new BitCastInst(InsElt->getOperand(1), DestTy);
3458 DestTy->
isIntegerTy() &&
Y->getType()->isIntegerTy() &&
3461 if (
DL.isBigEndian())
3462 IndexC = SrcVTy->getNumElements() - 1 - IndexC;
3468 unsigned EltWidth =
Y->getType()->getScalarSizeInBits();
3472 return BinaryOperator::CreateOr(AndX, ZextY);
3480 Value *ShufOp0 = Shuf->getOperand(0);
3481 Value *ShufOp1 = Shuf->getOperand(1);
3484 if (Shuf->hasOneUse() && DestTy->
isVectorTy() &&
3486 ShufElts == SrcVecElts) {
3507 if (DestTy->
isIntegerTy() && ShufElts.getKnownMinValue() % 2 == 0 &&
3508 Shuf->hasOneUse() && Shuf->isReverse() &&
match(ShufOp1,
m_Poison())) {
3509 unsigned IntrinsicNum = 0;
3511 SrcTy->getScalarSizeInBits() == 8) {
3512 IntrinsicNum = Intrinsic::bswap;
3513 }
else if (SrcTy->getScalarSizeInBits() == 1) {
3514 IntrinsicNum = Intrinsic::bitreverse;
3516 if (IntrinsicNum != 0) {
3517 assert(ShufOp0->
getType() == SrcTy &&
"Unexpected shuffle mask");
3520 Value *ScalarX =
Builder.CreateBitCast(ShufOp0, DestTy);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static std::optional< bool > isBigEndian(const SmallDenseMap< int64_t, int64_t, 8 > &MemOffset2Idx, int64_t LowestIdx)
Given a map from byte offsets in memory to indices in a load/store, determine if that map corresponds...
This file defines the DenseMap class.
static bool isSigned(unsigned Opcode)
static bool collectInsertionElements(Value *V, unsigned Shift, SmallVectorImpl< Value * > &Elements, Type *VecEltTy, bool isBigEndian)
V is a value which is inserted into a vector of VecEltTy.
static bool hasStoreUsersOnly(CastInst &CI)
Check if all users of CI are StoreInsts.
static Value * foldCopySignIdioms(BitCastInst &CI, InstCombiner::BuilderTy &Builder, const SimplifyQuery &SQ)
Fold (bitcast (or (and (bitcast X to int), signmask), nneg Y) to fp) to copysign((bitcast Y to fp),...
static Type * shrinkFPConstantVector(Value *V, bool PreferBFloat)
static Instruction * canonicalizeBitCastExtElt(BitCastInst &BitCast, InstCombinerImpl &IC)
Canonicalize scalar bitcasts of extracted elements into a bitcast of the vector followed by extract e...
static Instruction * shrinkSplatShuffle(TruncInst &Trunc, InstCombiner::BuilderTy &Builder)
Try to narrow the width of a splat shuffle.
static Instruction * foldFPtoI(Instruction &FI, InstCombiner &IC)
static Instruction * foldBitCastSelect(BitCastInst &BitCast, InstCombiner::BuilderTy &Builder)
Change the type of a select if we can eliminate a bitcast.
static Instruction * foldBitCastBitwiseLogic(BitCastInst &BitCast, InstCombiner::BuilderTy &Builder)
Change the type of a bitwise logic operation if we can eliminate a bitcast.
static bool fitsInFPType(APFloat F, const fltSemantics &Sem)
Return a Constant* for the specified floating-point constant if it fits in the specified FP type with...
static Instruction * optimizeVectorResizeWithIntegerBitCasts(Value *InVal, VectorType *DestTy, InstCombinerImpl &IC)
This input value (which is known to have vector type) is being zero extended or truncated to the spec...
static Instruction * shrinkInsertElt(CastInst &Trunc, InstCombiner::BuilderTy &Builder)
Try to narrow the width of an insert element.
SmallDenseMap< Value *, Value *, 8 > EvaluatedMap
static Type * getMinimumFPType(Value *V, Type *PreferredTy, InstCombiner &IC)
Find the minimum FP type we can safely truncate to.
static bool isMultipleOfTypeSize(unsigned Value, Type *Ty)
static Value * optimizeIntegerToVectorInsertions(BitCastInst &CI, InstCombinerImpl &IC)
If the input is an 'or' instruction, we may be doing shifts and ors to assemble the elements of the v...
static Type * shrinkFPConstant(LLVMContext &Ctx, const APFloat &F, bool PreferBFloat)
static Instruction * foldVecExtTruncToExtElt(TruncInst &Trunc, InstCombinerImpl &IC)
Whenever an element is extracted from a vector, optionally shifted down, and then truncated,...
static Value * EvaluateInDifferentTypeImpl(Value *V, Type *Ty, bool isSigned, InstCombinerImpl &IC, EvaluatedMap &Processed)
static unsigned getTypeSizeIndex(unsigned Value, Type *Ty)
static Instruction * foldVecTruncToExtElt(TruncInst &Trunc, InstCombinerImpl &IC)
Given a vector that is bitcast to an integer, optionally logically right-shifted, and truncated,...
This file provides internal interfaces used to implement the InstCombine.
This file provides the interface for the instcombine pass implementation.
uint64_t IntrinsicInst * II
const SmallVectorImpl< MachineOperand > & Cond
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallVector class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
static const fltSemantics & IEEEsingle()
static constexpr roundingMode rmTowardZero
static const fltSemantics & BFloat()
static const fltSemantics & IEEEdouble()
static constexpr roundingMode rmNearestTiesToEven
static LLVM_ABI unsigned int semanticsPrecision(const fltSemantics &)
static const fltSemantics & IEEEhalf()
static LLVM_ABI unsigned int semanticsIntSizeInBits(const fltSemantics &, bool)
const fltSemantics & getSemantics() const
opStatus convertToInteger(MutableArrayRef< integerPart > Input, unsigned int Width, bool IsSigned, roundingMode RM, bool *IsExact) const
Class for arbitrary precision integers.
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.
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
uint64_t getZExtValue() const
Get zero extended value.
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
LLVM_ABI APInt urem(const APInt &RHS) const
Unsigned remainder operation.
unsigned getBitWidth() const
Return the number of bits in the APInt.
bool ult(const APInt &RHS) const
Unsigned less than comparison.
int32_t exactLogBase2() const
unsigned countr_zero() const
Count the number of trailing zero bits.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
static APInt getHighBitsSet(unsigned numBits, unsigned hiBitsSet)
Constructs an APInt value that has the top hiBitsSet bits set.
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
unsigned countr_one() const
Count the number of trailing one bits.
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
An arbitrary precision integer that knows its signedness.
This class represents a conversion between pointers from one address space to another.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Functions, function parameters, and return types can have attributes to indicate how they should be t...
LLVM_ABI std::optional< unsigned > getVScaleRangeMax() const
Returns the maximum value for the vscale_range attribute or std::nullopt when unknown.
BinaryOps getOpcode() const
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static BinaryOperator * CreateFMulFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
static BinaryOperator * CreateFDivFMF(Value *V1, Value *V2, FastMathFlags FMF, const Twine &Name="")
This class represents a no-op cast from one type to another.
This class represents a function call, abstracting a target machine's calling convention.
static CallInst * Create(FunctionType *Ty, Value *F, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This is the base class for all instructions that perform data casts.
Type * getSrcTy() const
Return the source type, as a convenience.
Instruction::CastOps getOpcode() const
Return the opcode of this CastInst.
static LLVM_ABI unsigned isEliminableCastPair(Instruction::CastOps firstOpcode, Instruction::CastOps secondOpcode, Type *SrcTy, Type *MidTy, Type *DstTy, const DataLayout *DL)
Determine how a pair of casts can be eliminated, if they can be at all.
static LLVM_ABI CastInst * CreateIntegerCast(Value *S, Type *Ty, bool isSigned, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a ZExt, BitCast, or Trunc for int -> int casts.
static LLVM_ABI CastInst * CreateFPCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create an FPExt, BitCast, or FPTrunc for fp -> fp casts.
static LLVM_ABI CastInst * CreateTruncOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a Trunc or BitCast cast instruction.
static LLVM_ABI CastInst * CreateBitOrPointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, a PtrToInt, or an IntToPTr cast instruction.
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
Type * getDestTy() const
Return the destination type, as a convenience.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_SLT
signed less than
@ ICMP_UGE
unsigned greater or equal
@ ICMP_SGT
signed greater than
@ ICMP_ULT
unsigned less than
@ ICMP_ULE
unsigned less or equal
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static LLVM_ABI Constant * getTrunc(Constant *C, Type *Ty, bool OnlyIfReduced=false)
ConstantFP - Floating Point Values [float, double].
const APFloat & getValueAPF() const
This is the shared class of boolean and integer constants.
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
bool uge(uint64_t Num) const
This function will return true iff this constant represents a value with active bits bigger than 64 b...
This is an important base class in LLVM.
static LLVM_ABI Constant * mergeUndefsWith(Constant *C, Constant *Other)
Merges undefs of a Constant with another Constant, along with the undefs already present.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI bool isElementWiseEqual(Value *Y) const
Return true if this constant and a constant 'Y' are element-wise equal.
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
This class represents an extension of floating point types.
This class represents a cast from floating point to signed integer.
This class represents a cast from floating point to unsigned integer.
This class represents a truncation of floating point types.
Convenience struct for specifying and reasoning about fast-math flags.
void setNoInfs(bool B=true)
Class to represent fixed width SIMD vectors.
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
FunctionType * getFunctionType() const
Returns the FunctionType for me.
Attribute getFnAttribute(Attribute::AttrKind Kind) const
Return the attribute for the given attribute kind.
bool hasFnAttribute(Attribute::AttrKind Kind) const
Return true if the function has the attribute.
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
This instruction compares its operands according to the predicate given to the constructor.
Value * CreateInsertElement(Type *VecTy, Value *NewElt, Value *Idx, const Twine &Name="")
ConstantInt * getInt64(uint64_t C)
Get a constant 64-bit value.
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
Value * CreateBitCast(Value *V, Type *DestTy, const Twine &Name="")
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Instruction * visitZExt(ZExtInst &Zext)
Instruction * visitAddrSpaceCast(AddrSpaceCastInst &CI)
Instruction * foldExtractionOfVectorDeinterleave(ZExtInst &RootZExt)
Instruction * visitSExt(SExtInst &Sext)
Instruction * foldOpIntoPhi(Instruction &I, PHINode *PN, bool AllowMultipleUses=false)
Given a binary operator, cast instruction, or select which has a PHI node as operand #0,...
Instruction * visitFPToSI(FPToSIInst &FI)
Instruction * visitTrunc(TruncInst &CI)
Instruction * visitUIToFP(CastInst &CI)
Instruction * visitPtrToInt(PtrToIntInst &CI)
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false, bool SimplifyBothArms=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Instruction * foldItoFPtoI(FPToIntTy &FI)
fpto{s/u}i.sat --> X or zext(X) or sext(X) or trunc(X) This is safe if the intermediate type has enou...
Instruction * visitSIToFP(CastInst &CI)
Instruction * commonCastTransforms(CastInst &CI)
Implement the transforms common to all CastInst visitors.
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * visitFPTrunc(FPTruncInst &CI)
Value * foldPtrToIntOrAddrOfGEP(Type *IntTy, Value *Ptr)
Instruction * visitBitCast(BitCastInst &CI)
Instruction * visitIntToPtr(IntToPtrInst &CI)
Instruction * visitFPToUI(FPToUIInst &FI)
Instruction * visitPtrToAddr(PtrToAddrInst &CI)
Value * EvaluateInDifferentType(Value *V, Type *Ty, bool isSigned)
Given an expression that CanEvaluateTruncated or CanEvaluateSExtd returns true for,...
bool SimplifyDemandedInstructionBits(Instruction &Inst)
Tries to simplify operands to an integer instruction based on its demanded bits.
Instruction * visitFPExt(CastInst &CI)
LoadInst * combineLoadToNewType(LoadInst &LI, Type *NewTy, const Twine &Suffix="")
Helper to combine a load to a new type.
The core instruction combiner logic.
const DataLayout & getDataLayout() const
unsigned ComputeMaxSignificantBits(const Value *Op, const Instruction *CxtI=nullptr, unsigned Depth=0) const
unsigned ComputeNumSignBits(const Value *Op, const Instruction *CxtI=nullptr, unsigned Depth=0) const
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
LLVM_ABI bool canBeCastedExactlyIntToFP(Value *V, Type *FPTy, bool IsSigned, const Instruction *CxtI=nullptr) const
InstructionWorklist & Worklist
A worklist of the instructions that need to be simplified.
Instruction * InsertNewInstWith(Instruction *New, BasicBlock::iterator Old)
Same as InsertNewInstBefore, but also sets the debug loc.
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CxtI, unsigned Depth=0) const
LLVM_ABI bool isKnownExactCastIntToFP(CastInst &I) const
Return true if the cast from integer to FP can be proven to be exact for all possible inputs (the con...
IRBuilder< TargetFolder, IRBuilderInstCombineInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
bool MaskedValueIsZero(const Value *V, const APInt &Mask, const Instruction *CxtI=nullptr, unsigned Depth=0) const
const SimplifyQuery & getSimplifyQuery() const
LLVM_ABI bool hasNoInfs() const LLVM_READONLY
Determine whether the no-infs flag is set.
LLVM_ABI void copyFastMathFlags(FastMathFlags FMF)
Convenience function for transferring all fast-math flag values to this instruction,...
static bool isBitwiseLogicOp(unsigned Opcode)
Determine if the Opcode is and/or/xor.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI void setFastMathFlags(FastMathFlags FMF)
Convenience function for setting multiple fast-math flags on this instruction, which must be an opera...
Instruction * user_back()
Specialize the methods defined in Value, as we know that an instruction can only be used by other ins...
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI void setNonNeg(bool b=true)
Set or clear the nneg flag on this instruction, which must be a zext instruction.
LLVM_ABI bool hasNonNeg() const LLVM_READONLY
Determine whether the the nneg flag is set.
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI void setIsExact(bool b=true)
Set or clear the exact flag on this instruction, which must be an operator which supports this flag.
This class represents a cast from an integer to a pointer.
unsigned getAddressSpace() const
Returns the address space of this instruction's pointer type.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
A wrapper class for inspecting calls to intrinsic functions.
This is an important class for using LLVM in a threaded context.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
op_range incoming_values()
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
This class represents a cast from a pointer to an address (non-capturing ptrtoint).
Value * getPointerOperand()
Gets the pointer operand.
This class represents a cast from a pointer to an integer.
Value * getPointerOperand()
Gets the pointer operand.
unsigned getPointerAddressSpace() const
Returns the address space of the pointer operand.
This class represents a sign extension of integer types.
This class represents the LLVM 'select' instruction.
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
bool insert(const value_type &X)
Insert a new element into the SetVector.
This instruction constructs a fixed permutation of two input vectors.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
This class represents a truncation of integer types.
void setHasNoSignedWrap(bool B)
void setHasNoUnsignedWrap(bool B)
bool hasNoSignedWrap() const
Test whether this operation is known to never undergo signed overflow, aka the nsw property.
bool hasNoUnsignedWrap() const
Test whether this operation is known to never undergo unsigned overflow, aka the nuw property.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI unsigned getIntegerBitWidth() const
bool isVectorTy() const
True if this is an instance of VectorType.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
LLVM_ABI Type * getWithNewType(Type *EltTy) const
Given vector type, change the element type, whilst keeping the old number of elements.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isPtrOrPtrVectorTy() const
Return true if this is a pointer type or a vector of pointer types.
bool isX86_AMXTy() const
Return true if this is X86 AMX.
bool isIntegerTy() const
True if this is an instance of IntegerType.
static LLVM_ABI Type * getDoubleTy(LLVMContext &C)
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
static LLVM_ABI Type * getFloatTy(LLVMContext &C)
LLVM_ABI int getFPMantissaWidth() const
Return the width of the mantissa of this type.
LLVM_ABI const fltSemantics & getFltSemantics() const
static LLVM_ABI Type * getBFloatTy(LLVMContext &C)
static LLVM_ABI Type * getHalfTy(LLVMContext &C)
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
bool hasOneUse() const
Return true if there is exactly one use of this value.
LLVMContext & getContext() const
All values hold a context through their type.
iterator_range< user_iterator > users()
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
static LLVM_ABI bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
This class represents zero extension of integer types.
static constexpr bool isKnownLE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
static constexpr bool isKnownGE(const FixedOrScalableQuantity &LHS, const FixedOrScalableQuantity &RHS)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
SpecificConstantMatch m_ZeroInt()
Convenience matchers for specific integer values.
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
CheckType m_SpecificType(LLT Ty)
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
cst_pred_ty< is_lowbit_mask > m_LowBitMask()
Match an integer or vector with only the low bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
PtrToIntSameSize_match< OpTy > m_PtrToIntSameSize(const DataLayout &DL, const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
cst_pred_ty< is_sign_mask > m_SignMask()
Match an integer or vector with only the sign bit(s) set.
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
auto m_Poison()
Match an arbitrary poison constant.
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
specific_intval< false > m_SpecificInt(const APInt &V)
Match a specific integer value or vector with all elements equal to the value.
bool match(Val *V, const Pattern &P)
auto m_UMin(const Opnd0 &Op0, const Opnd1 &Op1)
match_deferred< Value > m_Deferred(Value *const &V)
Like m_Specific(), but works if the specific value to match is determined as part of the same match()...
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
specific_intval< true > m_SpecificIntAllowPoison(const APInt &V)
ap_match< APFloat > m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
auto m_SMax(const Opnd0 &Op0, const Opnd1 &Op1)
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_BinOp()
Match an arbitrary binary operation and ignore it.
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
match_combine_or< CastInst_match< OpTy, UIToFPInst >, CastInst_match< OpTy, SIToFPInst > > m_IToFP(const OpTy &Op)
auto m_Value()
Match an arbitrary value and ignore it.
auto m_Constant()
Match an arbitrary Constant and ignore it.
NoWrapTrunc_match< OpTy, TruncInst::NoSignedWrap > m_NSWTrunc(const OpTy &Op)
Matches trunc nsw.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
auto m_VScale()
Matches a call to llvm.vscale().
match_combine_or< CastInst_match< OpTy, FPToUIInst >, CastInst_match< OpTy, FPToSIInst > > m_FPToI(const OpTy &Op)
CastInst_match< OpTy, FPExtInst > m_FPExt(const OpTy &Op)
SpecificCmpClass_match< LHS, RHS, ICmpInst > m_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
auto m_Ctlz(const Opnd0 &Op0, const Opnd1 &Op1)
BinOpPred_match< LHS, RHS, is_bitwiselogic_op, true > m_c_BitwiseLogic(const LHS &L, const RHS &R)
Matches bitwise logic operations in either order.
cst_pred_ty< is_negated_power2 > m_NegatedPower2()
Match a integer or vector negated power-of-2.
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
NoWrapTrunc_match< OpTy, TruncInst::NoUnsignedWrap > m_NUWTrunc(const OpTy &Op)
Matches trunc nuw.
BinaryOp_match< LHS, RHS, Instruction::Add, true > m_c_Add(const LHS &L, const RHS &R)
Matches a Add with LHS and RHS in either order.
CastInst_match< OpTy, UIToFPInst > m_UIToFP(const OpTy &Op)
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
CastInst_match< OpTy, FPToSIInst > m_FPToSI(const OpTy &Op)
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
auto m_SMin(const Opnd0 &Op0, const Opnd1 &Op1)
CastInst_match< OpTy, SIToFPInst > m_SIToFP(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
Exact_match< T > m_Exact(const T &SubPattern)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
BinOpPred_match< LHS, RHS, is_shift_op > m_Shift(const LHS &L, const RHS &R)
Matches shift operations.
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::FDiv > m_FDiv(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
BinaryOp_match< LHS, RHS, Instruction::Or, true > m_c_Or(const LHS &L, const RHS &R)
Matches an Or with LHS and RHS in either order.
CastOperator_match< OpTy, Instruction::IntToPtr > m_IntToPtr(const OpTy &Op)
Matches IntToPtr.
ThreeOps_match< Val_t, Elt_t, Idx_t, Instruction::InsertElement > m_InsertElt(const Val_t &Val, const Elt_t &Elt, const Idx_t &Idx)
Matches InsertElementInst.
ElementWiseBitCast_match< OpTy > m_ElementWiseBitCast(const OpTy &Op)
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
cst_pred_ty< icmp_pred_with_threshold > m_SpecificInt_ICMP(ICmpInst::Predicate Predicate, const APInt &Threshold)
Match an integer or vector with every element comparing 'pred' (eg/ne/...) to Threshold.
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, const SimplifyQuery &SQ, unsigned Depth=0)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Constant * ConstantFoldSelectInstruction(Constant *Cond, Constant *V1, Constant *V2)
Attempt to constant fold a select instruction with the specified operands.
@ Known
Known to have no common set bits.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
unsigned Log2_64_Ceil(uint64_t Value)
Return the ceil log base 2 of the specified value, 64 if the value is zero.
LLVM_ABI Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Instruction *I=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI Value * simplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty, const SimplifyQuery &Q)
Given operands for a CastInst, fold the result or return null.
auto dyn_cast_or_null(const Y &Val)
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
auto reverse(ContainerTy &&C)
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true, unsigned Depth=0)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
SmallVector< ValueTypeFromRangeType< R >, Size > to_vector(R &&Range)
Given a range of type R, iterate the entire range and return a SmallVector with elements of the vecto...
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI bool replaceAllDbgUsesWith(Instruction &From, Value &To, Instruction &DomPoint, DominatorTree &DT)
Point debug users of From to To or salvage them.
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
@ SMax
Signed integer max implemented in terms of select(cmp()).
@ And
Bitwise or logical AND of integers.
@ SMin
Signed integer min implemented in terms of select(cmp()).
DWARFExpression::Operation Op
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
LLVM_ABI Constant * ConstantFoldIntegerCast(Constant *C, Type *DestTy, bool IsSigned, const DataLayout &DL)
Constant fold a zext, sext or trunc, depending on IsSigned and whether the DestTy is wider or narrowe...
LLVM_ABI bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
LLVM_ABI Constant * ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1, Constant *V2)
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
unsigned countMinTrailingZeros() const
Returns the minimum number of trailing zero bits.
unsigned countMinLeadingZeros() const
Returns the minimum number of leading zero bits.
APInt getMaxValue() const
Return the maximal unsigned value possible given these KnownBits.
bool isKnownNever(FPClassTest Mask) const
Return true if it's known this can never be one of the mask entries.
SimplifyQuery getWithInstruction(const Instruction *I) const