24using namespace PatternMatch;
26#define DEBUG_TYPE "instcombine"
38 unsigned Opc =
I->getOpcode();
40 case Instruction::Add:
41 case Instruction::Sub:
42 case Instruction::Mul:
43 case Instruction::And:
45 case Instruction::Xor:
46 case Instruction::AShr:
47 case Instruction::LShr:
48 case Instruction::Shl:
49 case Instruction::UDiv:
50 case Instruction::URem: {
54 if (
Opc == Instruction::LShr ||
Opc == Instruction::AShr)
58 case Instruction::Trunc:
59 case Instruction::ZExt:
60 case Instruction::SExt:
64 if (
I->getOperand(0)->getType() == Ty)
65 return I->getOperand(0);
70 Opc == Instruction::SExt);
72 case Instruction::Select: {
78 case Instruction::PHI: {
89 case Instruction::FPToUI:
90 case Instruction::FPToSI:
94 case Instruction::Call:
96 switch (
II->getIntrinsicID()) {
99 case Intrinsic::vscale: {
101 I->getModule(), Intrinsic::vscale, {Ty});
108 case Instruction::ShuffleVector: {
109 auto *ScalarTy = cast<VectorType>(Ty)->getElementType();
110 auto *VTy = cast<VectorType>(
I->getOperand(0)->getType());
115 cast<ShuffleVectorInst>(
I)->getShuffleMask());
128InstCombinerImpl::isEliminableCastPair(
const CastInst *CI1,
143 DstTy, SrcIntPtrTy, MidIntPtrTy,
148 if ((Res == Instruction::IntToPtr && SrcTy != DstIntPtrTy) ||
149 (Res == Instruction::PtrToInt && DstTy != SrcIntPtrTy))
160 if (
auto *SrcC = dyn_cast<Constant>(Src))
165 if (
auto *CSrc = dyn_cast<CastInst>(Src)) {
171 if (CSrc->hasOneUse())
177 if (
auto *Sel = dyn_cast<SelectInst>(Src)) {
183 auto *Cmp = dyn_cast<CmpInst>(Sel->getCondition());
184 if (!Cmp || Cmp->getOperand(0)->getType() != Sel->getType() ||
190 if (CI.
getOpcode() != Instruction::BitCast ||
201 if (
auto *PN = dyn_cast<PHINode>(Src)) {
218 auto *SrcTy = dyn_cast<FixedVectorType>(
X->getType());
219 auto *DestTy = dyn_cast<FixedVectorType>(Ty);
220 if (SrcTy && DestTy &&
221 SrcTy->getNumElements() == DestTy->getNumElements() &&
234 if (isa<Constant>(V))
248 if (!isa<Instruction>(V))
276 auto *
I = cast<Instruction>(V);
277 Type *OrigTy = V->getType();
278 switch (
I->getOpcode()) {
279 case Instruction::Add:
280 case Instruction::Sub:
281 case Instruction::Mul:
282 case Instruction::And:
283 case Instruction::Or:
284 case Instruction::Xor:
289 case Instruction::UDiv:
290 case Instruction::URem: {
305 case Instruction::Shl: {
316 case Instruction::LShr: {
330 if (
auto *Trunc = dyn_cast<TruncInst>(V->user_back())) {
331 auto DemandedBits = Trunc->getType()->getScalarSizeInBits();
342 case Instruction::AShr: {
352 unsigned ShiftedBits = OrigBitWidth -
BitWidth;
359 case Instruction::Trunc:
362 case Instruction::ZExt:
363 case Instruction::SExt:
367 case Instruction::Select: {
372 case Instruction::PHI: {
382 case Instruction::FPToUI:
383 case Instruction::FPToSI: {
387 Type *InputTy =
I->getOperand(0)->getType()->getScalarType();
391 I->getOpcode() == Instruction::FPToSI);
394 case Instruction::ShuffleVector:
415 if (!TruncOp->
hasOneUse() || !isa<IntegerType>(DestType))
418 Value *VecInput =
nullptr;
423 !isa<VectorType>(VecInput->
getType()))
427 unsigned VecWidth = VecType->getPrimitiveSizeInBits();
429 unsigned ShiftAmount = ShiftVal ? ShiftVal->
getZExtValue() : 0;
431 if ((VecWidth % DestWidth != 0) || (ShiftAmount % DestWidth != 0))
436 unsigned NumVecElts = VecWidth / DestWidth;
437 if (VecType->getElementType() != DestType) {
442 unsigned Elt = ShiftAmount / DestWidth;
444 Elt = NumVecElts - 1 - Elt;
464 Type *SrcType = Src->getType();
471 unsigned TruncRatio = SrcBits / DstBits;
472 if ((SrcBits % DstBits) != 0)
477 const APInt *ShiftAmount =
nullptr;
484 auto *VecOpTy = cast<VectorType>(VecOp->
getType());
485 auto VecElts = VecOpTy->getElementCount();
487 uint64_t BitCastNumElts = VecElts.getKnownMinValue() * TruncRatio;
490 ? (VecOpIdx + 1) * TruncRatio - 1
491 : VecOpIdx * TruncRatio;
497 if (ShiftAmount->
uge(SrcBits) || ShiftAmount->
urem(DstBits) != 0)
505 assert(BitCastNumElts <= std::numeric_limits<uint32_t>::max() &&
506 NewIdx <= std::numeric_limits<uint32_t>::max() &&
"overflow 32-bits");
519 "Don't narrow to an illegal scalar type");
535 Value *ShVal0, *ShVal1, *ShAmt0, *ShAmt1;
542 if (Or0->
getOpcode() == BinaryOperator::LShr) {
548 Or1->
getOpcode() == BinaryOperator::LShr &&
549 "Illegal or(shift,shift) pair");
558 unsigned MaxShiftAmountWidth =
Log2_32(NarrowWidth);
559 APInt HiBitMask =
~APInt::getLowBitsSet(WideWidth, MaxShiftAmountWidth);
566 if (ShVal0 != ShVal1)
572 unsigned Mask = Width - 1;
585 Value *ShAmt = matchShiftAmount(ShAmt0, ShAmt1, NarrowWidth);
588 ShAmt = matchShiftAmount(ShAmt1, ShAmt0, NarrowWidth);
610 if (ShVal0 != ShVal1)
612 Intrinsic::ID IID = IsFshl ? Intrinsic::fshl : Intrinsic::fshr;
626 if (!isa<VectorType>(SrcTy) && !shouldChangeType(SrcTy, DestTy))
636 case Instruction::And:
637 case Instruction::Or:
638 case Instruction::Xor:
639 case Instruction::Add:
640 case Instruction::Sub:
641 case Instruction::Mul: {
668 case Instruction::LShr:
669 case Instruction::AShr: {
674 unsigned MaxShiftAmt = SrcWidth - DestWidth;
678 APInt(SrcWidth, MaxShiftAmt)))) {
679 auto *OldShift = cast<Instruction>(Trunc.
getOperand(0));
680 bool IsExact = OldShift->isExact();
685 OldShift->getOpcode() == Instruction::AShr
697 if (
Instruction *NarrowOr = narrowFunnelShift(Trunc))
708 auto *Shuf = dyn_cast<ShuffleVectorInst>(Trunc.
getOperand(0));
709 if (Shuf && Shuf->hasOneUse() &&
match(Shuf->getOperand(1),
m_Undef()) &&
712 cast<VectorType>(Shuf->getOperand(0)->getType())
713 ->getElementCount())) {
733 assert((Opcode == Instruction::Trunc || Opcode == Instruction::FPTrunc) &&
734 "Unexpected instruction for shrinking");
736 auto *InsElt = dyn_cast<InsertElementInst>(Trunc.
getOperand(0));
737 if (!InsElt || !InsElt->hasOneUse())
742 Value *VecOp = InsElt->getOperand(0);
743 Value *ScalarOp = InsElt->getOperand(1);
744 Value *Index = InsElt->getOperand(2);
762 Type *DestTy = Trunc.
getType(), *SrcTy = Src->getType();
770 if ((DestTy->
isVectorTy() || shouldChangeType(SrcTy, DestTy)) &&
776 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
788 if (
auto *DestITy = dyn_cast<IntegerType>(DestTy)) {
789 if (DestWidth * 2 < SrcWidth) {
790 auto *NewDestTy = DestITy->getExtendedType();
791 if (shouldChangeType(SrcTy, NewDestTy) &&
794 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
795 " to reduce the width of operand of"
808 if (DestWidth == 1) {
863 unsigned AWidth =
A->getType()->getScalarSizeInBits();
864 unsigned MaxShiftAmt = SrcWidth - std::max(DestWidth, AWidth);
865 auto *OldSh = cast<Instruction>(Src);
866 bool IsExact = OldSh->isExact();
871 APInt(SrcWidth, MaxShiftAmt)))) {
872 auto GetNewShAmt = [&](
unsigned Width) {
873 Constant *MaxAmt = ConstantInt::get(SrcTy, Width - 1,
false);
882 if (
A->getType() == DestTy) {
883 Constant *ShAmt = GetNewShAmt(DestWidth);
885 return IsExact ? BinaryOperator::CreateExactAShr(
A, ShAmt)
886 : BinaryOperator::CreateAShr(
A, ShAmt);
890 if (Src->hasOneUse()) {
891 Constant *ShAmt = GetNewShAmt(AWidth);
908 if (Src->hasOneUse() &&
909 (isa<VectorType>(SrcTy) || shouldChangeType(SrcTy, DestTy))) {
916 APInt Threshold =
APInt(
C->getType()->getScalarSizeInBits(), DestWidth);
934 unsigned AWidth =
A->getType()->getScalarSizeInBits();
935 if (AWidth == DestWidth && AWidth >
Log2_32(SrcWidth)) {
936 Value *WidthDiff = ConstantInt::get(
A->getType(), SrcWidth - AWidth);
939 return BinaryOperator::CreateAdd(NarrowCtlz, WidthDiff);
949 if (
Log2_32(*MaxVScale) < DestWidth)
954 if (DestWidth == 1 &&
959 bool Changed =
false;
972 return Changed ? &Trunc :
nullptr;
992 Value *In = Cmp->getOperand(0);
993 Value *Sh = ConstantInt::get(In->getType(),
994 In->getType()->getScalarSizeInBits() - 1);
996 if (In->getType() != Zext.
getType())
1007 if (Op1CV->
isZero() && Cmp->isEquality()) {
1012 uint32_t ShAmt = KnownZeroMask.logBase2();
1013 bool IsExpectShAmt = KnownZeroMask.isPowerOf2() &&
1015 if (IsExpectShAmt &&
1016 (Cmp->getOperand(0)->getType() == Zext.
getType() ||
1018 Value *In = Cmp->getOperand(0);
1023 In->getName() +
".lobit");
1039 if (
Cmp->isEquality()) {
1047 auto *
And = cast<BinaryOperator>(
Cmp->getOperand(0));
1048 Value *Shift =
And->getOperand(
X ==
And->getOperand(0) ? 1 : 0);
1091 auto *
I = cast<Instruction>(V);
1093 switch (
I->getOpcode()) {
1094 case Instruction::ZExt:
1095 case Instruction::SExt:
1096 case Instruction::Trunc:
1098 case Instruction::And:
1099 case Instruction::Or:
1100 case Instruction::Xor:
1101 case Instruction::Add:
1102 case Instruction::Sub:
1103 case Instruction::Mul:
1108 if (BitsToClear == 0 && Tmp == 0)
1113 if (Tmp == 0 &&
I->isBitwiseLogicOp()) {
1116 unsigned VSize = V->getType()->getScalarSizeInBits();
1122 if (
I->getOpcode() == Instruction::And)
1131 case Instruction::Shl: {
1138 BitsToClear = ShiftAmt < BitsToClear ? BitsToClear - ShiftAmt : 0;
1143 case Instruction::LShr: {
1150 BitsToClear += ShiftAmt;
1151 if (BitsToClear > V->getType()->getScalarSizeInBits())
1152 BitsToClear = V->getType()->getScalarSizeInBits();
1158 case Instruction::Select:
1167 case Instruction::PHI: {
1182 case Instruction::Call:
1186 if (
II->getIntrinsicID() == Intrinsic::vscale)
1207 Type *SrcTy = Src->getType(), *DestTy = Zext.
getType();
1214 unsigned BitsToClear;
1215 if (shouldChangeType(SrcTy, DestTy) &&
1218 "Can't clear more bits than in SrcTy");
1222 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1223 " to avoid zero extend: "
1229 if (
auto *
SrcOp = dyn_cast<Instruction>(Src))
1230 if (
SrcOp->hasOneUse())
1246 return BinaryOperator::CreateAnd(Res,
C);
1252 if (
auto *CSrc = dyn_cast<TruncInst>(Src)) {
1257 Value *
A = CSrc->getOperand(0);
1258 unsigned SrcSize =
A->getType()->getScalarSizeInBits();
1259 unsigned MidSize = CSrc->getType()->getScalarSizeInBits();
1265 if (SrcSize < DstSize) {
1267 Constant *AndConst = ConstantInt::get(
A->getType(), AndValue);
1272 if (SrcSize == DstSize) {
1274 return BinaryOperator::CreateAnd(
A, ConstantInt::get(
A->getType(),
1277 if (SrcSize > DstSize) {
1280 return BinaryOperator::CreateAnd(Trunc,
1281 ConstantInt::get(Trunc->
getType(),
1286 if (
auto *Cmp = dyn_cast<ICmpInst>(Src))
1287 return transformZExtICmp(Cmp, Zext);
1293 X->getType() == DestTy)
1300 X->getType() == DestTy) {
1311 X->getType() == DestTy) {
1313 return BinaryOperator::CreateAnd(
X, ZextC);
1322 unsigned TypeWidth = Src->getType()->getScalarSizeInBits();
1323 if (
Log2_32(*MaxVScale) < TypeWidth)
1351 Value *Op0 = Cmp->getOperand(0), *Op1 = Cmp->getOperand(1);
1355 if (!Op1->getType()->isIntOrIntVectorTy())
1363 if (In->getType() != Sext.
getType())
1369 if (
ConstantInt *Op1C = dyn_cast<ConstantInt>(Op1)) {
1373 if (Cmp->hasOneUse() &&
1374 Cmp->isEquality() && (Op1C->isZero() || Op1C->getValue().isPowerOf2())){
1378 if (KnownZeroMask.isPowerOf2()) {
1379 Value *In = Cmp->getOperand(0);
1382 if (!Op1C->isZero() && Op1C->getValue() != KnownZeroMask) {
1392 unsigned ShiftAmt = KnownZeroMask.countr_zero();
1396 ConstantInt::get(
In->getType(), ShiftAmt));
1406 unsigned ShiftAmt = KnownZeroMask.countl_zero();
1410 ConstantInt::get(
In->getType(), ShiftAmt));
1414 KnownZeroMask.getBitWidth() - 1),
"sext");
1436 "Can't sign extend type to a smaller type");
1442 auto *
I = cast<Instruction>(V);
1443 switch (
I->getOpcode()) {
1444 case Instruction::SExt:
1445 case Instruction::ZExt:
1446 case Instruction::Trunc:
1448 case Instruction::And:
1449 case Instruction::Or:
1450 case Instruction::Xor:
1451 case Instruction::Add:
1452 case Instruction::Sub:
1453 case Instruction::Mul:
1461 case Instruction::Select:
1465 case Instruction::PHI: {
1492 Type *SrcTy = Src->getType(), *DestTy = Sext.
getType();
1499 CI->setNonNeg(
true);
1507 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1508 " to avoid sign extend: "
1519 Value *ShAmt = ConstantInt::get(DestTy, DestBitSize-SrcBitSize);
1528 unsigned XBitSize =
X->getType()->getScalarSizeInBits();
1533 if (Src->hasOneUse() &&
X->getType() == DestTy) {
1535 Constant *ShAmt = ConstantInt::get(DestTy, DestBitSize - SrcBitSize);
1544 if (Src->hasOneUse() &&
1552 if (
auto *Cmp = dyn_cast<ICmpInst>(Src))
1553 return transformSExtICmp(Cmp, Sext);
1570 Constant *BA =
nullptr, *CA =
nullptr;
1576 assert(WideCurrShAmt &&
"Constant folding of ImmConstant cannot fail");
1585 return BinaryOperator::CreateAShr(
A, NewShAmt);
1593 Type *XTy =
X->getType();
1595 Constant *ShlAmtC = ConstantInt::get(XTy, XBitSize - SrcBitSize);
1596 Constant *AshrAmtC = ConstantInt::get(XTy, XBitSize - 1);
1600 if (cast<BinaryOperator>(Src)->getOperand(0)->hasOneUse()) {
1612 if (
Log2_32(*MaxVScale) < (SrcBitSize - 1))
1652 auto *CV = dyn_cast<Constant>(V);
1653 auto *CVVTy = dyn_cast<FixedVectorType>(V->getType());
1657 Type *MinType =
nullptr;
1659 unsigned NumElts = CVVTy->getNumElements();
1663 for (
unsigned i = 0; i != NumElts; ++i) {
1664 if (isa<UndefValue>(CV->getAggregateElement(i)))
1667 auto *CFP = dyn_cast_or_null<ConstantFP>(CV->getAggregateElement(i));
1687 if (
auto *FPExt = dyn_cast<FPExtInst>(V))
1688 return FPExt->getOperand(0)->getType();
1693 if (
auto *CFP = dyn_cast<ConstantFP>(V))
1698 if (
auto *FPC = dyn_cast<Constant>(V))
1699 if (isa<VectorType>(V->getType()))
1700 if (
auto *
Splat = dyn_cast_or_null<ConstantFP>(FPC->getSplatValue()))
1709 return V->getType();
1716 assert((Opcode == CastInst::SIToFP || Opcode == CastInst::UIToFP) &&
1718 Value *Src =
I.getOperand(0);
1719 Type *SrcTy = Src->getType();
1720 Type *FPTy =
I.getType();
1721 bool IsSigned = Opcode == Instruction::SIToFP;
1727 if (SrcSize <= DestNumSigBits)
1736 int SrcNumSigBits =
F->getType()->getFPMantissaWidth();
1743 if (SrcNumSigBits > 0 && DestNumSigBits > 0 &&
1744 SrcNumSigBits <= DestNumSigBits)
1755 if (SigBits <= DestNumSigBits)
1773 auto *BO = dyn_cast<BinaryOperator>(FPT.
getOperand(0));
1774 if (BO && BO->hasOneUse()) {
1779 unsigned OpWidth = BO->getType()->getFPMantissaWidth();
1782 unsigned SrcWidth = std::max(LHSWidth, RHSWidth);
1784 switch (BO->getOpcode()) {
1786 case Instruction::FAdd:
1787 case Instruction::FSub:
1806 if (OpWidth >= 2*DstWidth+1 && DstWidth >= SrcWidth) {
1814 case Instruction::FMul:
1820 if (OpWidth >= LHSWidth + RHSWidth && DstWidth >= SrcWidth) {
1826 case Instruction::FDiv:
1833 if (OpWidth >= 2*DstWidth && DstWidth >= SrcWidth) {
1839 case Instruction::FRem: {
1844 if (SrcWidth == OpWidth)
1847 if (LHSWidth == SrcWidth) {
1864 if (
Op &&
Op->hasOneUse()) {
1866 if (
auto *FPMO = dyn_cast<FPMathOperator>(
Op))
1867 FMF &= FPMO->getFastMathFlags();
1879 X->getType() == Ty) {
1887 X->getType() == Ty) {
1896 if (
auto *
II = dyn_cast<IntrinsicInst>(FPT.
getOperand(0))) {
1897 switch (
II->getIntrinsicID()) {
1899 case Intrinsic::ceil:
1900 case Intrinsic::fabs:
1901 case Intrinsic::floor:
1902 case Intrinsic::nearbyint:
1903 case Intrinsic::rint:
1904 case Intrinsic::round:
1905 case Intrinsic::roundeven:
1906 case Intrinsic::trunc: {
1907 Value *Src =
II->getArgOperand(0);
1908 if (!Src->hasOneUse())
1914 if (
II->getIntrinsicID() != Intrinsic::fabs) {
1915 FPExtInst *FPExtSrc = dyn_cast<FPExtInst>(Src);
1916 if (!FPExtSrc || FPExtSrc->
getSrcTy() != Ty)
1926 II->getOperandBundlesAsDefs(OpBundles);
1941 if (isa<SIToFPInst>(Src) || isa<UIToFPInst>(Src)) {
1942 auto *FPCast = cast<CastInst>(Src);
1955 if (isa<SIToFPInst>(Src) || isa<UIToFPInst>(Src)) {
1956 auto *FPCast = cast<CastInst>(Src);
1972 auto *OpI = cast<CastInst>(FI.
getOperand(0));
1973 Value *
X = OpI->getOperand(0);
1974 Type *XType =
X->getType();
1976 bool IsOutputSigned = isa<FPToSIInst>(FI);
1991 if (OutputSize > OpI->getType()->getFPMantissaWidth())
1996 bool IsInputSigned = isa<SIToFPInst>(OpI);
1997 if (IsInputSigned && IsOutputSigned)
2004 assert(XType == DestType &&
"Unexpected types for int to FP to int casts");
2056 UI->setNonNeg(
true);
2080 auto UsesPointerAsInt = [](
User *U) {
2081 if (isa<ICmpInst, PtrToIntInst>(U))
2083 if (
auto *
P = dyn_cast<PHINode>(U))
2084 return P->hasOneUse() && isa<ICmpInst, PtrToIntInst>(*
P->user_begin());
2091 Base->getType()->getPointerAddressSpace() &&
2107 auto *
GEP = dyn_cast<GEPOperator>(
Ptr);
2108 if (!
GEP || !
GEP->hasOneUse())
2111 Ptr =
GEP->getPointerOperand();
2115 if (GEPs.
empty() || PtrTy !=
Ptr->getType())
2122 Res->
getType() == IntTy && IntTy == IdxTy) {
2124 }
else if (isa<ConstantPointerNull>(
Ptr)) {
2148 if (TySize != PtrSize) {
2161 Mask->getType() == Ty)
2167 Value *Vec, *Scalar, *Index;
2205 if (SrcTy->getElementType() != DestTy->getElementType()) {
2210 if (SrcTy->getElementType()->getPrimitiveSizeInBits() !=
2211 DestTy->getElementType()->getPrimitiveSizeInBits())
2216 cast<FixedVectorType>(SrcTy)->getNumElements());
2221 unsigned SrcElts = cast<FixedVectorType>(SrcTy)->getNumElements();
2222 unsigned DestElts = cast<FixedVectorType>(DestTy)->getNumElements();
2224 assert(SrcElts != DestElts &&
"Element counts should be different.");
2229 auto ShuffleMaskStorage = llvm::to_vector<16>(llvm::seq<int>(0, SrcElts));
2233 if (SrcElts > DestElts) {
2242 ShuffleMask = ShuffleMaskStorage;
2244 ShuffleMask = ShuffleMask.
take_back(DestElts);
2246 ShuffleMask = ShuffleMask.
take_front(DestElts);
2257 unsigned DeltaElts = DestElts - SrcElts;
2259 ShuffleMaskStorage.insert(ShuffleMaskStorage.begin(), DeltaElts, NullElt);
2261 ShuffleMaskStorage.append(DeltaElts, NullElt);
2262 ShuffleMask = ShuffleMaskStorage;
2290 "Shift should be a multiple of the element type size");
2293 if (isa<UndefValue>(V))
return true;
2297 if (V->getType() == VecEltTy) {
2299 if (
Constant *
C = dyn_cast<Constant>(V))
2300 if (
C->isNullValue())
2305 ElementIndex = Elements.size() - ElementIndex - 1;
2308 if (Elements[ElementIndex])
2311 Elements[ElementIndex] = V;
2315 if (
Constant *
C = dyn_cast<Constant>(V)) {
2328 if (!isa<IntegerType>(
C->getType()))
2330 C->getType()->getPrimitiveSizeInBits()));
2334 for (
unsigned i = 0; i != NumElts; ++i) {
2335 unsigned ShiftI = i * ElementSize;
2337 Instruction::LShr,
C, ConstantInt::get(
C->getType(), ShiftI));
2349 if (!V->hasOneUse())
return false;
2352 if (!
I)
return false;
2353 switch (
I->getOpcode()) {
2354 default:
return false;
2355 case Instruction::BitCast:
2356 if (
I->getOperand(0)->getType()->isVectorTy())
2360 case Instruction::ZExt:
2362 I->getOperand(0)->getType()->getPrimitiveSizeInBits(),
2367 case Instruction::Or:
2372 case Instruction::Shl: {
2374 ConstantInt *CI = dyn_cast<ConstantInt>(
I->getOperand(1));
2375 if (!CI)
return false;
2402 auto *DestVecTy = cast<FixedVectorType>(CI.
getType());
2407 if (isa<UndefValue>(IntInput))
2412 DestVecTy->getElementType(),
2420 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
2421 if (!Elements[i])
continue;
2436 Value *VecOp, *Index;
2453 auto *FixedVType = dyn_cast<FixedVectorType>(VecType);
2454 if (DestType->
isVectorTy() && FixedVType && FixedVType->getNumElements() == 1)
2481 if (
X->getType()->isFPOrFPVectorTy() &&
2482 Y->getType()->isIntOrIntVectorTy()) {
2488 if (
X->getType()->isIntOrIntVectorTy() &&
2489 Y->getType()->isFPOrFPVectorTy()) {
2504 X->getType() == DestTy && !isa<Constant>(
X)) {
2511 X->getType() == DestTy && !isa<Constant>(
X)) {
2543 if (
auto *CondVTy = dyn_cast<VectorType>(CondTy))
2545 CondVTy->getElementCount() !=
2546 cast<VectorType>(DestTy)->getElementCount())
2556 auto *Sel = cast<Instruction>(BitCast.
getOperand(0));
2559 !isa<Constant>(
X)) {
2566 !isa<Constant>(
X)) {
2578 if (!isa<StoreInst>(U))
2599 Type *SrcTy = Src->getType();
2611 while (!PhiWorklist.
empty()) {
2613 for (
Value *IncValue : OldPN->incoming_values()) {
2614 if (isa<Constant>(IncValue))
2617 if (
auto *LI = dyn_cast<LoadInst>(IncValue)) {
2623 if (
Addr == &CI || isa<LoadInst>(
Addr))
2631 if (LI->hasOneUse() && LI->isSimple())
2638 if (
auto *PNode = dyn_cast<PHINode>(IncValue)) {
2639 if (OldPhiNodes.
insert(PNode))
2644 auto *BCI = dyn_cast<BitCastInst>(IncValue);
2650 Type *TyA = BCI->getOperand(0)->getType();
2651 Type *TyB = BCI->getType();
2652 if (TyA != DestTy || TyB != SrcTy)
2659 for (
auto *OldPN : OldPhiNodes) {
2661 if (
auto *SI = dyn_cast<StoreInst>(V)) {
2662 if (!
SI->isSimple() ||
SI->getOperand(0) != OldPN)
2664 }
else if (
auto *BCI = dyn_cast<BitCastInst>(V)) {
2666 Type *TyB = BCI->getOperand(0)->getType();
2667 Type *TyA = BCI->getType();
2668 if (TyA != DestTy || TyB != SrcTy)
2670 }
else if (
auto *
PHI = dyn_cast<PHINode>(V)) {
2674 if (!OldPhiNodes.contains(
PHI))
2684 for (
auto *OldPN : OldPhiNodes) {
2687 NewPNodes[OldPN] = NewPN;
2691 for (
auto *OldPN : OldPhiNodes) {
2692 PHINode *NewPN = NewPNodes[OldPN];
2693 for (
unsigned j = 0, e = OldPN->getNumOperands(); j != e; ++j) {
2694 Value *
V = OldPN->getOperand(j);
2695 Value *NewV =
nullptr;
2696 if (
auto *
C = dyn_cast<Constant>(V)) {
2698 }
else if (
auto *LI = dyn_cast<LoadInst>(V)) {
2707 }
else if (
auto *BCI = dyn_cast<BitCastInst>(V)) {
2708 NewV = BCI->getOperand(0);
2709 }
else if (
auto *PrevPN = dyn_cast<PHINode>(V)) {
2710 NewV = NewPNodes[PrevPN];
2713 NewPN->
addIncoming(NewV, OldPN->getIncomingBlock(j));
2727 for (
auto *OldPN : OldPhiNodes) {
2728 PHINode *NewPN = NewPNodes[OldPN];
2730 if (
auto *SI = dyn_cast<StoreInst>(V)) {
2731 assert(
SI->isSimple() &&
SI->getOperand(0) == OldPN);
2735 SI->setOperand(0, NewBC);
2739 else if (
auto *BCI = dyn_cast<BitCastInst>(V)) {
2740 Type *TyB = BCI->getOperand(0)->getType();
2741 Type *TyA = BCI->getType();
2742 assert(TyA == DestTy && TyB == SrcTy);
2748 }
else if (
auto *
PHI = dyn_cast<PHINode>(V)) {
2773 if (
X->getType() != FTy)
2785 Type *SrcTy = Src->getType();
2790 if (DestTy == Src->getType())
2793 if (isa<FixedVectorType>(DestTy)) {
2794 if (isa<IntegerType>(SrcTy)) {
2798 if (isa<TruncInst>(Src) || isa<ZExtInst>(Src)) {
2799 CastInst *SrcCast = cast<CastInst>(Src);
2801 if (isa<VectorType>(BCIn->getOperand(0)->getType()))
2803 BCIn->getOperand(0), cast<VectorType>(DestTy), *
this))
2816 if (SrcVTy->getNumElements() == 1) {
2829 if (
auto *InsElt = dyn_cast<InsertElementInst>(Src))
2830 return new BitCastInst(InsElt->getOperand(1), DestTy);
2840 Y->getType()->isIntegerTy() && isDesirableIntType(
BitWidth)) {
2843 IndexC = SrcVTy->getNumElements() - 1 - IndexC;
2849 unsigned EltWidth =
Y->getType()->getScalarSizeInBits();
2853 return BinaryOperator::CreateOr(AndX, ZextY);
2858 if (
auto *Shuf = dyn_cast<ShuffleVectorInst>(Src)) {
2861 Value *ShufOp0 = Shuf->getOperand(0);
2862 Value *ShufOp1 = Shuf->getOperand(1);
2863 auto ShufElts = cast<VectorType>(Shuf->getType())->getElementCount();
2864 auto SrcVecElts = cast<VectorType>(ShufOp0->
getType())->getElementCount();
2865 if (Shuf->hasOneUse() && DestTy->
isVectorTy() &&
2866 cast<VectorType>(DestTy)->getElementCount() == ShufElts &&
2867 ShufElts == SrcVecElts) {
2872 if (((Tmp = dyn_cast<BitCastInst>(ShufOp0)) &&
2874 ((Tmp = dyn_cast<BitCastInst>(ShufOp1)) &&
2888 if (DestTy->
isIntegerTy() && ShufElts.getKnownMinValue() % 2 == 0 &&
2889 Shuf->hasOneUse() && Shuf->isReverse()) {
2890 unsigned IntrinsicNum = 0;
2893 IntrinsicNum = Intrinsic::bswap;
2895 IntrinsicNum = Intrinsic::bitreverse;
2897 if (IntrinsicNum != 0) {
2898 assert(ShufOp0->
getType() == SrcTy &&
"Unexpected shuffle mask");
2909 if (
PHINode *PN = dyn_cast<PHINode>(Src))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
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...
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
static bool isSigned(unsigned int 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 canEvaluateSExtd(Value *V, Type *Ty)
Return true if we can take the specified value and return it as type Ty without inserting any new cas...
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 bool canEvaluateZExtd(Value *V, Type *Ty, unsigned &BitsToClear, InstCombinerImpl &IC, Instruction *CxtI)
Determine if the specified value can be computed in the specified wider type and produce the same low...
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 Type * shrinkFPConstant(ConstantFP *CFP, bool PreferBFloat)
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(ConstantFP *CFP, 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.
static Type * getMinimumFPType(Value *V, bool PreferBFloat)
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 bool canAlwaysEvaluateInType(Value *V, Type *Ty)
Constants and extensions/truncates from the destination type are always free to be evaluated in that ...
static Instruction * foldVecExtTruncToExtElt(TruncInst &Trunc, InstCombinerImpl &IC)
Whenever an element is extracted from a vector, optionally shifted down, and then truncated,...
static bool canNotEvaluateInType(Value *V, Type *Ty)
Filter out values that we can not evaluate in the destination type for free.
static bool isKnownExactCastIntToFP(CastInst &I, InstCombinerImpl &IC)
Return true if the cast from integer to FP can be proven to be exact for all possible inputs (the con...
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,...
static bool canEvaluateTruncated(Value *V, Type *Ty, InstCombinerImpl &IC, Instruction *CxtI)
Return true if we can evaluate the specified expression tree as type Ty instead of its larger type,...
This file provides internal interfaces used to implement the InstCombine.
This file provides the interface for the instcombine pass implementation.
uint64_t IntrinsicInst * II
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
const SmallVectorImpl< MachineOperand > & Cond
This file implements a set that has insertion order iteration characteristics.
static SymbolRef::Type getType(const Symbol *Sym)
Class for arbitrary precision integers.
LLVM_ABI APInt udiv(const APInt &RHS) const
Unsigned division operation.
uint64_t getZExtValue() const
Get zero extended value.
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
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.
bool uge(const APInt &RHS) const
Unsigned greater or equal comparison.
This class represents a conversion between pointers from one address space to another.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
ArrayRef< T > take_front(size_t N=1) const
Return a copy of *this with only the first N elements.
ArrayRef< T > take_back(size_t N=1) const
Return a copy of *this with only the last N elements.
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 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 unsigned isEliminableCastPair(Instruction::CastOps firstOpcode, Instruction::CastOps secondOpcode, Type *SrcTy, Type *MidTy, Type *DstTy, Type *SrcIntPtrTy, Type *MidIntPtrTy, Type *DstIntPtrTy)
Determine how a pair of casts can be eliminated, if they can be at all.
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_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...
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.
This class represents an Operation in the Expression.
unsigned getPointerSizeInBits(unsigned AS=0) const
The size in bits of the pointer representation in a given address space.
bool isLegalInteger(uint64_t Width) const
Returns true if the specified type is known to be a native integer type supported by the CPU.
LLVM_ABI IntegerType * getIntPtrType(LLVMContext &C, unsigned AddressSpace=0) const
Returns an integer type with size at least as big as that of a pointer in the given address space.
LLVM_ABI IntegerType * getIndexType(LLVMContext &C, unsigned AddressSpace) const
Returns the type of a GEP index in AddressSpace.
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 * CreateFPTruncFMF(Value *V, Type *DestTy, FMFSource FMFSource, const Twine &Name="", MDNode *FPMathTag=nullptr)
Value * CreateInsertElement(Type *VecTy, Value *NewElt, Value *Idx, const Twine &Name="")
Value * CreateExtractElement(Value *Vec, Value *Idx, const Twine &Name="")
Value * CreateZExtOrTrunc(Value *V, Type *DestTy, const Twine &Name="")
Create a ZExt or Trunc from the integer value V to DestTy.
LLVM_ABI Value * CreateSelectFMF(Value *C, Value *True, Value *False, FMFSource FMFSource, const Twine &Name="", Instruction *MDFrom=nullptr)
Value * CreateFPTrunc(Value *V, Type *DestTy, const Twine &Name="", MDNode *FPMathTag=nullptr)
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Value * CreateCast(Instruction::CastOps Op, Value *V, Type *DestTy, const Twine &Name="", MDNode *FPMathTag=nullptr, FMFSource FMFSource={})
Value * CreateVScale(Type *Ty, const Twine &Name="")
Create a call to llvm.vscale.<Ty>().
LLVM_ABI CallInst * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > Types, ArrayRef< Value * > Args, FMFSource FMFSource={}, const Twine &Name="")
Create a call to intrinsic ID with Args, mangled using Types.
ConstantInt * getInt32(uint32_t C)
Get a constant 32-bit value.
PHINode * CreatePHI(Type *Ty, unsigned NumReservedValues, const Twine &Name="")
Value * CreateNot(Value *V, const Twine &Name="")
Value * CreateBitCast(Value *V, Type *DestTy, const Twine &Name="")
Value * CreateCopySign(Value *LHS, Value *RHS, FMFSource FMFSource={}, const Twine &Name="")
Create call to the copysign intrinsic.
Value * CreateShl(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="", bool IsNonNeg=false)
Value * CreateAnd(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateAdd(Value *LHS, Value *RHS, const Twine &Name="", bool HasNUW=false, bool HasNSW=false)
Value * CreatePtrToInt(Value *V, Type *DestTy, const Twine &Name="")
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="", bool IsNUW=false, bool IsNSW=false)
Value * CreateBinOp(Instruction::BinaryOps Opc, Value *LHS, Value *RHS, const Twine &Name="", MDNode *FPMathTag=nullptr)
Value * CreateIntCast(Value *V, Type *DestTy, bool isSigned, const Twine &Name="")
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Value * CreateAShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
Value * CreateFNegFMF(Value *V, FMFSource FMFSource, const Twine &Name="", MDNode *FPMathTag=nullptr)
Value * CreateXor(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateOr(Value *LHS, Value *RHS, const Twine &Name="", bool IsDisjoint=false)
IntegerType * getInt8Ty()
Fetch the type representing an 8-bit integer.
Value * CreateFRemFMF(Value *L, Value *R, FMFSource FMFSource, const Twine &Name="", MDNode *FPMD=nullptr)
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Instruction * visitZExt(ZExtInst &Zext)
Instruction * visitAddrSpaceCast(AddrSpaceCastInst &CI)
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 * visitSIToFP(CastInst &CI)
Value * foldPtrToIntOfGEP(Type *IntTy, Value *Ptr)
Instruction * commonCastTransforms(CastInst &CI)
Implement the transforms common to all CastInst visitors.
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * foldItoFPtoI(CastInst &FI)
fpto{s/u}i({u/s}itofp(X)) --> X or zext(X) or sext(X) or trunc(X) This is safe if the intermediate ty...
Instruction * visitFPTrunc(FPTruncInst &CI)
Instruction * visitBitCast(BitCastInst &CI)
Instruction * visitIntToPtr(IntToPtrInst &CI)
Instruction * visitFPToUI(FPToUIInst &FI)
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.
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
bool MaskedValueIsZero(const Value *V, const APInt &Mask, const Instruction *CxtI=nullptr, unsigned Depth=0) const
const SimplifyQuery & getSimplifyQuery() const
void push(Instruction *I)
Push the instruction onto the worklist stack.
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.
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 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, 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.
A SetVector that performs no allocations if smaller than a certain size.
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.
static LLVM_ABI Type * getFloatTy(LLVMContext &C)
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
bool isVectorTy() const
True if this is an instance of VectorType.
static LLVM_ABI Type * getPPC_FP128Ty(LLVMContext &C)
static LLVM_ABI Type * getDoubleTy(LLVMContext &C)
LLVM_ABI int getFPMantissaWidth() const
Return the width of the mantissa of this type.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
static LLVM_ABI Type * getHalfTy(LLVMContext &C)
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
static LLVM_ABI Type * getBFloatTy(LLVMContext &C)
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp 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.
LLVM_ABI const fltSemantics & getFltSemantics() const
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isIntegerTy() const
True if this is an instance of IntegerType.
bool isFPOrFPVectorTy() const
Return true if this is a FP type or a vector of FP.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
LLVM_ABI Type * getWithNewType(Type *EltTy) const
Given vector type, change the element type, whilst keeping the old number of elements.
'undef' values are things that do not have specified contents.
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
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.
iterator_range< user_iterator > users()
LLVM_ABI 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 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 * > Tys={})
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)
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)
class_match< BinaryOperator > m_BinOp()
Match an arbitrary binary operation and ignore it.
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.
class_match< Constant > m_Constant()
Match an arbitrary Constant and ignore it.
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)
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.
class_match< ConstantInt > m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
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.
IntrinsicID_match m_VScale()
Matches a call to llvm.vscale().
BinOpPred_match< LHS, RHS, is_logical_shift_op > m_LogicalShift(const LHS &L, const RHS &R)
Matches logical shift operations.
CastInst_match< OpTy, FPToUIInst > m_FPToUI(const OpTy &Op)
deferredval_ty< 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()...
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
CastInst_match< OpTy, FPExtInst > m_FPExt(const OpTy &Op)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
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)
apint_match m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
class_match< Value > m_Value()
Match an arbitrary value and ignore it.
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)
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.
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)
match_combine_or< LTy, RTy > m_CombineOr(const LTy &L, const RTy &R)
Combine two pattern matchers matching L || 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.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, const SimplifyQuery &SQ, unsigned Depth=0)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Constant * ConstantFoldSelectInstruction(Constant *Cond, Constant *V1, Constant *V2)
Attempt to constant fold a select instruction with the specified operands.
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...
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.
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
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.
constexpr unsigned BitWidth
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
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.
static LLVM_ABI const fltSemantics & IEEEsingle() LLVM_READNONE
static constexpr roundingMode rmNearestTiesToEven
static LLVM_ABI const fltSemantics & IEEEdouble() LLVM_READNONE
static LLVM_ABI const fltSemantics & IEEEhalf() LLVM_READNONE
static LLVM_ABI const fltSemantics & BFloat() LLVM_READNONE
static LLVM_ABI unsigned int semanticsIntSizeInBits(const fltSemantics &, bool)
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