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);
91 if (Trunc->getType()->getScalarSizeInBits() <=
92 Ty->getScalarSizeInBits()) {
93 NewTrunc->setHasNoSignedWrap(Trunc->hasNoSignedWrap());
94 NewTrunc->setHasNoUnsignedWrap(Trunc->hasNoUnsignedWrap());
97 if (Trunc->hasNoUnsignedWrap())
102 case Instruction::Select: {
111 case Instruction::PHI: {
122 case Instruction::FPToUI:
123 case Instruction::FPToSI:
125 I->getOperand(0), Ty);
127 case Instruction::Call:
129 switch (
II->getIntrinsicID()) {
132 case Intrinsic::vscale: {
134 I->getModule(), Intrinsic::vscale, {Ty});
138 case Intrinsic::umin:
139 case Intrinsic::umax:
140 case Intrinsic::smin:
141 case Intrinsic::smax: {
147 I->getModule(),
II->getIntrinsicID(), {Ty});
151 case Intrinsic::abs: {
155 I->getModule(),
II->getIntrinsicID(), {Ty});
157 {Arg, ConstantInt::getFalse(I->getContext())});
163 case Instruction::ShuffleVector: {
186 Processed[V] = Result;
200InstCombinerImpl::isEliminableCastPair(
const CastInst *CI1,
217 if ((Res == Instruction::IntToPtr && SrcTy != DstIntPtrTy) ||
218 (Res == Instruction::PtrToInt && DstTy != SrcIntPtrTy))
240 if (CSrc->hasOneUse())
260 if (CI.
getOpcode() != Instruction::BitCast ||
290 if (SrcTy && DestTy &&
291 SrcTy->getNumElements() == DestTy->getNumElements() &&
292 SrcTy->getPrimitiveSizeInBits() == DestTy->getPrimitiveSizeInBits()) {
305class TypeEvaluationHelper {
310 [[nodiscard]]
static bool canEvaluateTruncated(
Value *V,
Type *Ty,
316 [[nodiscard]]
static bool canEvaluateZExtd(
Value *V,
Type *Ty,
317 unsigned &BitsToClear,
324 [[nodiscard]]
static bool canEvaluateSExtd(
Value *V,
Type *Ty);
329 [[nodiscard]]
static bool canAlwaysEvaluateInType(
Value *V,
Type *Ty);
332 [[nodiscard]]
bool allPendingVisited()
const {
334 [
this](
Value *V) {
return Visited.contains(V); });
342 if (canAlwaysEvaluateInType(V, Ty))
351 const auto [It,
Inserted] = Visited.insert({
V,
false});
368 return It->getSecond();
429 if (!
I->hasOneUse()) {
430 for (Use &U :
I->uses()) {
438 Pending.push_back(
U.getUser());
442 const bool Result = Pred(V, Ty);
451 [[nodiscard]]
bool canNotEvaluateInType(
Value *V,
Type *Ty);
453 [[nodiscard]]
bool canEvaluateTruncatedImpl(
Value *V,
Type *Ty,
454 InstCombinerImpl &IC,
456 [[nodiscard]]
bool canEvaluateTruncatedPred(
Value *V,
Type *Ty,
457 InstCombinerImpl &IC,
459 [[nodiscard]]
bool canEvaluateZExtdImpl(
Value *V,
Type *Ty,
460 unsigned &BitsToClear,
461 InstCombinerImpl &IC,
463 [[nodiscard]]
bool canEvaluateSExtdImpl(
Value *V,
Type *Ty);
464 [[nodiscard]]
bool canEvaluateSExtdPred(
Value *V,
Type *Ty);
468 SmallDenseMap<Value *, bool, 8> Visited;
471 SmallVector<Value *, 8> Pending;
478bool TypeEvaluationHelper::canAlwaysEvaluateInType(
Value *V,
Type *Ty) {
492bool TypeEvaluationHelper::canNotEvaluateInType(
Value *V,
Type *Ty) {
514bool TypeEvaluationHelper::canEvaluateTruncated(
Value *V,
Type *Ty,
517 TypeEvaluationHelper TYH;
518 return TYH.canEvaluateTruncatedImpl(V, Ty, IC, CtxI) &&
521 TYH.allPendingVisited();
524bool TypeEvaluationHelper::canEvaluateTruncatedImpl(
Value *V,
Type *Ty,
527 return canEvaluate(V, Ty, [
this, &IC, CtxI](
Value *V,
Type *Ty) {
528 return canEvaluateTruncatedPred(V, Ty, IC, CtxI);
532bool TypeEvaluationHelper::canEvaluateTruncatedPred(
Value *V,
Type *Ty,
536 Type *OrigTy =
V->getType();
537 switch (
I->getOpcode()) {
538 case Instruction::Add:
539 case Instruction::Sub:
540 case Instruction::Mul:
541 case Instruction::And:
542 case Instruction::Or:
543 case Instruction::Xor:
545 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CtxI) &&
546 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CtxI);
548 case Instruction::UDiv:
549 case Instruction::URem: {
559 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CtxI) &&
560 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CtxI);
564 case Instruction::Shl: {
571 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CtxI) &&
572 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CtxI);
575 case Instruction::LShr: {
590 auto DemandedBits = Trunc->getType()->getScalarSizeInBits();
592 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CtxI) &&
593 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CtxI);
596 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CtxI) &&
597 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CtxI);
601 case Instruction::AShr: {
611 unsigned ShiftedBits = OrigBitWidth -
BitWidth;
614 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CtxI) &&
615 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CtxI);
618 case Instruction::Trunc:
621 case Instruction::ZExt:
622 case Instruction::SExt:
626 case Instruction::Select: {
628 return canEvaluateTruncatedImpl(
SI->getTrueValue(), Ty, IC, CtxI) &&
629 canEvaluateTruncatedImpl(
SI->getFalseValue(), Ty, IC, CtxI);
631 case Instruction::PHI: {
638 return canEvaluateTruncatedImpl(IncValue, Ty, IC, CtxI);
641 case Instruction::FPToUI:
642 case Instruction::FPToSI: {
649 Semantics,
I->getOpcode() == Instruction::FPToSI);
652 case Instruction::ShuffleVector:
653 return canEvaluateTruncatedImpl(
I->getOperand(0), Ty, IC, CtxI) &&
654 canEvaluateTruncatedImpl(
I->getOperand(1), Ty, IC, CtxI);
656 case Instruction::Call: {
661 return canEvaluateTruncatedImpl(AbsOp, Ty, IC, CtxI);
668 Value *Op0 = MM->getLHS();
669 Value *Op1 = MM->getRHS();
671 if (MM->isSigned()) {
682 return canEvaluateTruncatedImpl(Op0, Ty, IC, CtxI) &&
683 canEvaluateTruncatedImpl(Op1, Ty, IC, CtxI);
706 Value *VecInput =
nullptr;
715 unsigned VecWidth = VecType->getPrimitiveSizeInBits();
717 unsigned ShiftAmount = ShiftVal ? ShiftVal->
getZExtValue() : 0;
719 if ((VecWidth % DestWidth != 0) || (ShiftAmount % DestWidth != 0))
724 unsigned NumVecElts = VecWidth / DestWidth;
725 if (VecType->getElementType() != DestType) {
730 unsigned Elt = ShiftAmount / DestWidth;
732 Elt = NumVecElts - 1 - Elt;
752 Type *SrcType = Src->getType();
758 unsigned DstBits = DstType->getScalarSizeInBits();
759 uint64_t TruncRatio = SrcBits / DstBits;
760 if ((SrcBits % DstBits) != 0)
765 const APInt *ShiftAmount =
nullptr;
773 auto VecElts = VecOpTy->getElementCount();
775 uint64_t BitCastNumElts = VecElts.getKnownMinValue() * TruncRatio;
783 if (Cst->
uge(std::numeric_limits<uint64_t>::max() / TruncRatio))
787 ? (VecOpIdx + 1) * TruncRatio - 1
788 : VecOpIdx * TruncRatio;
794 if (ShiftAmount->
uge(SrcBits) || ShiftAmount->
urem(DstBits) != 0)
800 assert(IdxOfs < TruncRatio &&
801 "IdxOfs is expected to be less than TruncRatio.");
817 "Don't narrow to an illegal scalar type");
829 BinaryOperator *Or0, *Or1;
833 Value *ShVal0, *ShVal1, *ShAmt0, *ShAmt1;
840 if (Or0->
getOpcode() == BinaryOperator::LShr) {
846 Or1->
getOpcode() == BinaryOperator::LShr &&
847 "Illegal or(shift,shift) pair");
856 unsigned MaxShiftAmountWidth =
Log2_32(NarrowWidth);
857 APInt HiBitMask = ~APInt::getLowBitsSet(WideWidth, MaxShiftAmountWidth);
864 if (ShVal0 != ShVal1)
870 unsigned Mask = Width - 1;
883 Value *ShAmt = matchShiftAmount(ShAmt0, ShAmt1, NarrowWidth);
886 ShAmt = matchShiftAmount(ShAmt1, ShAmt0, NarrowWidth);
904 Value *NarrowShAmt =
Builder.CreateZExtOrTrunc(ShAmt, DestTy);
907 X =
Y =
Builder.CreateTrunc(ShVal0, DestTy);
908 if (ShVal0 != ShVal1)
909 Y =
Builder.CreateTrunc(ShVal1, DestTy);
910 Intrinsic::ID IID = IsFshl ? Intrinsic::fshl : Intrinsic::fshr;
927 BinaryOperator *BinOp;
934 case Instruction::And:
935 case Instruction::Or:
936 case Instruction::Xor:
937 case Instruction::Add:
938 case Instruction::Sub:
939 case Instruction::Mul: {
966 case Instruction::LShr:
967 case Instruction::AShr: {
972 unsigned MaxShiftAmt = SrcWidth - DestWidth;
976 APInt(SrcWidth, MaxShiftAmt)))) {
978 bool IsExact = OldShift->isExact();
983 OldShift->getOpcode() == Instruction::AShr
984 ?
Builder.CreateAShr(
A, ShAmt, OldShift->getName(), IsExact)
985 :
Builder.CreateLShr(
A, ShAmt, OldShift->getName(), IsExact);
995 if (Instruction *NarrowOr = narrowFunnelShift(Trunc))
1017 Value *NarrowOp = Builder.CreateTrunc(ShufVec, NewTruncTy);
1032 assert((Opcode == Instruction::Trunc || Opcode == Instruction::FPTrunc) &&
1033 "Unexpected instruction for shrinking");
1054 Type *DestTy = Trunc.
getType(), *SrcTy = Src->getType();
1056 unsigned SrcWidth = SrcTy->getScalarSizeInBits();
1062 if ((DestTy->
isVectorTy() || shouldChangeType(SrcTy, DestTy)) &&
1063 TypeEvaluationHelper::canEvaluateTruncated(Src, DestTy, *
this, &Trunc)) {
1068 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1081 if (DestWidth * 2 < SrcWidth) {
1082 auto *NewDestTy = DestITy->getExtendedType();
1083 if (shouldChangeType(SrcTy, NewDestTy) &&
1084 TypeEvaluationHelper::canEvaluateTruncated(Src, NewDestTy, *
this,
1087 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1088 " to reduce the width of operand of"
1096 if (DestWidth == 1 &&
1106 if (DestWidth == 1) {
1128 Constant *One = ConstantInt::get(SrcTy,
APInt(SrcWidth, 1));
1136 Constant *One = ConstantInt::get(SrcTy,
APInt(SrcWidth, 1));
1174 Trunc,
Builder.CreateBinaryIntrinsic(Intrinsic::uadd_sat,
A,
B));
1183 Trunc,
Builder.CreateBinaryIntrinsic(Intrinsic::usub_sat,
A,
B));
1187 unsigned AWidth =
A->getType()->getScalarSizeInBits();
1188 unsigned MaxShiftAmt = SrcWidth - std::max(DestWidth, AWidth);
1190 bool IsExact = OldSh->isExact();
1195 APInt(SrcWidth, MaxShiftAmt)))) {
1196 auto GetNewShAmt = [&](
unsigned Width) {
1197 Constant *MaxAmt = ConstantInt::get(SrcTy, Width - 1,
false);
1206 if (
A->getType() == DestTy) {
1207 Constant *ShAmt = GetNewShAmt(DestWidth);
1209 return IsExact ? BinaryOperator::CreateExactAShr(
A, ShAmt)
1210 : BinaryOperator::CreateAShr(
A, ShAmt);
1214 if (Src->hasOneUse()) {
1215 Constant *ShAmt = GetNewShAmt(AWidth);
1232 if (Src->hasOneUse() &&
1240 APInt Threshold =
APInt(
C->getType()->getScalarSizeInBits(), DestWidth);
1247 Value *NewTrunc =
Builder.CreateTrunc(
A, DestTy,
A->getName() +
".tr",
1251 NewShl->setHasNoUnsignedWrap(NUW);
1252 NewShl->setHasNoSignedWrap(NSW);
1271 Value *SExtVal =
nullptr;
1281 {ConstantInt::get(SrcTy, 0),
A});
1283 Intrinsic::smin, {SrcTy},
1284 {
SMax, ConstantInt::get(SrcTy, TruncatedMax)});
1297 unsigned AWidth =
A->getType()->getScalarSizeInBits();
1298 if (AWidth == DestWidth && AWidth >
Log2_32(SrcWidth)) {
1299 Value *WidthDiff = ConstantInt::get(
A->getType(), SrcWidth - AWidth);
1302 return BinaryOperator::CreateAdd(NarrowCtlz, WidthDiff);
1312 if (
Log2_32(*MaxVScale) < DestWidth)
1324 Trunc,
Builder.CreateIntrinsic(DestTy, CI->getIntrinsicID(),
1325 {CI->getLHS(), CI->getRHS()}));
1327 if (DestWidth == 1 &&
1370 return Changed ? &Trunc :
nullptr;
1390 Value *In = Cmp->getOperand(0);
1391 Value *Sh = ConstantInt::get(In->getType(),
1392 In->getType()->getScalarSizeInBits() - 1);
1393 In = Builder.CreateLShr(In, Sh, In->getName() +
".lobit");
1394 if (In->getType() != Zext.
getType())
1395 In = Builder.CreateIntCast(In, Zext.
getType(),
false );
1405 if (Op1CV->
isZero() && Cmp->isEquality()) {
1410 uint32_t ShAmt = KnownZeroMask.logBase2();
1411 bool IsExpectShAmt = KnownZeroMask.isPowerOf2() &&
1413 if (IsExpectShAmt &&
1414 (Cmp->getOperand(0)->getType() == Zext.
getType() ||
1416 Value *In = Cmp->getOperand(0);
1420 In = Builder.CreateLShr(In, ConstantInt::get(In->getType(), ShAmt),
1421 In->getName() +
".lobit");
1426 In =
Builder.CreateXor(In, ConstantInt::get(
In->getType(), 1));
1437 if (
Cmp->isEquality()) {
1446 Value *Shift =
And->getOperand(
X ==
And->getOperand(0) ? 1 : 0);
1453 Builder.CreateAnd(Lshr, ConstantInt::get(
X->getType(), 1));
1481bool TypeEvaluationHelper::canEvaluateZExtd(
Value *V,
Type *Ty,
1482 unsigned &BitsToClear,
1485 TypeEvaluationHelper TYH;
1486 return TYH.canEvaluateZExtdImpl(V, Ty, BitsToClear, IC, CtxI);
1488bool TypeEvaluationHelper::canEvaluateZExtdImpl(
Value *V,
Type *Ty,
1489 unsigned &BitsToClear,
1493 if (canAlwaysEvaluateInType(V, Ty))
1497 if (canNotEvaluateInType(V, Ty))
1502 switch (
I->getOpcode()) {
1503 case Instruction::ZExt:
1504 case Instruction::SExt:
1505 case Instruction::Trunc:
1507 case Instruction::And:
1508 case Instruction::Or:
1509 case Instruction::Xor:
1510 case Instruction::Add:
1511 case Instruction::Sub:
1512 case Instruction::Mul:
1513 if (!canEvaluateZExtdImpl(
I->getOperand(0), Ty, BitsToClear, IC, CtxI) ||
1514 !canEvaluateZExtdImpl(
I->getOperand(1), Ty, Tmp, IC, CtxI))
1517 if (BitsToClear == 0 && Tmp == 0)
1522 if (Tmp == 0 &&
I->isBitwiseLogicOp()) {
1525 unsigned VSize =
V->getType()->getScalarSizeInBits();
1531 if (
I->getOpcode() == Instruction::And)
1540 case Instruction::Shl: {
1545 if (!canEvaluateZExtdImpl(
I->getOperand(0), Ty, BitsToClear, IC, CtxI))
1547 BitsToClear = ShiftAmt < BitsToClear ? BitsToClear - ShiftAmt : 0;
1552 case Instruction::LShr: {
1557 if (!canEvaluateZExtdImpl(
I->getOperand(0), Ty, BitsToClear, IC, CtxI))
1559 BitsToClear += ShiftAmt;
1560 if (BitsToClear >
V->getType()->getScalarSizeInBits())
1561 BitsToClear =
V->getType()->getScalarSizeInBits();
1567 case Instruction::Select:
1568 if (!canEvaluateZExtdImpl(
I->getOperand(1), Ty, Tmp, IC, CtxI) ||
1569 !canEvaluateZExtdImpl(
I->getOperand(2), Ty, BitsToClear, IC, CtxI) ||
1576 case Instruction::PHI: {
1592 case Instruction::Call:
1596 if (
II->getIntrinsicID() == Intrinsic::vscale)
1620 Type *SrcTy = Src->getType(), *DestTy = Zext.
getType();
1623 if (SrcTy->isIntOrIntVectorTy(1) && Zext.
hasNonNeg())
1632 bool EvaluateAsSigned =
1633 Zext.
hasNonNeg() && TypeEvaluationHelper::canEvaluateSExtd(Src, DestTy);
1636 unsigned BitsToClear = 0;
1637 if (shouldChangeType(SrcTy, DestTy) &&
1638 (EvaluateAsSigned || TypeEvaluationHelper::canEvaluateZExtd(
1639 Src, DestTy, BitsToClear, *
this, &Zext))) {
1641 "Can't clear more bits than in SrcTy");
1645 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1646 " to avoid zero extend: "
1653 if (
SrcOp->hasOneUse())
1656 uint32_t SrcBitsKept = SrcTy->getScalarSizeInBits() - BitsToClear;
1662 if (EvaluateAsSigned
1673 return BinaryOperator::CreateAnd(Res,
C);
1684 Value *
A = CSrc->getOperand(0);
1685 unsigned SrcSize =
A->getType()->getScalarSizeInBits();
1686 unsigned MidSize = CSrc->getType()->getScalarSizeInBits();
1692 if (SrcSize < DstSize) {
1694 Constant *AndConst = ConstantInt::get(
A->getType(), AndValue);
1699 if (SrcSize == DstSize) {
1701 return BinaryOperator::CreateAnd(
A, ConstantInt::get(
A->getType(),
1704 if (SrcSize > DstSize) {
1707 return BinaryOperator::CreateAnd(Trunc,
1708 ConstantInt::get(Trunc->
getType(),
1714 return transformZExtICmp(Cmp, Zext);
1724 return BinaryOperator::CreateXor(
Builder.CreateAnd(
X, ZC), ZC);
1730 SrcTy->getScalarSizeInBits());
1731 Value *Neg =
Builder.CreateSub(ConstantInt::get(DestTy, 0),
X);
1732 return BinaryOperator::CreateAnd(Neg, ConstantInt::get(DestTy, Mask));
1742 return BinaryOperator::CreateAnd(
X, ZextC);
1759 unsigned TypeWidth = Src->getType()->getScalarSizeInBits();
1760 if (
Log2_32(*MaxVScale) < TypeWidth)
1769 SrcTy->getScalarSizeInBits() >
1788 Value *Op0 = Cmp->getOperand(0), *Op1 = Cmp->getOperand(1);
1799 Value *In = Builder.CreateAShr(Op0, Sh, Op0->
getName() +
".lobit");
1800 if (In->getType() != Sext.
getType())
1801 In = Builder.CreateIntCast(In, Sext.
getType(),
true );
1810 if (Cmp->hasOneUse() &&
1811 Cmp->isEquality() && (Op1C->isZero() || Op1C->getValue().isPowerOf2())){
1815 if (KnownZeroMask.isPowerOf2()) {
1816 Value *In = Cmp->getOperand(0);
1819 if (!Op1C->isZero() && Op1C->getValue() != KnownZeroMask) {
1829 unsigned ShiftAmt = KnownZeroMask.countr_zero();
1833 ConstantInt::get(
In->getType(), ShiftAmt));
1843 unsigned ShiftAmt = KnownZeroMask.countl_zero();
1847 ConstantInt::get(
In->getType(), ShiftAmt));
1850 In =
Builder.CreateAShr(In, ConstantInt::get(
In->getType(),
1851 KnownZeroMask.getBitWidth() - 1),
"sext");
1871bool TypeEvaluationHelper::canEvaluateSExtd(
Value *V,
Type *Ty) {
1872 TypeEvaluationHelper TYH;
1873 return TYH.canEvaluateSExtdImpl(V, Ty) && TYH.allPendingVisited();
1876bool TypeEvaluationHelper::canEvaluateSExtdImpl(
Value *V,
Type *Ty) {
1877 return canEvaluate(V, Ty, [
this](
Value *V,
Type *Ty) {
1878 return canEvaluateSExtdPred(V, Ty);
1882bool TypeEvaluationHelper::canEvaluateSExtdPred(
Value *V,
Type *Ty) {
1884 "Can't sign extend type to a smaller type");
1887 switch (
I->getOpcode()) {
1888 case Instruction::SExt:
1889 case Instruction::ZExt:
1890 case Instruction::Trunc:
1892 case Instruction::And:
1893 case Instruction::Or:
1894 case Instruction::Xor:
1895 case Instruction::Add:
1896 case Instruction::Sub:
1897 case Instruction::Mul:
1899 return canEvaluateSExtdImpl(
I->getOperand(0), Ty) &&
1900 canEvaluateSExtdImpl(
I->getOperand(1), Ty);
1905 case Instruction::Select:
1906 return canEvaluateSExtdImpl(
I->getOperand(1), Ty) &&
1907 canEvaluateSExtdImpl(
I->getOperand(2), Ty);
1909 case Instruction::PHI: {
1915 if (!canEvaluateSExtdImpl(IncValue, Ty))
1937 Type *SrcTy = Src->getType(), *DestTy = Sext.
getType();
1944 CI->setNonNeg(
true);
1952 unsigned XBitSize =
X->getType()->getScalarSizeInBits();
1953 unsigned TruncatedBits = XBitSize - SrcBitSize;
1958 ResTrunc->setHasNoSignedWrap(
true);
1969 if (Src->hasOneUse() &&
1971 C->ule(TruncatedBits) &&
1972 (*
C == TruncatedBits ||
1979 if (Src->hasOneUse() &&
X->getType() == DestTy) {
1981 Constant *ShAmt = ConstantInt::get(DestTy, DestBitSize - SrcBitSize);
1982 return BinaryOperator::CreateAShr(
Builder.CreateShl(
X, ShAmt), ShAmt);
1987 bool ShouldExtendExpression =
true;
1988 Value *TruncSrc =
nullptr;
1993 ShouldExtendExpression =
false;
1994 if (ShouldExtendExpression && shouldChangeType(SrcTy, DestTy) &&
1995 TypeEvaluationHelper::canEvaluateSExtd(Src, DestTy)) {
1998 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1999 " to avoid sign extend: "
2010 Value *ShAmt = ConstantInt::get(DestTy, DestBitSize - SrcBitSize);
2011 return BinaryOperator::CreateAShr(
Builder.CreateShl(Res, ShAmt,
"sext"),
2016 return transformSExtICmp(Cmp, Sext);
2033 Constant *BA =
nullptr, *CA =
nullptr;
2040 assert(WideCurrShAmt &&
"Constant folding of ImmConstant cannot fail");
2049 return BinaryOperator::CreateAShr(
A, NewShAmt);
2057 Type *XTy =
X->getType();
2059 Constant *ShlAmtC = ConstantInt::get(XTy, XBitSize - SrcBitSize);
2060 Constant *AshrAmtC = ConstantInt::get(XTy, XBitSize - 1);
2062 return BinaryOperator::CreateAShr(
Builder.CreateShl(
X, ShlAmtC),
2076 if (
Log2_32(*MaxVScale) < (SrcBitSize - 1))
2087 Sext,
Builder.CreateIntrinsic(DestTy, CI->getIntrinsicID(),
2088 {CI->getLHS(), CI->getRHS()}));
2110 bool PreferBFloat) {
2131 if (Ty->getScalarType()->isPPC_FP128Ty())
2151 Type *MinType =
nullptr;
2153 unsigned NumElts = CVVTy->getNumElements();
2157 for (
unsigned I = 0;
I != NumElts; ++
I) {
2182 return FPExt->getOperand(0)->getType();
2210 return V->getType();
2216 Type *SrcTy = V->getType();
2217 assert(SrcTy->isIntOrIntVectorTy() &&
"Expected an integer type");
2218 int SrcSize = (int)SrcTy->getScalarSizeInBits() - IsSigned;
2223 if (SrcSize <= DestNumSigBits)
2232 int SrcNumSigBits =
F->getType()->getFPMantissaWidth();
2239 if (SrcNumSigBits > 0 && DestNumSigBits > 0 &&
2240 SrcNumSigBits <= DestNumSigBits)
2247 int SigBits = (int)SrcTy->getScalarSizeInBits() -
2250 if (SigBits <= DestNumSigBits)
2257 if (SigBits <= DestNumSigBits)
2266 assert((Opcode == CastInst::SIToFP || Opcode == CastInst::UIToFP) &&
2268 Value *Src =
I.getOperand(0);
2269 Type *FPTy =
I.getType();
2286 if (BO && BO->hasOneUse()) {
2289 unsigned OpWidth = BO->getType()->getFPMantissaWidth();
2292 unsigned SrcWidth = std::max(LHSWidth, RHSWidth);
2293 unsigned DstWidth = Ty->getFPMantissaWidth();
2301 switch (BO->getOpcode()) {
2303 case Instruction::FAdd:
2304 case Instruction::FSub:
2323 if (OpWidth >= 2*DstWidth+1 && DstWidth >= SrcWidth) {
2324 Value *LHS =
Builder.CreateFPTrunc(BO->getOperand(0), Ty);
2325 Value *RHS =
Builder.CreateFPTrunc(BO->getOperand(1), Ty);
2331 case Instruction::FMul:
2337 if (OpWidth >= LHSWidth + RHSWidth && DstWidth >= SrcWidth) {
2338 Value *LHS =
Builder.CreateFPTrunc(BO->getOperand(0), Ty);
2339 Value *RHS =
Builder.CreateFPTrunc(BO->getOperand(1), Ty);
2343 case Instruction::FDiv:
2350 if (OpWidth >= 2*DstWidth && DstWidth >= SrcWidth) {
2351 Value *LHS =
Builder.CreateFPTrunc(BO->getOperand(0), Ty);
2352 Value *RHS =
Builder.CreateFPTrunc(BO->getOperand(1), Ty);
2356 case Instruction::FRem: {
2361 if (SrcWidth == OpWidth)
2364 if (LHSWidth == SrcWidth) {
2365 LHS =
Builder.CreateFPTrunc(BO->getOperand(0), LHSMinType);
2366 RHS =
Builder.CreateFPTrunc(BO->getOperand(1), LHSMinType);
2368 LHS =
Builder.CreateFPTrunc(BO->getOperand(0), RHSMinType);
2369 RHS =
Builder.CreateFPTrunc(BO->getOperand(1), RHSMinType);
2372 Value *ExactResult =
Builder.CreateFRemFMF(LHS, RHS, BO);
2381 if (
Op &&
Op->hasOneUse()) {
2384 FMF &= FPMO->getFastMathFlags();
2400 Builder.CreateSelectFMF(
Cond,
X, NarrowY, FMF,
"narrow.sel",
Op);
2408 Builder.CreateSelectFMF(
Cond, NarrowY,
X, FMF,
"narrow.sel",
Op);
2414 switch (
II->getIntrinsicID()) {
2416 case Intrinsic::ceil:
2417 case Intrinsic::fabs:
2418 case Intrinsic::floor:
2419 case Intrinsic::nearbyint:
2420 case Intrinsic::rint:
2421 case Intrinsic::round:
2422 case Intrinsic::roundeven:
2423 case Intrinsic::trunc: {
2424 Value *Src =
II->getArgOperand(0);
2425 if (!Src->hasOneUse())
2431 if (
II->getIntrinsicID() != Intrinsic::fabs) {
2433 if (!FPExtSrc || FPExtSrc->
getSrcTy() != Ty)
2443 II->getOperandBundlesAsDefs(OpBundles);
2485template <
typename FPToIntTy>
2487 constexpr bool IsSaturating = std::is_same_v<FPToIntTy, IntrinsicInst>;
2493 Value *
X = OpI->getOperand(0);
2494 Type *XType =
X->getType();
2495 Type *DestType = FI.getType();
2498 bool IsOutputSigned;
2499 if constexpr (IsSaturating)
2500 IsOutputSigned = FI.getIntrinsicID() == Intrinsic::fptosi_sat;
2511 if constexpr (!IsSaturating) {
2519 if (OutputSize > OpI->getType()->getFPMantissaWidth())
2531 if constexpr (IsSaturating) {
2534 if (IsInputSigned != IsOutputSigned || DestWidth < SrcWidth)
2538 if (DestWidth > SrcWidth) {
2539 if (IsInputSigned && IsOutputSigned)
2543 if (DestWidth < SrcWidth)
2546 assert(XType == DestType &&
"Unexpected types for int to FP to int casts");
2580 bool IsSigned = FI.
getOpcode() == Instruction::FPToSI;
2592 Type *IntTy =
X->getType();
2596 unsigned IntWidth = IntTy->getScalarSizeInBits();
2598 if (Precision + IsSigned < IntWidth)
2604 APSInt Divisor(IntWidth, !IsSigned);
2605 bool IsExact =
false;
2618 Constant *
C = ConstantInt::get(IntTy, Divisor);
2619 return IsSigned ? BinaryOperator::CreateSDiv(
X,
C)
2620 : BinaryOperator::CreateUDiv(
X,
C);
2657 unsigned SourceWidth = Src->getType()->getScalarSizeInBits();
2658 unsigned InputWidth =
X->getType()->getScalarSizeInBits();
2659 if (!
DL.isLegalInteger(SourceWidth) &&
2660 shouldChangeType(SourceWidth, InputWidth)) {
2679 UI->setNonNeg(
true);
2696 DL.getPointerSizeInBits(AS)) {
2708 auto UsesPointerAsInt = [](
User *U) {
2719 Base->getType()->getPointerAddressSpace() &&
2736 if (!
GEP || !
GEP->hasOneUse())
2739 Ptr =
GEP->getPointerOperand();
2748 Type *IdxTy =
DL.getIndexType(PtrTy);
2750 Res->
getType() == IntTy && IntTy == IdxTy) {
2763 return Builder.CreateZExtOrTrunc(Res, IntTy);
2774 unsigned TySize = Ty->getScalarSizeInBits();
2775 unsigned PtrSize =
DL.getPointerSizeInBits(AS);
2776 if (TySize != PtrSize) {
2778 SrcTy->getWithNewType(
DL.getIntPtrType(CI.
getContext(), AS));
2789 return BinaryOperator::CreateAnd(
Builder.CreatePtrToInt(Ptr, Ty), Mask);
2794 Value *Vec, *Scalar, *Index;
2800 Value *NewCast =
Builder.CreatePtrToInt(Scalar, Ty->getScalarType());
2817 return BinaryOperator::CreateAnd(
Builder.CreatePtrToAddr(Ptr), Mask);
2850 if (SrcTy->getElementType() != DestTy->getElementType()) {
2855 if (SrcTy->getElementType()->getPrimitiveSizeInBits() !=
2856 DestTy->getElementType()->getPrimitiveSizeInBits())
2869 assert(SrcElts != DestElts &&
"Element counts should be different.");
2878 if (SrcElts > DestElts) {
2887 ShuffleMask = ShuffleMaskStorage;
2889 ShuffleMask = ShuffleMask.take_back(DestElts);
2891 ShuffleMask = ShuffleMask.take_front(DestElts);
2902 unsigned DeltaElts = DestElts - SrcElts;
2904 ShuffleMaskStorage.insert(ShuffleMaskStorage.begin(), DeltaElts, NullElt);
2906 ShuffleMaskStorage.append(DeltaElts, NullElt);
2907 ShuffleMask = ShuffleMaskStorage;
2914 return Value % Ty->getPrimitiveSizeInBits() == 0;
2918 return Value / Ty->getPrimitiveSizeInBits();
2935 "Shift should be a multiple of the element type size");
2943 if (V->getType() == VecEltTy) {
2946 if (
C->isNullValue())
2951 ElementIndex = Elements.size() - ElementIndex - 1;
2954 if (Elements[ElementIndex])
2957 Elements[ElementIndex] = V;
2976 C->getType()->getPrimitiveSizeInBits()));
2980 for (
unsigned i = 0; i != NumElts; ++i) {
2981 unsigned ShiftI = i * ElementSize;
2983 Instruction::LShr,
C, ConstantInt::get(
C->getType(), ShiftI));
2995 if (!V->hasOneUse())
return false;
2998 if (!
I)
return false;
2999 switch (
I->getOpcode()) {
3000 default:
return false;
3001 case Instruction::BitCast:
3002 if (
I->getOperand(0)->getType()->isVectorTy())
3006 case Instruction::ZExt:
3008 I->getOperand(0)->getType()->getPrimitiveSizeInBits(),
3013 case Instruction::Or:
3018 case Instruction::Shl: {
3021 if (!CI)
return false;
3058 DestVecTy->getElementType(),
3066 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
3067 if (!Elements[i])
continue;
3081 Value *VecOp, *Index;
3099 if (DestType->
isVectorTy() && FixedVType && FixedVType->getNumElements() == 1)
3126 if (
X->getType()->isFPOrFPVectorTy() &&
3127 Y->getType()->isIntOrIntVectorTy()) {
3129 Builder.CreateBitCast(BO->
getOperand(0),
Y->getType());
3133 if (
X->getType()->isIntOrIntVectorTy() &&
3134 Y->getType()->isFPOrFPVectorTy()) {
3136 Builder.CreateBitCast(BO->
getOperand(1),
X->getType());
3172 Value *CastedC = Builder.CreateBitCast(
C, DestTy);
3195 CondVTy->getElementCount() != DestVecTy->getElementCount())
3204 SrcVecTy->getElementCount())))) {
3207 Value *CastedTVal = Builder.CreateBitCast(TVal, DestTy);
3208 Value *CastedFVal = Builder.CreateBitCast(FVal, DestTy);
3216 if ((DestVecTy !=
nullptr) != (SrcVecTy !=
nullptr))
3223 Value *CastedVal = Builder.CreateBitCast(FVal, DestTy);
3230 Value *CastedVal = Builder.CreateBitCast(TVal, DestTy);
3261 Type *SrcTy = Src->getType();
3265 SmallSetVector<PHINode *, 4> OldPhiNodes;
3273 while (!PhiWorklist.
empty()) {
3275 for (
Value *IncValue : OldPN->incoming_values()) {
3284 Value *Addr = LI->getOperand(0);
3293 if (LI->hasOneUse() && LI->isSimple())
3301 if (OldPhiNodes.
insert(PNode))
3312 Type *TyA = BCI->getOperand(0)->getType();
3313 Type *TyB = BCI->getType();
3314 if (TyA != DestTy || TyB != SrcTy)
3321 for (
auto *OldPN : OldPhiNodes) {
3322 for (User *V : OldPN->users()) {
3324 if (!
SI->isSimple() ||
SI->getOperand(0) != OldPN)
3328 Type *TyB = BCI->getOperand(0)->getType();
3329 Type *TyA = BCI->getType();
3330 if (TyA != DestTy || TyB != SrcTy)
3336 if (!OldPhiNodes.contains(
PHI))
3345 SmallDenseMap<PHINode *, PHINode *> NewPNodes;
3346 for (
auto *OldPN : OldPhiNodes) {
3347 Builder.SetInsertPoint(OldPN);
3348 PHINode *NewPN =
Builder.CreatePHI(DestTy, OldPN->getNumOperands());
3349 NewPNodes[OldPN] = NewPN;
3353 for (
auto *OldPN : OldPhiNodes) {
3354 PHINode *NewPN = NewPNodes[OldPN];
3355 for (
unsigned j = 0, e = OldPN->getNumOperands(); j != e; ++j) {
3356 Value *
V = OldPN->getOperand(j);
3357 Value *NewV =
nullptr;
3370 NewV = BCI->getOperand(0);
3372 NewV = NewPNodes[PrevPN];
3375 NewPN->
addIncoming(NewV, OldPN->getIncomingBlock(j));
3389 for (
auto *OldPN : OldPhiNodes) {
3390 PHINode *NewPN = NewPNodes[OldPN];
3393 assert(
SI->isSimple() &&
SI->getOperand(0) == OldPN);
3397 SI->setOperand(0, NewBC);
3402 Type *TyB = BCI->getOperand(0)->getType();
3403 Type *TyA = BCI->getType();
3404 assert(TyA == DestTy && TyB == SrcTy);
3435 if (
X->getType() != FTy)
3440 return Builder.CreateCopySign(Builder.CreateBitCast(
Y, FTy),
X);
3447 Type *SrcTy = Src->getType();
3452 if (DestTy == Src->getType())
3478 if (SrcVTy->getNumElements() == 1) {
3482 Value *Elem =
Builder.CreateExtractElement(Src, uint64_t{0});
3490 return new BitCastInst(InsElt->getOperand(1), DestTy);
3500 DestTy->
isIntegerTy() &&
Y->getType()->isIntegerTy() &&
3503 if (
DL.isBigEndian())
3504 IndexC = SrcVTy->getNumElements() - 1 - IndexC;
3510 unsigned EltWidth =
Y->getType()->getScalarSizeInBits();
3514 return BinaryOperator::CreateOr(AndX, ZextY);
3522 Value *ShufOp0 = Shuf->getOperand(0);
3523 Value *ShufOp1 = Shuf->getOperand(1);
3526 if (Shuf->hasOneUse() && DestTy->
isVectorTy() &&
3528 ShufElts == SrcVecElts) {
3549 if (DestTy->
isIntegerTy() && ShufElts.getKnownMinValue() % 2 == 0 &&
3550 Shuf->hasOneUse() && Shuf->isReverse() &&
match(ShufOp1,
m_Poison())) {
3551 unsigned IntrinsicNum = 0;
3553 SrcTy->getScalarSizeInBits() == 8) {
3554 IntrinsicNum = Intrinsic::bswap;
3555 }
else if (SrcTy->getScalarSizeInBits() == 1) {
3556 IntrinsicNum = Intrinsic::bitreverse;
3558 if (IntrinsicNum != 0) {
3559 assert(ShufOp0->
getType() == SrcTy &&
"Unexpected shuffle mask");
3562 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
This file contains the declarations for profiling metadata utility functions.
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.
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.
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_UGT
unsigned greater than
@ ICMP_SGT
signed greater than
@ ICMP_ULT
unsigned less than
@ ICMP_ULE
unsigned less or equal
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
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
LLVM_ABI bool canBeCastedExactlyIntToFP(Value *V, Type *FPTy, bool IsSigned, const Instruction *CtxI=nullptr) const
unsigned ComputeMaxSignificantBits(const Value *Op, const Instruction *CtxI=nullptr, unsigned Depth=0) const
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
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.
unsigned ComputeNumSignBits(const Value *Op, const Instruction *CtxI=nullptr, unsigned Depth=0) const
bool MaskedValueIsZero(const Value *V, const APInt &Mask, const Instruction *CtxI=nullptr, 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.
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CtxI, 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,...
LLVM_ABI bool hasNoSignedZeros() const LLVM_READONLY
Determine whether the no-signed-zeros flag is set.
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()
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.
iterator_range< user_iterator > users()
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.
@ MAX_INT_BITS
Maximum number of bits that can be specified.
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.
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.
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)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
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.
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)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, 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.
LLVM_ABI cl::opt< bool > ProfcheckDisableMetadataFixes
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.
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...
LLVM_ABI void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, AssumptionCache *AC=nullptr, const Instruction *CtxI=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...
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.
LLVM_ABI Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Function *CtxF=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
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 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