35#define DEBUG_TYPE "instcombine"
54 unsigned Opc =
I->getOpcode();
56 case Instruction::Add:
57 case Instruction::Sub:
58 case Instruction::Mul:
59 case Instruction::And:
61 case Instruction::Xor:
62 case Instruction::AShr:
63 case Instruction::LShr:
64 case Instruction::Shl:
65 case Instruction::UDiv:
66 case Instruction::URem: {
72 if (
Opc == Instruction::LShr ||
Opc == Instruction::AShr)
76 case Instruction::Trunc:
77 case Instruction::ZExt:
78 case Instruction::SExt:
82 if (
I->getOperand(0)->getType() == Ty)
83 return I->getOperand(0);
88 Opc == Instruction::SExt);
90 case Instruction::Select: {
98 case Instruction::PHI: {
109 case Instruction::FPToUI:
110 case Instruction::FPToSI:
112 I->getOperand(0), Ty);
114 case Instruction::Call:
116 switch (
II->getIntrinsicID()) {
119 case Intrinsic::vscale: {
121 I->getModule(), Intrinsic::vscale, {Ty});
125 case Intrinsic::umin:
126 case Intrinsic::umax:
127 case Intrinsic::smin:
128 case Intrinsic::smax: {
134 I->getModule(),
II->getIntrinsicID(), {Ty});
138 case Intrinsic::abs: {
142 I->getModule(),
II->getIntrinsicID(), {Ty});
144 {Arg, ConstantInt::getFalse(I->getContext())});
150 case Instruction::ShuffleVector: {
173 Processed[V] = Result;
187InstCombinerImpl::isEliminableCastPair(
const CastInst *CI1,
204 if ((Res == Instruction::IntToPtr && SrcTy != DstIntPtrTy) ||
205 (Res == Instruction::PtrToInt && DstTy != SrcIntPtrTy))
227 if (CSrc->hasOneUse())
240 if (!Cmp || Cmp->getOperand(0)->getType() != Sel->getType() ||
246 if (CI.
getOpcode() != Instruction::BitCast ||
276 if (SrcTy && DestTy &&
277 SrcTy->getNumElements() == DestTy->getNumElements() &&
278 SrcTy->getPrimitiveSizeInBits() == DestTy->getPrimitiveSizeInBits()) {
291class TypeEvaluationHelper {
296 [[nodiscard]]
static bool canEvaluateTruncated(
Value *V,
Type *Ty,
302 [[nodiscard]]
static bool canEvaluateZExtd(
Value *V,
Type *Ty,
303 unsigned &BitsToClear,
310 [[nodiscard]]
static bool canEvaluateSExtd(
Value *V,
Type *Ty);
315 [[nodiscard]]
static bool canAlwaysEvaluateInType(
Value *V,
Type *Ty);
318 [[nodiscard]]
bool allPendingVisited()
const {
320 [
this](
Value *V) {
return Visited.contains(V); });
328 if (canAlwaysEvaluateInType(V, Ty))
337 const auto [It,
Inserted] = Visited.insert({
V,
false});
354 return It->getSecond();
415 if (!
I->hasOneUse()) {
416 for (Use &U :
I->uses()) {
424 Pending.push_back(
U.getUser());
428 const bool Result = Pred(V, Ty);
437 [[nodiscard]]
bool canNotEvaluateInType(
Value *V,
Type *Ty);
439 [[nodiscard]]
bool canEvaluateTruncatedImpl(
Value *V,
Type *Ty,
440 InstCombinerImpl &IC,
442 [[nodiscard]]
bool canEvaluateTruncatedPred(
Value *V,
Type *Ty,
443 InstCombinerImpl &IC,
445 [[nodiscard]]
bool canEvaluateZExtdImpl(
Value *V,
Type *Ty,
446 unsigned &BitsToClear,
447 InstCombinerImpl &IC,
449 [[nodiscard]]
bool canEvaluateSExtdImpl(
Value *V,
Type *Ty);
450 [[nodiscard]]
bool canEvaluateSExtdPred(
Value *V,
Type *Ty);
454 SmallDenseMap<Value *, bool, 8> Visited;
457 SmallVector<Value *, 8> Pending;
464bool TypeEvaluationHelper::canAlwaysEvaluateInType(
Value *V,
Type *Ty) {
478bool TypeEvaluationHelper::canNotEvaluateInType(
Value *V,
Type *Ty) {
500bool TypeEvaluationHelper::canEvaluateTruncated(
Value *V,
Type *Ty,
503 TypeEvaluationHelper TYH;
504 return TYH.canEvaluateTruncatedImpl(V, Ty, IC, CxtI) &&
507 TYH.allPendingVisited();
510bool TypeEvaluationHelper::canEvaluateTruncatedImpl(
Value *V,
Type *Ty,
513 return canEvaluate(V, Ty, [
this, &IC, CxtI](
Value *V,
Type *Ty) {
514 return canEvaluateTruncatedPred(V, Ty, IC, CxtI);
518bool TypeEvaluationHelper::canEvaluateTruncatedPred(
Value *V,
Type *Ty,
522 Type *OrigTy =
V->getType();
523 switch (
I->getOpcode()) {
524 case Instruction::Add:
525 case Instruction::Sub:
526 case Instruction::Mul:
527 case Instruction::And:
528 case Instruction::Or:
529 case Instruction::Xor:
531 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
532 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
534 case Instruction::UDiv:
535 case Instruction::URem: {
545 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
546 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
550 case Instruction::Shl: {
557 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
558 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
561 case Instruction::LShr: {
576 auto DemandedBits = Trunc->getType()->getScalarSizeInBits();
578 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
579 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
582 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
583 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
587 case Instruction::AShr: {
597 unsigned ShiftedBits = OrigBitWidth -
BitWidth;
600 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
601 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
604 case Instruction::Trunc:
607 case Instruction::ZExt:
608 case Instruction::SExt:
612 case Instruction::Select: {
614 return canEvaluateTruncatedImpl(
SI->getTrueValue(), Ty, IC, CxtI) &&
615 canEvaluateTruncatedImpl(
SI->getFalseValue(), Ty, IC, CxtI);
617 case Instruction::PHI: {
624 return canEvaluateTruncatedImpl(IncValue, Ty, IC, CxtI);
627 case Instruction::FPToUI:
628 case Instruction::FPToSI: {
635 Semantics,
I->getOpcode() == Instruction::FPToSI);
638 case Instruction::ShuffleVector:
639 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CxtI) &&
640 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CxtI);
642 case Instruction::Call: {
647 return canEvaluateTruncatedImpl(AbsOp, Ty, IC, CxtI);
654 Value *Op0 = MM->getLHS();
655 Value *Op1 = MM->getRHS();
657 if (MM->isSigned()) {
668 return canEvaluateTruncatedImpl(Op0, Ty, IC, CxtI) &&
669 canEvaluateTruncatedImpl(Op1, Ty, IC, CxtI);
692 Value *VecInput =
nullptr;
701 unsigned VecWidth = VecType->getPrimitiveSizeInBits();
703 unsigned ShiftAmount = ShiftVal ? ShiftVal->
getZExtValue() : 0;
705 if ((VecWidth % DestWidth != 0) || (ShiftAmount % DestWidth != 0))
710 unsigned NumVecElts = VecWidth / DestWidth;
711 if (VecType->getElementType() != DestType) {
716 unsigned Elt = ShiftAmount / DestWidth;
718 Elt = NumVecElts - 1 - Elt;
738 Type *SrcType = Src->getType();
744 unsigned DstBits = DstType->getScalarSizeInBits();
745 unsigned TruncRatio = SrcBits / DstBits;
746 if ((SrcBits % DstBits) != 0)
751 const APInt *ShiftAmount =
nullptr;
759 auto VecElts = VecOpTy->getElementCount();
761 uint64_t BitCastNumElts = VecElts.getKnownMinValue() * TruncRatio;
764 if (Cst->
uge(std::numeric_limits<uint64_t>::max() / TruncRatio))
768 ? (VecOpIdx + 1) * TruncRatio - 1
769 : VecOpIdx * TruncRatio;
775 if (ShiftAmount->
uge(SrcBits) || ShiftAmount->
urem(DstBits) != 0)
781 assert(IdxOfs < TruncRatio &&
782 "IdxOfs is expected to be less than TruncRatio.");
787 assert(BitCastNumElts <= std::numeric_limits<uint32_t>::max() &&
801 "Don't narrow to an illegal scalar type");
813 BinaryOperator *Or0, *Or1;
817 Value *ShVal0, *ShVal1, *ShAmt0, *ShAmt1;
824 if (Or0->
getOpcode() == BinaryOperator::LShr) {
830 Or1->
getOpcode() == BinaryOperator::LShr &&
831 "Illegal or(shift,shift) pair");
840 unsigned MaxShiftAmountWidth =
Log2_32(NarrowWidth);
841 APInt HiBitMask = ~APInt::getLowBitsSet(WideWidth, MaxShiftAmountWidth);
848 if (ShVal0 != ShVal1)
854 unsigned Mask = Width - 1;
867 Value *ShAmt = matchShiftAmount(ShAmt0, ShAmt1, NarrowWidth);
870 ShAmt = matchShiftAmount(ShAmt1, ShAmt0, NarrowWidth);
888 Value *NarrowShAmt =
Builder.CreateZExtOrTrunc(ShAmt, DestTy);
891 X =
Y =
Builder.CreateTrunc(ShVal0, DestTy);
892 if (ShVal0 != ShVal1)
893 Y =
Builder.CreateTrunc(ShVal1, DestTy);
894 Intrinsic::ID IID = IsFshl ? Intrinsic::fshl : Intrinsic::fshr;
911 BinaryOperator *BinOp;
918 case Instruction::And:
919 case Instruction::Or:
920 case Instruction::Xor:
921 case Instruction::Add:
922 case Instruction::Sub:
923 case Instruction::Mul: {
950 case Instruction::LShr:
951 case Instruction::AShr: {
956 unsigned MaxShiftAmt = SrcWidth - DestWidth;
960 APInt(SrcWidth, MaxShiftAmt)))) {
962 bool IsExact = OldShift->isExact();
967 OldShift->getOpcode() == Instruction::AShr
968 ?
Builder.CreateAShr(
A, ShAmt, OldShift->getName(), IsExact)
969 :
Builder.CreateLShr(
A, ShAmt, OldShift->getName(), IsExact);
979 if (Instruction *NarrowOr = narrowFunnelShift(Trunc))
1001 Value *NarrowOp = Builder.CreateTrunc(ShufVec, NewTruncTy);
1016 assert((Opcode == Instruction::Trunc || Opcode == Instruction::FPTrunc) &&
1017 "Unexpected instruction for shrinking");
1038 Type *DestTy = Trunc.
getType(), *SrcTy = Src->getType();
1040 unsigned SrcWidth = SrcTy->getScalarSizeInBits();
1046 if ((DestTy->
isVectorTy() || shouldChangeType(SrcTy, DestTy)) &&
1047 TypeEvaluationHelper::canEvaluateTruncated(Src, DestTy, *
this, &Trunc)) {
1052 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1065 if (DestWidth * 2 < SrcWidth) {
1066 auto *NewDestTy = DestITy->getExtendedType();
1067 if (shouldChangeType(SrcTy, NewDestTy) &&
1068 TypeEvaluationHelper::canEvaluateTruncated(Src, NewDestTy, *
this,
1071 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1072 " to reduce the width of operand of"
1085 if (DestWidth == 1) {
1108 Constant *One = ConstantInt::get(SrcTy,
APInt(SrcWidth, 1));
1116 Constant *One = ConstantInt::get(SrcTy,
APInt(SrcWidth, 1));
1152 A->getType() == DestTy &&
B->getType() == DestTy) {
1154 Trunc,
Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat,
A,
B));
1161 A->getType() == DestTy &&
B->getType() == DestTy) {
1163 Trunc,
Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat,
A,
B));
1167 unsigned AWidth =
A->getType()->getScalarSizeInBits();
1168 unsigned MaxShiftAmt = SrcWidth - std::max(DestWidth, AWidth);
1170 bool IsExact = OldSh->isExact();
1175 APInt(SrcWidth, MaxShiftAmt)))) {
1176 auto GetNewShAmt = [&](
unsigned Width) {
1177 Constant *MaxAmt = ConstantInt::get(SrcTy, Width - 1,
false);
1186 if (
A->getType() == DestTy) {
1187 Constant *ShAmt = GetNewShAmt(DestWidth);
1189 return IsExact ? BinaryOperator::CreateExactAShr(
A, ShAmt)
1190 : BinaryOperator::CreateAShr(
A, ShAmt);
1194 if (Src->hasOneUse()) {
1195 Constant *ShAmt = GetNewShAmt(AWidth);
1212 if (Src->hasOneUse() &&
1220 APInt Threshold =
APInt(
C->getType()->getScalarSizeInBits(), DestWidth);
1222 Value *NewTrunc =
Builder.CreateTrunc(
A, DestTy,
A->getName() +
".tr");
1231 if (SrcTy->isIntegerTy() &&
isPowerOf2_64(SrcTy->getPrimitiveSizeInBits()) &&
1239 APInt UpperBound =
C->getUniqueInteger();
1242 if (!UpperBound.
isZero() && UpperBound - 1 == TruncatedMax) {
1244 {ConstantInt::get(SrcTy, 0),
A});
1246 Intrinsic::smin, {SrcTy},
1247 {
SMax, ConstantInt::get(SrcTy, TruncatedMax)});
1260 unsigned AWidth =
A->getType()->getScalarSizeInBits();
1261 if (AWidth == DestWidth && AWidth >
Log2_32(SrcWidth)) {
1262 Value *WidthDiff = ConstantInt::get(
A->getType(), SrcWidth - AWidth);
1265 return BinaryOperator::CreateAdd(NarrowCtlz, WidthDiff);
1275 if (
Log2_32(*MaxVScale) < DestWidth)
1280 if (DestWidth == 1 &&
1323 return Changed ? &Trunc :
nullptr;
1343 Value *In = Cmp->getOperand(0);
1344 Value *Sh = ConstantInt::get(In->getType(),
1345 In->getType()->getScalarSizeInBits() - 1);
1346 In = Builder.CreateLShr(In, Sh, In->getName() +
".lobit");
1347 if (In->getType() != Zext.
getType())
1348 In = Builder.CreateIntCast(In, Zext.
getType(),
false );
1358 if (Op1CV->
isZero() && Cmp->isEquality()) {
1363 uint32_t ShAmt = KnownZeroMask.logBase2();
1364 bool IsExpectShAmt = KnownZeroMask.isPowerOf2() &&
1366 if (IsExpectShAmt &&
1367 (Cmp->getOperand(0)->getType() == Zext.
getType() ||
1369 Value *In = Cmp->getOperand(0);
1373 In = Builder.CreateLShr(In, ConstantInt::get(In->getType(), ShAmt),
1374 In->getName() +
".lobit");
1379 In =
Builder.CreateXor(In, ConstantInt::get(
In->getType(), 1));
1390 if (
Cmp->isEquality()) {
1399 Value *Shift =
And->getOperand(
X ==
And->getOperand(0) ? 1 : 0);
1406 Builder.CreateAnd(Lshr, ConstantInt::get(
X->getType(), 1));
1434bool TypeEvaluationHelper::canEvaluateZExtd(
Value *V,
Type *Ty,
1435 unsigned &BitsToClear,
1438 TypeEvaluationHelper TYH;
1439 return TYH.canEvaluateZExtdImpl(V, Ty, BitsToClear, IC, CxtI);
1441bool TypeEvaluationHelper::canEvaluateZExtdImpl(
Value *V,
Type *Ty,
1442 unsigned &BitsToClear,
1446 if (canAlwaysEvaluateInType(V, Ty))
1450 if (canNotEvaluateInType(V, Ty))
1455 switch (
I->getOpcode()) {
1456 case Instruction::ZExt:
1457 case Instruction::SExt:
1458 case Instruction::Trunc:
1460 case Instruction::And:
1461 case Instruction::Or:
1462 case Instruction::Xor:
1463 case Instruction::Add:
1464 case Instruction::Sub:
1465 case Instruction::Mul:
1466 if (!canEvaluateZExtdImpl(
I->getOperand(0), Ty, BitsToClear, IC, CxtI) ||
1467 !canEvaluateZExtdImpl(
I->getOperand(1), Ty, Tmp, IC, CxtI))
1470 if (BitsToClear == 0 && Tmp == 0)
1475 if (Tmp == 0 &&
I->isBitwiseLogicOp()) {
1478 unsigned VSize =
V->getType()->getScalarSizeInBits();
1484 if (
I->getOpcode() == Instruction::And)
1493 case Instruction::Shl: {
1498 if (!canEvaluateZExtdImpl(
I->getOperand(0), Ty, BitsToClear, IC, CxtI))
1500 BitsToClear = ShiftAmt < BitsToClear ? BitsToClear - ShiftAmt : 0;
1505 case Instruction::LShr: {
1510 if (!canEvaluateZExtdImpl(
I->getOperand(0), Ty, BitsToClear, IC, CxtI))
1512 BitsToClear += ShiftAmt;
1513 if (BitsToClear >
V->getType()->getScalarSizeInBits())
1514 BitsToClear =
V->getType()->getScalarSizeInBits();
1520 case Instruction::Select:
1521 if (!canEvaluateZExtdImpl(
I->getOperand(1), Ty, Tmp, IC, CxtI) ||
1522 !canEvaluateZExtdImpl(
I->getOperand(2), Ty, BitsToClear, IC, CxtI) ||
1529 case Instruction::PHI: {
1545 case Instruction::Call:
1549 if (
II->getIntrinsicID() == Intrinsic::vscale)
1573 Type *SrcTy = Src->getType(), *DestTy = Zext.
getType();
1576 if (SrcTy->isIntOrIntVectorTy(1) && Zext.
hasNonNeg())
1580 unsigned BitsToClear;
1581 if (shouldChangeType(SrcTy, DestTy) &&
1582 TypeEvaluationHelper::canEvaluateZExtd(Src, DestTy, BitsToClear, *
this,
1585 "Can't clear more bits than in SrcTy");
1589 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1590 " to avoid zero extend: "
1597 if (
SrcOp->hasOneUse())
1600 uint32_t SrcBitsKept = SrcTy->getScalarSizeInBits() - BitsToClear;
1613 return BinaryOperator::CreateAnd(Res,
C);
1624 Value *
A = CSrc->getOperand(0);
1625 unsigned SrcSize =
A->getType()->getScalarSizeInBits();
1626 unsigned MidSize = CSrc->getType()->getScalarSizeInBits();
1632 if (SrcSize < DstSize) {
1634 Constant *AndConst = ConstantInt::get(
A->getType(), AndValue);
1639 if (SrcSize == DstSize) {
1641 return BinaryOperator::CreateAnd(
A, ConstantInt::get(
A->getType(),
1644 if (SrcSize > DstSize) {
1647 return BinaryOperator::CreateAnd(Trunc,
1648 ConstantInt::get(Trunc->
getType(),
1654 return transformZExtICmp(Cmp, Zext);
1660 X->getType() == DestTy)
1661 return BinaryOperator::CreateAnd(
X,
Builder.CreateZExt(
C, DestTy));
1667 X->getType() == DestTy) {
1669 return BinaryOperator::CreateXor(
Builder.CreateAnd(
X, ZC), ZC);
1678 X->getType() == DestTy) {
1680 return BinaryOperator::CreateAnd(
X, ZextC);
1689 unsigned TypeWidth = Src->getType()->getScalarSizeInBits();
1690 if (
Log2_32(*MaxVScale) < TypeWidth)
1699 SrcTy->getScalarSizeInBits() >
1718 Value *Op0 = Cmp->getOperand(0), *Op1 = Cmp->getOperand(1);
1729 Value *In = Builder.CreateAShr(Op0, Sh, Op0->
getName() +
".lobit");
1730 if (In->getType() != Sext.
getType())
1731 In = Builder.CreateIntCast(In, Sext.
getType(),
true );
1740 if (Cmp->hasOneUse() &&
1741 Cmp->isEquality() && (Op1C->isZero() || Op1C->getValue().isPowerOf2())){
1745 if (KnownZeroMask.isPowerOf2()) {
1746 Value *In = Cmp->getOperand(0);
1749 if (!Op1C->isZero() && Op1C->getValue() != KnownZeroMask) {
1759 unsigned ShiftAmt = KnownZeroMask.countr_zero();
1763 ConstantInt::get(
In->getType(), ShiftAmt));
1773 unsigned ShiftAmt = KnownZeroMask.countl_zero();
1777 ConstantInt::get(
In->getType(), ShiftAmt));
1780 In =
Builder.CreateAShr(In, ConstantInt::get(
In->getType(),
1781 KnownZeroMask.getBitWidth() - 1),
"sext");
1801bool TypeEvaluationHelper::canEvaluateSExtd(
Value *V,
Type *Ty) {
1802 TypeEvaluationHelper TYH;
1803 return TYH.canEvaluateSExtdImpl(V, Ty) && TYH.allPendingVisited();
1806bool TypeEvaluationHelper::canEvaluateSExtdImpl(
Value *V,
Type *Ty) {
1807 return canEvaluate(V, Ty, [
this](
Value *V,
Type *Ty) {
1808 return canEvaluateSExtdPred(V, Ty);
1812bool TypeEvaluationHelper::canEvaluateSExtdPred(
Value *V,
Type *Ty) {
1814 "Can't sign extend type to a smaller type");
1817 switch (
I->getOpcode()) {
1818 case Instruction::SExt:
1819 case Instruction::ZExt:
1820 case Instruction::Trunc:
1822 case Instruction::And:
1823 case Instruction::Or:
1824 case Instruction::Xor:
1825 case Instruction::Add:
1826 case Instruction::Sub:
1827 case Instruction::Mul:
1829 return canEvaluateSExtdImpl(
I->getOperand(0), Ty) &&
1830 canEvaluateSExtdImpl(
I->getOperand(1), Ty);
1835 case Instruction::Select:
1836 return canEvaluateSExtdImpl(
I->getOperand(1), Ty) &&
1837 canEvaluateSExtdImpl(
I->getOperand(2), Ty);
1839 case Instruction::PHI: {
1845 if (!canEvaluateSExtdImpl(IncValue, Ty))
1867 Type *SrcTy = Src->getType(), *DestTy = Sext.
getType();
1874 CI->setNonNeg(
true);
1879 bool ShouldExtendExpression =
true;
1880 Value *TruncSrc =
nullptr;
1885 ShouldExtendExpression =
false;
1886 if (ShouldExtendExpression && shouldChangeType(SrcTy, DestTy) &&
1887 TypeEvaluationHelper::canEvaluateSExtd(Src, DestTy)) {
1890 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1891 " to avoid sign extend: "
1902 Value *ShAmt = ConstantInt::get(DestTy, DestBitSize - SrcBitSize);
1903 return BinaryOperator::CreateAShr(
Builder.CreateShl(Res, ShAmt,
"sext"),
1911 unsigned XBitSize =
X->getType()->getScalarSizeInBits();
1916 ResTrunc->setHasNoSignedWrap(
true);
1921 if (Src->hasOneUse() &&
X->getType() == DestTy) {
1923 Constant *ShAmt = ConstantInt::get(DestTy, DestBitSize - SrcBitSize);
1924 return BinaryOperator::CreateAShr(
Builder.CreateShl(
X, ShAmt), ShAmt);
1932 if (Src->hasOneUse() &&
1941 return transformSExtICmp(Cmp, Sext);
1958 Constant *BA =
nullptr, *CA =
nullptr;
1964 assert(WideCurrShAmt &&
"Constant folding of ImmConstant cannot fail");
1973 return BinaryOperator::CreateAShr(
A, NewShAmt);
1981 Type *XTy =
X->getType();
1983 Constant *ShlAmtC = ConstantInt::get(XTy, XBitSize - SrcBitSize);
1984 Constant *AshrAmtC = ConstantInt::get(XTy, XBitSize - 1);
1986 return BinaryOperator::CreateAShr(
Builder.CreateShl(
X, ShlAmtC),
2000 if (
Log2_32(*MaxVScale) < (SrcBitSize - 1))
2011 if ((IID == Intrinsic::scmp || IID == Intrinsic::ucmp) &&
II->hasOneUse())
2013 Sext,
Builder.CreateIntrinsic(
2014 DestTy, IID, {II->getArgOperand(0), II->getArgOperand(1)}));
2029 bool PreferBFloat) {
2050 if (Ty->getScalarType()->isPPC_FP128Ty())
2070 Type *MinType =
nullptr;
2072 unsigned NumElts = CVVTy->getNumElements();
2076 for (
unsigned I = 0;
I != NumElts; ++
I) {
2101 return FPExt->getOperand(0)->getType();
2129 return V->getType();
2135 Type *SrcTy = V->getType();
2136 assert(SrcTy->isIntOrIntVectorTy() &&
"Expected an integer type");
2137 int SrcSize = (int)SrcTy->getScalarSizeInBits() - IsSigned;
2142 if (SrcSize <= DestNumSigBits)
2151 int SrcNumSigBits =
F->getType()->getFPMantissaWidth();
2158 if (SrcNumSigBits > 0 && DestNumSigBits > 0 &&
2159 SrcNumSigBits <= DestNumSigBits)
2166 int SigBits = (int)SrcTy->getScalarSizeInBits() -
2169 if (SigBits <= DestNumSigBits)
2176 if (SigBits <= DestNumSigBits)
2185 assert((Opcode == CastInst::SIToFP || Opcode == CastInst::UIToFP) &&
2187 Value *Src =
I.getOperand(0);
2188 Type *FPTy =
I.getType();
2205 if (BO && BO->hasOneUse()) {
2208 unsigned OpWidth = BO->getType()->getFPMantissaWidth();
2211 unsigned SrcWidth = std::max(LHSWidth, RHSWidth);
2212 unsigned DstWidth = Ty->getFPMantissaWidth();
2213 switch (BO->getOpcode()) {
2215 case Instruction::FAdd:
2216 case Instruction::FSub:
2235 if (OpWidth >= 2*DstWidth+1 && DstWidth >= SrcWidth) {
2236 Value *LHS =
Builder.CreateFPTrunc(BO->getOperand(0), Ty);
2237 Value *RHS =
Builder.CreateFPTrunc(BO->getOperand(1), Ty);
2243 case Instruction::FMul:
2249 if (OpWidth >= LHSWidth + RHSWidth && DstWidth >= SrcWidth) {
2250 Value *LHS =
Builder.CreateFPTrunc(BO->getOperand(0), Ty);
2251 Value *RHS =
Builder.CreateFPTrunc(BO->getOperand(1), Ty);
2255 case Instruction::FDiv:
2262 if (OpWidth >= 2*DstWidth && DstWidth >= SrcWidth) {
2263 Value *LHS =
Builder.CreateFPTrunc(BO->getOperand(0), Ty);
2264 Value *RHS =
Builder.CreateFPTrunc(BO->getOperand(1), Ty);
2268 case Instruction::FRem: {
2273 if (SrcWidth == OpWidth)
2276 if (LHSWidth == SrcWidth) {
2277 LHS =
Builder.CreateFPTrunc(BO->getOperand(0), LHSMinType);
2278 RHS =
Builder.CreateFPTrunc(BO->getOperand(1), LHSMinType);
2280 LHS =
Builder.CreateFPTrunc(BO->getOperand(0), RHSMinType);
2281 RHS =
Builder.CreateFPTrunc(BO->getOperand(1), RHSMinType);
2284 Value *ExactResult =
Builder.CreateFRemFMF(LHS, RHS, BO);
2293 if (
Op &&
Op->hasOneUse()) {
2296 FMF &= FPMO->getFastMathFlags();
2308 X->getType() == Ty) {
2312 Builder.CreateSelectFMF(
Cond,
X, NarrowY, FMF,
"narrow.sel",
Op);
2316 X->getType() == Ty) {
2320 Builder.CreateSelectFMF(
Cond, NarrowY,
X, FMF,
"narrow.sel",
Op);
2326 switch (
II->getIntrinsicID()) {
2328 case Intrinsic::ceil:
2329 case Intrinsic::fabs:
2330 case Intrinsic::floor:
2331 case Intrinsic::nearbyint:
2332 case Intrinsic::rint:
2333 case Intrinsic::round:
2334 case Intrinsic::roundeven:
2335 case Intrinsic::trunc: {
2336 Value *Src =
II->getArgOperand(0);
2337 if (!Src->hasOneUse())
2343 if (
II->getIntrinsicID() != Intrinsic::fabs) {
2345 if (!FPExtSrc || FPExtSrc->
getSrcTy() != Ty)
2355 II->getOperandBundlesAsDefs(OpBundles);
2397template <
typename FPToIntTy>
2399 constexpr bool IsSaturating = std::is_same_v<FPToIntTy, IntrinsicInst>;
2405 Value *
X = OpI->getOperand(0);
2406 Type *XType =
X->getType();
2407 Type *DestType = FI.getType();
2410 bool IsOutputSigned;
2411 if constexpr (IsSaturating)
2412 IsOutputSigned = FI.getIntrinsicID() == Intrinsic::fptosi_sat;
2423 if constexpr (!IsSaturating) {
2431 if (OutputSize > OpI->getType()->getFPMantissaWidth())
2443 if constexpr (IsSaturating) {
2446 if (IsInputSigned != IsOutputSigned || DestWidth < SrcWidth)
2450 if (DestWidth > SrcWidth) {
2451 if (IsInputSigned && IsOutputSigned)
2455 if (DestWidth < SrcWidth)
2458 assert(XType == DestType &&
"Unexpected types for int to FP to int casts");
2514 UI->setNonNeg(
true);
2526 DL.getPointerSizeInBits(AS)) {
2538 auto UsesPointerAsInt = [](
User *U) {
2549 Base->getType()->getPointerAddressSpace() &&
2566 if (!
GEP || !
GEP->hasOneUse())
2569 Ptr =
GEP->getPointerOperand();
2578 Type *IdxTy =
DL.getIndexType(PtrTy);
2580 Res->
getType() == IntTy && IntTy == IdxTy) {
2593 return Builder.CreateZExtOrTrunc(Res, IntTy);
2604 unsigned TySize = Ty->getScalarSizeInBits();
2605 unsigned PtrSize =
DL.getPointerSizeInBits(AS);
2606 if (TySize != PtrSize) {
2619 Mask->getType() == Ty)
2620 return BinaryOperator::CreateAnd(
Builder.CreatePtrToInt(Ptr, Ty), Mask);
2625 Value *Vec, *Scalar, *Index;
2632 Value *NewCast =
Builder.CreatePtrToInt(Scalar, Ty->getScalarType());
2649 Mask->getType() == Ty)
2650 return BinaryOperator::CreateAnd(
Builder.CreatePtrToAddr(Ptr), Mask);
2683 if (SrcTy->getElementType() != DestTy->getElementType()) {
2688 if (SrcTy->getElementType()->getPrimitiveSizeInBits() !=
2689 DestTy->getElementType()->getPrimitiveSizeInBits())
2702 assert(SrcElts != DestElts &&
"Element counts should be different.");
2711 if (SrcElts > DestElts) {
2720 ShuffleMask = ShuffleMaskStorage;
2722 ShuffleMask = ShuffleMask.take_back(DestElts);
2724 ShuffleMask = ShuffleMask.take_front(DestElts);
2735 unsigned DeltaElts = DestElts - SrcElts;
2737 ShuffleMaskStorage.insert(ShuffleMaskStorage.begin(), DeltaElts, NullElt);
2739 ShuffleMaskStorage.append(DeltaElts, NullElt);
2740 ShuffleMask = ShuffleMaskStorage;
2747 return Value % Ty->getPrimitiveSizeInBits() == 0;
2751 return Value / Ty->getPrimitiveSizeInBits();
2768 "Shift should be a multiple of the element type size");
2776 if (V->getType() == VecEltTy) {
2779 if (
C->isNullValue())
2784 ElementIndex = Elements.size() - ElementIndex - 1;
2787 if (Elements[ElementIndex])
2790 Elements[ElementIndex] = V;
2809 C->getType()->getPrimitiveSizeInBits()));
2813 for (
unsigned i = 0; i != NumElts; ++i) {
2814 unsigned ShiftI = i * ElementSize;
2816 Instruction::LShr,
C, ConstantInt::get(
C->getType(), ShiftI));
2828 if (!V->hasOneUse())
return false;
2831 if (!
I)
return false;
2832 switch (
I->getOpcode()) {
2833 default:
return false;
2834 case Instruction::BitCast:
2835 if (
I->getOperand(0)->getType()->isVectorTy())
2839 case Instruction::ZExt:
2841 I->getOperand(0)->getType()->getPrimitiveSizeInBits(),
2846 case Instruction::Or:
2851 case Instruction::Shl: {
2854 if (!CI)
return false;
2891 DestVecTy->getElementType(),
2899 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
2900 if (!Elements[i])
continue;
2915 Value *VecOp, *Index;
2933 if (DestType->
isVectorTy() && FixedVType && FixedVType->getNumElements() == 1)
2960 if (
X->getType()->isFPOrFPVectorTy() &&
2961 Y->getType()->isIntOrIntVectorTy()) {
2963 Builder.CreateBitCast(BO->
getOperand(0),
Y->getType());
2967 if (
X->getType()->isIntOrIntVectorTy() &&
2968 Y->getType()->isFPOrFPVectorTy()) {
2970 Builder.CreateBitCast(BO->
getOperand(1),
X->getType());
3004 Value *CastedC = Builder.CreateBitCast(
C, DestTy);
3027 CondVTy->getElementCount() != DestVecTy->getElementCount())
3036 SrcVecTy->getElementCount())))) {
3039 Value *CastedTVal = Builder.CreateBitCast(TVal, DestTy);
3040 Value *CastedFVal = Builder.CreateBitCast(FVal, DestTy);
3048 if ((DestVecTy !=
nullptr) != (SrcVecTy !=
nullptr))
3055 Value *CastedVal = Builder.CreateBitCast(FVal, DestTy);
3062 Value *CastedVal = Builder.CreateBitCast(TVal, DestTy);
3093 Type *SrcTy = Src->getType();
3097 SmallSetVector<PHINode *, 4> OldPhiNodes;
3105 while (!PhiWorklist.
empty()) {
3107 for (
Value *IncValue : OldPN->incoming_values()) {
3116 Value *Addr = LI->getOperand(0);
3125 if (LI->hasOneUse() && LI->isSimple())
3133 if (OldPhiNodes.
insert(PNode))
3144 Type *TyA = BCI->getOperand(0)->getType();
3145 Type *TyB = BCI->getType();
3146 if (TyA != DestTy || TyB != SrcTy)
3153 for (
auto *OldPN : OldPhiNodes) {
3154 for (User *V : OldPN->users()) {
3156 if (!
SI->isSimple() ||
SI->getOperand(0) != OldPN)
3160 Type *TyB = BCI->getOperand(0)->getType();
3161 Type *TyA = BCI->getType();
3162 if (TyA != DestTy || TyB != SrcTy)
3168 if (!OldPhiNodes.contains(
PHI))
3177 SmallDenseMap<PHINode *, PHINode *> NewPNodes;
3178 for (
auto *OldPN : OldPhiNodes) {
3179 Builder.SetInsertPoint(OldPN);
3180 PHINode *NewPN =
Builder.CreatePHI(DestTy, OldPN->getNumOperands());
3181 NewPNodes[OldPN] = NewPN;
3185 for (
auto *OldPN : OldPhiNodes) {
3186 PHINode *NewPN = NewPNodes[OldPN];
3187 for (
unsigned j = 0, e = OldPN->getNumOperands(); j != e; ++j) {
3188 Value *
V = OldPN->getOperand(j);
3189 Value *NewV =
nullptr;
3202 NewV = BCI->getOperand(0);
3204 NewV = NewPNodes[PrevPN];
3207 NewPN->
addIncoming(NewV, OldPN->getIncomingBlock(j));
3221 for (
auto *OldPN : OldPhiNodes) {
3222 PHINode *NewPN = NewPNodes[OldPN];
3225 assert(
SI->isSimple() &&
SI->getOperand(0) == OldPN);
3229 SI->setOperand(0, NewBC);
3234 Type *TyB = BCI->getOperand(0)->getType();
3235 Type *TyA = BCI->getType();
3236 assert(TyA == DestTy && TyB == SrcTy);
3267 if (
X->getType() != FTy)
3272 return Builder.CreateCopySign(Builder.CreateBitCast(
Y, FTy),
X);
3279 Type *SrcTy = Src->getType();
3284 if (DestTy == Src->getType())
3310 if (SrcVTy->getNumElements() == 1) {
3315 Builder.CreateExtractElement(Src,
3324 return new BitCastInst(InsElt->getOperand(1), DestTy);
3334 Y->getType()->isIntegerTy() && isDesirableIntType(
BitWidth)) {
3336 if (
DL.isBigEndian())
3337 IndexC = SrcVTy->getNumElements() - 1 - IndexC;
3343 unsigned EltWidth =
Y->getType()->getScalarSizeInBits();
3347 return BinaryOperator::CreateOr(AndX, ZextY);
3355 Value *ShufOp0 = Shuf->getOperand(0);
3356 Value *ShufOp1 = Shuf->getOperand(1);
3359 if (Shuf->hasOneUse() && DestTy->
isVectorTy() &&
3361 ShufElts == SrcVecElts) {
3382 if (DestTy->
isIntegerTy() && ShufElts.getKnownMinValue() % 2 == 0 &&
3383 Shuf->hasOneUse() && Shuf->isReverse()) {
3384 unsigned IntrinsicNum = 0;
3386 SrcTy->getScalarSizeInBits() == 8) {
3387 IntrinsicNum = Intrinsic::bswap;
3388 }
else if (SrcTy->getScalarSizeInBits() == 1) {
3389 IntrinsicNum = Intrinsic::bitreverse;
3391 if (IntrinsicNum != 0) {
3392 assert(ShufOp0->
getType() == SrcTy &&
"Unexpected shuffle mask");
3396 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< 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 const fltSemantics & BFloat()
static const fltSemantics & IEEEdouble()
static constexpr roundingMode rmNearestTiesToEven
static const fltSemantics & IEEEhalf()
static LLVM_ABI unsigned int semanticsIntSizeInBits(const fltSemantics &, bool)
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 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.
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.
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 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...
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.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
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.
@ C
The default llvm calling convention, compatible with C.
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.
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)
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)
TwoOps_match< Val_t, Idx_t, Instruction::ExtractElement > m_ExtractElt(const Val_t &Val, const Idx_t &Idx)
Matches ExtractElementInst.
cst_pred_ty< is_one > m_One()
Match an integer 1 or a vector with all elements equal to 1.
IntrinsicID_match m_Intrinsic()
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
IntrinsicID_match m_VScale()
Matches a call to llvm.vscale().
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.
MaxMin_match< ICmpInst, LHS, RHS, smin_pred_ty > m_SMin(const LHS &L, const RHS &R)
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.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
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.
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.
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.
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
CastInst_match< OpTy, FPToSIInst > m_FPToSI(const OpTy &Op)
MaxMin_match< ICmpInst, LHS, RHS, smax_pred_ty > m_SMax(const LHS &L, const RHS &R)
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)
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)
m_Intrinsic_Ty< Opnd0, Opnd1 >::Ty m_Ctlz(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_Undef()
Match an arbitrary undef constant.
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)
MaxMin_match< ICmpInst, LHS, RHS, umin_pred_ty > m_UMin(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.
FunctionAddr VTableAddr Value
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.
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.)
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.
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