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: {
56 case Instruction::Trunc:
57 case Instruction::ZExt:
58 case Instruction::SExt:
62 if (
I->getOperand(0)->getType() == Ty)
63 return I->getOperand(0);
68 Opc == Instruction::SExt);
70 case Instruction::Select: {
76 case Instruction::PHI: {
87 case Instruction::FPToUI:
88 case Instruction::FPToSI:
92 case Instruction::Call:
94 switch (
II->getIntrinsicID()) {
97 case Intrinsic::vscale: {
99 I->getModule(), Intrinsic::vscale, {Ty});
106 case Instruction::ShuffleVector: {
107 auto *ScalarTy = cast<VectorType>(Ty)->getElementType();
108 auto *VTy = cast<VectorType>(
I->getOperand(0)->getType());
113 cast<ShuffleVectorInst>(
I)->getShuffleMask());
126InstCombinerImpl::isEliminableCastPair(
const CastInst *CI1,
141 DstTy, SrcIntPtrTy, MidIntPtrTy,
146 if ((Res == Instruction::IntToPtr && SrcTy != DstIntPtrTy) ||
147 (Res == Instruction::PtrToInt && DstTy != SrcIntPtrTy))
158 if (
auto *SrcC = dyn_cast<Constant>(Src))
163 if (
auto *CSrc = dyn_cast<CastInst>(Src)) {
169 if (CSrc->hasOneUse())
175 if (
auto *Sel = dyn_cast<SelectInst>(Src)) {
181 auto *Cmp = dyn_cast<CmpInst>(Sel->getCondition());
182 if (!Cmp || Cmp->getOperand(0)->getType() != Sel->getType() ||
188 if (CI.
getOpcode() != Instruction::BitCast ||
199 if (
auto *PN = dyn_cast<PHINode>(Src)) {
216 auto *SrcTy = dyn_cast<FixedVectorType>(
X->getType());
217 auto *DestTy = dyn_cast<FixedVectorType>(Ty);
218 if (SrcTy && DestTy &&
219 SrcTy->getNumElements() == DestTy->getNumElements() &&
232 if (isa<Constant>(V))
246 if (!isa<Instruction>(V))
274 auto *
I = cast<Instruction>(V);
275 Type *OrigTy = V->getType();
276 switch (
I->getOpcode()) {
277 case Instruction::Add:
278 case Instruction::Sub:
279 case Instruction::Mul:
280 case Instruction::And:
281 case Instruction::Or:
282 case Instruction::Xor:
287 case Instruction::UDiv:
288 case Instruction::URem: {
303 case Instruction::Shl: {
314 case Instruction::LShr: {
332 case Instruction::AShr: {
342 unsigned ShiftedBits = OrigBitWidth -
BitWidth;
349 case Instruction::Trunc:
352 case Instruction::ZExt:
353 case Instruction::SExt:
357 case Instruction::Select: {
362 case Instruction::PHI: {
372 case Instruction::FPToUI:
373 case Instruction::FPToSI: {
377 Type *InputTy =
I->getOperand(0)->getType()->getScalarType();
381 I->getOpcode() == Instruction::FPToSI);
384 case Instruction::ShuffleVector:
405 if (!TruncOp->
hasOneUse() || !isa<IntegerType>(DestType))
408 Value *VecInput =
nullptr;
413 !isa<VectorType>(VecInput->
getType()))
417 unsigned VecWidth = VecType->getPrimitiveSizeInBits();
419 unsigned ShiftAmount = ShiftVal ? ShiftVal->
getZExtValue() : 0;
421 if ((VecWidth % DestWidth != 0) || (ShiftAmount % DestWidth != 0))
426 unsigned NumVecElts = VecWidth / DestWidth;
427 if (VecType->getElementType() != DestType) {
432 unsigned Elt = ShiftAmount / DestWidth;
434 Elt = NumVecElts - 1 - Elt;
454 Type *SrcType = Src->getType();
461 unsigned TruncRatio = SrcBits / DstBits;
462 if ((SrcBits % DstBits) != 0)
467 const APInt *ShiftAmount =
nullptr;
474 auto *VecOpTy = cast<VectorType>(VecOp->
getType());
475 auto VecElts = VecOpTy->getElementCount();
477 uint64_t BitCastNumElts = VecElts.getKnownMinValue() * TruncRatio;
480 ? (VecOpIdx + 1) * TruncRatio - 1
481 : VecOpIdx * TruncRatio;
487 if (ShiftAmount->
uge(SrcBits) || ShiftAmount->
urem(DstBits) != 0)
495 assert(BitCastNumElts <= std::numeric_limits<uint32_t>::max() &&
496 NewIdx <= std::numeric_limits<uint32_t>::max() &&
"overflow 32-bits");
509 "Don't narrow to an illegal scalar type");
525 Value *ShVal0, *ShVal1, *ShAmt0, *ShAmt1;
532 if (Or0->
getOpcode() == BinaryOperator::LShr) {
538 Or1->
getOpcode() == BinaryOperator::LShr &&
539 "Illegal or(shift,shift) pair");
548 unsigned MaxShiftAmountWidth =
Log2_32(NarrowWidth);
549 APInt HiBitMask =
~APInt::getLowBitsSet(WideWidth, MaxShiftAmountWidth);
556 if (ShVal0 != ShVal1)
562 unsigned Mask = Width - 1;
575 Value *ShAmt = matchShiftAmount(ShAmt0, ShAmt1, NarrowWidth);
578 ShAmt = matchShiftAmount(ShAmt1, ShAmt0, NarrowWidth);
600 if (ShVal0 != ShVal1)
602 Intrinsic::ID IID = IsFshl ? Intrinsic::fshl : Intrinsic::fshr;
616 if (!isa<VectorType>(SrcTy) && !shouldChangeType(SrcTy, DestTy))
626 case Instruction::And:
627 case Instruction::Or:
628 case Instruction::Xor:
629 case Instruction::Add:
630 case Instruction::Sub:
631 case Instruction::Mul: {
658 case Instruction::LShr:
659 case Instruction::AShr: {
664 unsigned MaxShiftAmt = SrcWidth - DestWidth;
668 APInt(SrcWidth, MaxShiftAmt)))) {
669 auto *OldShift = cast<Instruction>(Trunc.
getOperand(0));
670 bool IsExact = OldShift->isExact();
675 OldShift->getOpcode() == Instruction::AShr
687 if (
Instruction *NarrowOr = narrowFunnelShift(Trunc))
698 auto *Shuf = dyn_cast<ShuffleVectorInst>(Trunc.
getOperand(0));
699 if (Shuf && Shuf->hasOneUse() &&
match(Shuf->getOperand(1),
m_Undef()) &&
701 Shuf->getType() == Shuf->getOperand(0)->getType()) {
719 assert((Opcode == Instruction::Trunc || Opcode == Instruction::FPTrunc) &&
720 "Unexpected instruction for shrinking");
722 auto *InsElt = dyn_cast<InsertElementInst>(Trunc.
getOperand(0));
723 if (!InsElt || !InsElt->hasOneUse())
728 Value *VecOp = InsElt->getOperand(0);
729 Value *ScalarOp = InsElt->getOperand(1);
730 Value *Index = InsElt->getOperand(2);
748 Type *DestTy = Trunc.
getType(), *SrcTy = Src->getType();
756 if ((DestTy->
isVectorTy() || shouldChangeType(SrcTy, DestTy)) &&
762 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
774 if (
auto *DestITy = dyn_cast<IntegerType>(DestTy)) {
775 if (DestWidth * 2 < SrcWidth) {
776 auto *NewDestTy = DestITy->getExtendedType();
777 if (shouldChangeType(SrcTy, NewDestTy) &&
780 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
781 " to reduce the width of operand of"
794 if (DestWidth == 1) {
843 unsigned AWidth =
A->getType()->getScalarSizeInBits();
844 unsigned MaxShiftAmt = SrcWidth - std::max(DestWidth, AWidth);
845 auto *OldSh = cast<Instruction>(Src);
846 bool IsExact = OldSh->isExact();
851 APInt(SrcWidth, MaxShiftAmt)))) {
852 auto GetNewShAmt = [&](
unsigned Width) {
853 Constant *MaxAmt = ConstantInt::get(SrcTy, Width - 1,
false);
862 if (
A->getType() == DestTy) {
863 Constant *ShAmt = GetNewShAmt(DestWidth);
865 return IsExact ? BinaryOperator::CreateExactAShr(
A, ShAmt)
866 : BinaryOperator::CreateAShr(
A, ShAmt);
870 if (Src->hasOneUse()) {
871 Constant *ShAmt = GetNewShAmt(AWidth);
888 if (Src->hasOneUse() &&
889 (isa<VectorType>(SrcTy) || shouldChangeType(SrcTy, DestTy))) {
896 APInt Threshold =
APInt(
C->getType()->getScalarSizeInBits(), DestWidth);
914 unsigned AWidth =
A->getType()->getScalarSizeInBits();
915 if (AWidth == DestWidth && AWidth >
Log2_32(SrcWidth)) {
916 Value *WidthDiff = ConstantInt::get(
A->getType(), SrcWidth - AWidth);
919 return BinaryOperator::CreateAdd(NarrowCtlz, WidthDiff);
929 if (
Log2_32(*MaxVScale) < DestWidth) {
937 if (DestWidth == 1 &&
942 bool Changed =
false;
955 return Changed ? &Trunc :
nullptr;
975 Value *In = Cmp->getOperand(0);
976 Value *Sh = ConstantInt::get(In->getType(),
977 In->getType()->getScalarSizeInBits() - 1);
979 if (In->getType() != Zext.
getType())
990 if (Op1CV->
isZero() && Cmp->isEquality()) {
995 uint32_t ShAmt = KnownZeroMask.logBase2();
996 bool IsExpectShAmt = KnownZeroMask.isPowerOf2() &&
999 (Cmp->getOperand(0)->getType() == Zext.
getType() ||
1001 Value *In = Cmp->getOperand(0);
1006 In->getName() +
".lobit");
1022 if (
Cmp->isEquality()) {
1030 auto *
And = cast<BinaryOperator>(
Cmp->getOperand(0));
1031 Value *Shift =
And->getOperand(
X ==
And->getOperand(0) ? 1 : 0);
1074 auto *
I = cast<Instruction>(V);
1076 switch (
I->getOpcode()) {
1077 case Instruction::ZExt:
1078 case Instruction::SExt:
1079 case Instruction::Trunc:
1081 case Instruction::And:
1082 case Instruction::Or:
1083 case Instruction::Xor:
1084 case Instruction::Add:
1085 case Instruction::Sub:
1086 case Instruction::Mul:
1091 if (BitsToClear == 0 && Tmp == 0)
1096 if (Tmp == 0 &&
I->isBitwiseLogicOp()) {
1099 unsigned VSize = V->getType()->getScalarSizeInBits();
1105 if (
I->getOpcode() == Instruction::And)
1114 case Instruction::Shl: {
1122 BitsToClear = ShiftAmt < BitsToClear ? BitsToClear - ShiftAmt : 0;
1127 case Instruction::LShr: {
1135 if (BitsToClear > V->getType()->getScalarSizeInBits())
1136 BitsToClear = V->getType()->getScalarSizeInBits();
1142 case Instruction::Select:
1151 case Instruction::PHI: {
1166 case Instruction::Call:
1170 if (
II->getIntrinsicID() == Intrinsic::vscale)
1191 Type *SrcTy = Src->getType(), *DestTy = Zext.
getType();
1198 unsigned BitsToClear;
1199 if (shouldChangeType(SrcTy, DestTy) &&
1202 "Can't clear more bits than in SrcTy");
1206 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1207 " to avoid zero extend: "
1213 if (
auto *
SrcOp = dyn_cast<Instruction>(Src))
1214 if (
SrcOp->hasOneUse())
1224 DestBitSize - SrcBitsKept),
1231 return BinaryOperator::CreateAnd(Res,
C);
1237 if (
auto *CSrc = dyn_cast<TruncInst>(Src)) {
1242 Value *
A = CSrc->getOperand(0);
1243 unsigned SrcSize =
A->getType()->getScalarSizeInBits();
1244 unsigned MidSize = CSrc->getType()->getScalarSizeInBits();
1250 if (SrcSize < DstSize) {
1252 Constant *AndConst = ConstantInt::get(
A->getType(), AndValue);
1257 if (SrcSize == DstSize) {
1259 return BinaryOperator::CreateAnd(
A, ConstantInt::get(
A->getType(),
1262 if (SrcSize > DstSize) {
1265 return BinaryOperator::CreateAnd(Trunc,
1266 ConstantInt::get(Trunc->
getType(),
1271 if (
auto *Cmp = dyn_cast<ICmpInst>(Src))
1272 return transformZExtICmp(Cmp, Zext);
1278 X->getType() == DestTy)
1285 X->getType() == DestTy) {
1296 X->getType() == DestTy) {
1298 return BinaryOperator::CreateAnd(
X, ZextC);
1307 unsigned TypeWidth = Src->getType()->getScalarSizeInBits();
1308 if (
Log2_32(*MaxVScale) < TypeWidth) {
1338 Value *Op0 = Cmp->getOperand(0), *Op1 = Cmp->getOperand(1);
1342 if (!Op1->getType()->isIntOrIntVectorTy())
1350 if (In->getType() != Sext.
getType())
1356 if (
ConstantInt *Op1C = dyn_cast<ConstantInt>(Op1)) {
1360 if (Cmp->hasOneUse() &&
1361 Cmp->isEquality() && (Op1C->isZero() || Op1C->getValue().isPowerOf2())){
1365 if (KnownZeroMask.isPowerOf2()) {
1366 Value *In = Cmp->getOperand(0);
1369 if (!Op1C->isZero() && Op1C->getValue() != KnownZeroMask) {
1379 unsigned ShiftAmt = KnownZeroMask.countr_zero();
1383 ConstantInt::get(
In->getType(), ShiftAmt));
1393 unsigned ShiftAmt = KnownZeroMask.countl_zero();
1397 ConstantInt::get(
In->getType(), ShiftAmt));
1401 KnownZeroMask.getBitWidth() - 1),
"sext");
1423 "Can't sign extend type to a smaller type");
1429 auto *
I = cast<Instruction>(V);
1430 switch (
I->getOpcode()) {
1431 case Instruction::SExt:
1432 case Instruction::ZExt:
1433 case Instruction::Trunc:
1435 case Instruction::And:
1436 case Instruction::Or:
1437 case Instruction::Xor:
1438 case Instruction::Add:
1439 case Instruction::Sub:
1440 case Instruction::Mul:
1448 case Instruction::Select:
1452 case Instruction::PHI: {
1479 Type *SrcTy = Src->getType(), *DestTy = Sext.
getType();
1486 CI->setNonNeg(
true);
1494 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1495 " to avoid sign extend: "
1506 Value *ShAmt = ConstantInt::get(DestTy, DestBitSize-SrcBitSize);
1515 unsigned XBitSize =
X->getType()->getScalarSizeInBits();
1520 if (Src->hasOneUse() &&
X->getType() == DestTy) {
1522 Constant *ShAmt = ConstantInt::get(DestTy, DestBitSize - SrcBitSize);
1531 if (Src->hasOneUse() &&
1539 if (
auto *Cmp = dyn_cast<ICmpInst>(Src))
1540 return transformSExtICmp(Cmp, Sext);
1557 Constant *BA =
nullptr, *CA =
nullptr;
1563 assert(WideCurrShAmt &&
"Constant folding of ImmConstant cannot fail");
1572 return BinaryOperator::CreateAShr(
A, NewShAmt);
1580 Type *XTy =
X->getType();
1582 Constant *ShlAmtC = ConstantInt::get(XTy, XBitSize - SrcBitSize);
1583 Constant *AshrAmtC = ConstantInt::get(XTy, XBitSize - 1);
1587 if (cast<BinaryOperator>(Src)->getOperand(0)->hasOneUse()) {
1599 if (
Log2_32(*MaxVScale) < (SrcBitSize - 1)) {
1642 auto *CV = dyn_cast<Constant>(V);
1643 auto *CVVTy = dyn_cast<FixedVectorType>(V->getType());
1647 Type *MinType =
nullptr;
1649 unsigned NumElts = CVVTy->getNumElements();
1653 for (
unsigned i = 0; i != NumElts; ++i) {
1654 if (isa<UndefValue>(CV->getAggregateElement(i)))
1657 auto *CFP = dyn_cast_or_null<ConstantFP>(CV->getAggregateElement(i));
1677 if (
auto *FPExt = dyn_cast<FPExtInst>(V))
1678 return FPExt->getOperand(0)->getType();
1683 if (
auto *CFP = dyn_cast<ConstantFP>(V))
1690 if (
auto *FPCExt = dyn_cast<ConstantExpr>(V))
1691 if (FPCExt->getOpcode() == Instruction::FPExt)
1692 return FPCExt->getOperand(0)->getType();
1699 return V->getType();
1706 assert((Opcode == CastInst::SIToFP || Opcode == CastInst::UIToFP) &&
1708 Value *Src =
I.getOperand(0);
1709 Type *SrcTy = Src->getType();
1710 Type *FPTy =
I.getType();
1711 bool IsSigned = Opcode == Instruction::SIToFP;
1717 if (SrcSize <= DestNumSigBits)
1726 int SrcNumSigBits =
F->getType()->getFPMantissaWidth();
1733 if (SrcNumSigBits > 0 && DestNumSigBits > 0 &&
1734 SrcNumSigBits <= DestNumSigBits)
1745 if (SigBits <= DestNumSigBits)
1763 auto *BO = dyn_cast<BinaryOperator>(FPT.
getOperand(0));
1764 if (BO && BO->hasOneUse()) {
1769 unsigned OpWidth = BO->getType()->getFPMantissaWidth();
1772 unsigned SrcWidth = std::max(LHSWidth, RHSWidth);
1774 switch (BO->getOpcode()) {
1776 case Instruction::FAdd:
1777 case Instruction::FSub:
1796 if (OpWidth >= 2*DstWidth+1 && DstWidth >= SrcWidth) {
1804 case Instruction::FMul:
1810 if (OpWidth >= LHSWidth + RHSWidth && DstWidth >= SrcWidth) {
1816 case Instruction::FDiv:
1823 if (OpWidth >= 2*DstWidth && DstWidth >= SrcWidth) {
1829 case Instruction::FRem: {
1834 if (SrcWidth == OpWidth)
1837 if (LHSWidth == SrcWidth) {
1854 if (
Op &&
Op->hasOneUse()) {
1857 if (
auto *FPMO = dyn_cast<FPMathOperator>(
Op))
1858 FMF &= FPMO->getFastMathFlags();
1871 X->getType() == Ty) {
1878 X->getType() == Ty) {
1886 if (
auto *
II = dyn_cast<IntrinsicInst>(FPT.
getOperand(0))) {
1887 switch (
II->getIntrinsicID()) {
1889 case Intrinsic::ceil:
1890 case Intrinsic::fabs:
1891 case Intrinsic::floor:
1892 case Intrinsic::nearbyint:
1893 case Intrinsic::rint:
1894 case Intrinsic::round:
1895 case Intrinsic::roundeven:
1896 case Intrinsic::trunc: {
1897 Value *Src =
II->getArgOperand(0);
1898 if (!Src->hasOneUse())
1904 if (
II->getIntrinsicID() != Intrinsic::fabs) {
1905 FPExtInst *FPExtSrc = dyn_cast<FPExtInst>(Src);
1906 if (!FPExtSrc || FPExtSrc->
getSrcTy() != Ty)
1916 II->getOperandBundlesAsDefs(OpBundles);
1929 if (isa<SIToFPInst>(Src) || isa<UIToFPInst>(Src)) {
1930 auto *FPCast = cast<CastInst>(Src);
1943 if (isa<SIToFPInst>(Src) || isa<UIToFPInst>(Src)) {
1944 auto *FPCast = cast<CastInst>(Src);
1960 auto *OpI = cast<CastInst>(FI.
getOperand(0));
1961 Value *
X = OpI->getOperand(0);
1962 Type *XType =
X->getType();
1964 bool IsOutputSigned = isa<FPToSIInst>(FI);
1979 if (OutputSize > OpI->getType()->getFPMantissaWidth())
1984 bool IsInputSigned = isa<SIToFPInst>(OpI);
1985 if (IsInputSigned && IsOutputSigned)
1992 assert(XType == DestType &&
"Unexpected types for int to FP to int casts");
2045 UI->setNonNeg(
true);
2080 if (TySize != PtrSize) {
2093 Mask->getType() == Ty)
2096 if (
auto *
GEP = dyn_cast<GEPOperator>(
SrcOp)) {
2101 if (
GEP->hasOneUse() &&
2102 isa<ConstantPointerNull>(
GEP->getPointerOperand())) {
2110 if (
GEP->hasOneUse() &&
2112 Base->getType() == Ty) {
2114 auto *NewOp = BinaryOperator::CreateAdd(
Base,
Offset);
2115 NewOp->setHasNoUnsignedWrap(
GEP->hasNoUnsignedWrap());
2120 Value *Vec, *Scalar, *Index;
2158 if (SrcTy->getElementType() != DestTy->getElementType()) {
2163 if (SrcTy->getElementType()->getPrimitiveSizeInBits() !=
2164 DestTy->getElementType()->getPrimitiveSizeInBits())
2169 cast<FixedVectorType>(SrcTy)->getNumElements());
2174 unsigned SrcElts = cast<FixedVectorType>(SrcTy)->getNumElements();
2175 unsigned DestElts = cast<FixedVectorType>(DestTy)->getNumElements();
2177 assert(SrcElts != DestElts &&
"Element counts should be different.");
2182 auto ShuffleMaskStorage = llvm::to_vector<16>(llvm::seq<int>(0, SrcElts));
2186 if (SrcElts > DestElts) {
2195 ShuffleMask = ShuffleMaskStorage;
2197 ShuffleMask = ShuffleMask.
take_back(DestElts);
2199 ShuffleMask = ShuffleMask.
take_front(DestElts);
2210 unsigned DeltaElts = DestElts - SrcElts;
2212 ShuffleMaskStorage.insert(ShuffleMaskStorage.begin(), DeltaElts, NullElt);
2214 ShuffleMaskStorage.append(DeltaElts, NullElt);
2215 ShuffleMask = ShuffleMaskStorage;
2243 "Shift should be a multiple of the element type size");
2246 if (isa<UndefValue>(V))
return true;
2250 if (V->getType() == VecEltTy) {
2252 if (
Constant *
C = dyn_cast<Constant>(V))
2253 if (
C->isNullValue())
2258 ElementIndex = Elements.size() - ElementIndex - 1;
2261 if (Elements[ElementIndex])
2264 Elements[ElementIndex] = V;
2268 if (
Constant *
C = dyn_cast<Constant>(V)) {
2281 if (!isa<IntegerType>(
C->getType()))
2283 C->getType()->getPrimitiveSizeInBits()));
2287 for (
unsigned i = 0; i != NumElts; ++i) {
2288 unsigned ShiftI = i * ElementSize;
2290 Instruction::LShr,
C, ConstantInt::get(
C->getType(), ShiftI));
2302 if (!V->hasOneUse())
return false;
2305 if (!
I)
return false;
2306 switch (
I->getOpcode()) {
2307 default:
return false;
2308 case Instruction::BitCast:
2309 if (
I->getOperand(0)->getType()->isVectorTy())
2313 case Instruction::ZExt:
2315 I->getOperand(0)->getType()->getPrimitiveSizeInBits(),
2320 case Instruction::Or:
2325 case Instruction::Shl: {
2327 ConstantInt *CI = dyn_cast<ConstantInt>(
I->getOperand(1));
2328 if (!CI)
return false;
2355 auto *DestVecTy = cast<FixedVectorType>(CI.
getType());
2360 if (isa<UndefValue>(IntInput))
2365 DestVecTy->getElementType(),
2373 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
2374 if (!Elements[i])
continue;
2389 Value *VecOp, *Index;
2406 auto *FixedVType = dyn_cast<FixedVectorType>(VecType);
2407 if (DestType->
isVectorTy() && FixedVType && FixedVType->getNumElements() == 1)
2434 if (
X->getType()->isFPOrFPVectorTy() &&
2435 Y->getType()->isIntOrIntVectorTy()) {
2441 if (
X->getType()->isIntOrIntVectorTy() &&
2442 Y->getType()->isFPOrFPVectorTy()) {
2457 X->getType() == DestTy && !isa<Constant>(
X)) {
2464 X->getType() == DestTy && !isa<Constant>(
X)) {
2496 if (
auto *CondVTy = dyn_cast<VectorType>(CondTy))
2498 CondVTy->getElementCount() !=
2499 cast<VectorType>(DestTy)->getElementCount())
2509 auto *Sel = cast<Instruction>(BitCast.
getOperand(0));
2512 !isa<Constant>(
X)) {
2519 !isa<Constant>(
X)) {
2531 if (!isa<StoreInst>(U))
2552 Type *SrcTy = Src->getType();
2564 while (!PhiWorklist.
empty()) {
2566 for (
Value *IncValue : OldPN->incoming_values()) {
2567 if (isa<Constant>(IncValue))
2570 if (
auto *LI = dyn_cast<LoadInst>(IncValue)) {
2576 if (
Addr == &CI || isa<LoadInst>(
Addr))
2584 if (LI->hasOneUse() && LI->isSimple())
2591 if (
auto *PNode = dyn_cast<PHINode>(IncValue)) {
2592 if (OldPhiNodes.
insert(PNode))
2597 auto *BCI = dyn_cast<BitCastInst>(IncValue);
2603 Type *TyA = BCI->getOperand(0)->getType();
2604 Type *TyB = BCI->getType();
2605 if (TyA != DestTy || TyB != SrcTy)
2612 for (
auto *OldPN : OldPhiNodes) {
2614 if (
auto *SI = dyn_cast<StoreInst>(V)) {
2615 if (!
SI->isSimple() ||
SI->getOperand(0) != OldPN)
2617 }
else if (
auto *BCI = dyn_cast<BitCastInst>(V)) {
2619 Type *TyB = BCI->getOperand(0)->getType();
2620 Type *TyA = BCI->getType();
2621 if (TyA != DestTy || TyB != SrcTy)
2623 }
else if (
auto *
PHI = dyn_cast<PHINode>(V)) {
2627 if (!OldPhiNodes.contains(
PHI))
2637 for (
auto *OldPN : OldPhiNodes) {
2640 NewPNodes[OldPN] = NewPN;
2644 for (
auto *OldPN : OldPhiNodes) {
2645 PHINode *NewPN = NewPNodes[OldPN];
2646 for (
unsigned j = 0, e = OldPN->getNumOperands(); j != e; ++j) {
2647 Value *
V = OldPN->getOperand(j);
2648 Value *NewV =
nullptr;
2649 if (
auto *
C = dyn_cast<Constant>(V)) {
2651 }
else if (
auto *LI = dyn_cast<LoadInst>(V)) {
2660 }
else if (
auto *BCI = dyn_cast<BitCastInst>(V)) {
2661 NewV = BCI->getOperand(0);
2662 }
else if (
auto *PrevPN = dyn_cast<PHINode>(V)) {
2663 NewV = NewPNodes[PrevPN];
2666 NewPN->
addIncoming(NewV, OldPN->getIncomingBlock(j));
2680 for (
auto *OldPN : OldPhiNodes) {
2681 PHINode *NewPN = NewPNodes[OldPN];
2683 if (
auto *SI = dyn_cast<StoreInst>(V)) {
2684 assert(
SI->isSimple() &&
SI->getOperand(0) == OldPN);
2688 SI->setOperand(0, NewBC);
2692 else if (
auto *BCI = dyn_cast<BitCastInst>(V)) {
2693 Type *TyB = BCI->getOperand(0)->getType();
2694 Type *TyA = BCI->getType();
2695 assert(TyA == DestTy && TyB == SrcTy);
2701 }
else if (
auto *
PHI = dyn_cast<PHINode>(V)) {
2726 if (
X->getType() != FTy)
2738 Type *SrcTy = Src->getType();
2743 if (DestTy == Src->getType())
2746 if (isa<FixedVectorType>(DestTy)) {
2747 if (isa<IntegerType>(SrcTy)) {
2751 if (isa<TruncInst>(Src) || isa<ZExtInst>(Src)) {
2752 CastInst *SrcCast = cast<CastInst>(Src);
2754 if (isa<VectorType>(BCIn->getOperand(0)->getType()))
2756 BCIn->getOperand(0), cast<VectorType>(DestTy), *
this))
2769 if (SrcVTy->getNumElements() == 1) {
2782 if (
auto *InsElt = dyn_cast<InsertElementInst>(Src))
2783 return new BitCastInst(InsElt->getOperand(1), DestTy);
2793 Y->getType()->isIntegerTy() && isDesirableIntType(
BitWidth)) {
2796 IndexC = SrcVTy->getNumElements() - 1 - IndexC;
2802 unsigned EltWidth =
Y->getType()->getScalarSizeInBits();
2806 return BinaryOperator::CreateOr(AndX, ZextY);
2811 if (
auto *Shuf = dyn_cast<ShuffleVectorInst>(Src)) {
2814 Value *ShufOp0 = Shuf->getOperand(0);
2815 Value *ShufOp1 = Shuf->getOperand(1);
2816 auto ShufElts = cast<VectorType>(Shuf->getType())->getElementCount();
2817 auto SrcVecElts = cast<VectorType>(ShufOp0->
getType())->getElementCount();
2818 if (Shuf->hasOneUse() && DestTy->
isVectorTy() &&
2819 cast<VectorType>(DestTy)->getElementCount() == ShufElts &&
2820 ShufElts == SrcVecElts) {
2825 if (((Tmp = dyn_cast<BitCastInst>(ShufOp0)) &&
2827 ((Tmp = dyn_cast<BitCastInst>(ShufOp1)) &&
2841 if (DestTy->
isIntegerTy() && ShufElts.getKnownMinValue() % 2 == 0 &&
2842 Shuf->hasOneUse() && Shuf->isReverse()) {
2843 unsigned IntrinsicNum = 0;
2846 IntrinsicNum = Intrinsic::bswap;
2848 IntrinsicNum = Intrinsic::bitreverse;
2850 if (IntrinsicNum != 0) {
2851 assert(ShufOp0->
getType() == SrcTy &&
"Unexpected shuffle mask");
2862 if (
PHINode *PN = dyn_cast<PHINode>(Src))
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
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file implements a set that has insertion order iteration characteristics.
static SymbolRef::Type getType(const Symbol *Sym)
Class for arbitrary precision integers.
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.
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.
std::optional< unsigned > getVScaleRangeMax() const
Returns the maximum value for the vscale_range attribute or std::nullopt when unknown.
BinaryOps getOpcode() const
static 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 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 CastInst * CreateFPCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create an FPExt, BitCast, or FPTrunc for fp -> fp casts.
static 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 CastInst * CreateTruncOrBitCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a Trunc or BitCast cast instruction.
static CastInst * CreateBitOrPointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, a PtrToInt, or an IntToPTr cast instruction.
static 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 Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static 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 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 Constant * mergeUndefsWith(Constant *C, Constant *Other)
Merges undefs of a Constant with another Constant, along with the undefs already present.
static Constant * getAllOnesValue(Type *Ty)
static Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
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
Layout pointer size, in bits FIXME: The defaults need to be removed once all of the backends/clients ...
bool isLegalInteger(uint64_t Width) const
Returns true if the specified type is known to be a native integer type supported by the CPU.
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.
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 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.
This instruction compares its operands according to the predicate given to the constructor.
Value * CreateVScale(Constant *Scaling, const Twine &Name="")
Create a call to llvm.vscale, multiplied by Scaling.
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.
Value * CreateFRemFMF(Value *L, Value *R, Instruction *FMFSource, const Twine &Name="")
Copy fast-math-flags from an instruction rather than using the builder's default FMF.
Value * CreateFPTrunc(Value *V, Type *DestTy, const Twine &Name="", MDNode *FPMathTag=nullptr)
CallInst * CreateIntrinsic(Intrinsic::ID ID, ArrayRef< Type * > Types, ArrayRef< Value * > Args, Instruction *FMFSource=nullptr, const Twine &Name="")
Create a call to intrinsic ID with Args, mangled using Types.
Value * CreateSelect(Value *C, Value *True, Value *False, const Twine &Name="", Instruction *MDFrom=nullptr)
Value * CreateLShr(Value *LHS, Value *RHS, const Twine &Name="", bool isExact=false)
void setFastMathFlags(FastMathFlags NewFMF)
Set the fast-math flags to be used with generated fp-math operators.
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 * 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 * CreateCast(Instruction::CastOps Op, Value *V, Type *DestTy, const Twine &Name="", MDNode *FPMathTag=nullptr)
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 * CreateOr(Value *LHS, Value *RHS, const Twine &Name="")
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 * CreateXor(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateFNeg(Value *V, const Twine &Name="", MDNode *FPMathTag=nullptr)
Value * CreateCopySign(Value *LHS, Value *RHS, Instruction *FMFSource=nullptr, const Twine &Name="")
Create call to the copysign intrinsic.
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)
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
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, unsigned Depth=0, const Instruction *CxtI=nullptr) const
void computeKnownBits(const Value *V, KnownBits &Known, unsigned Depth, const Instruction *CxtI) const
bool MaskedValueIsZero(const Value *V, const APInt &Mask, unsigned Depth=0, const Instruction *CxtI=nullptr) const
const SimplifyQuery & getSimplifyQuery() const
unsigned ComputeMaxSignificantBits(const Value *Op, unsigned Depth=0, const Instruction *CxtI=nullptr) const
void push(Instruction *I)
Push the instruction onto the worklist stack.
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.
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...
const Function * getFunction() const
Return the function this instruction belongs to.
void setNonNeg(bool b=true)
Set or clear the nneg flag on this instruction, which must be a zext instruction.
bool hasNonNeg() const LLVM_READONLY
Determine whether the the nneg flag is set.
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.
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 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 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 Type * getHalfTy(LLVMContext &C)
static Type * getDoubleTy(LLVMContext &C)
const fltSemantics & getFltSemantics() const
bool isVectorTy() const
True if this is an instance of VectorType.
static Type * getBFloatTy(LLVMContext &C)
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Type * getWithNewType(Type *EltTy) const
Given vector type, change the element type, whilst keeping the old number of elements.
int getFPMantissaWidth() const
Return the width of the mantissa of this 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.
static IntegerType * getInt32Ty(LLVMContext &C)
static Type * getFloatTy(LLVMContext &C)
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.
TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
static Type * getPPC_FP128Ty(LLVMContext &C)
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
'undef' values are things that do not have specified contents.
static 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()
LLVMContext & getContext() const
All values hold a context through their type.
StringRef getName() const
Return a constant reference to the value's name.
void takeName(Value *V)
Transfer the name from V to this value.
static VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
static bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
This class represents zero extension of integer types.
#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.
Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > Tys={})
Look up the Function declaration of the intrinsic id in the Module M.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
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.
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()...
cst_pred_ty< is_zero_int > m_ZeroInt()
Match an integer 0 or a vector with all elements equal to 0.
OneUse_match< T > m_OneUse(const T &SubPattern)
BinaryOp_match< cst_pred_ty< is_zero_int >, ValTy, Instruction::Sub > m_Neg(const ValTy &V)
Matches a 'Neg' as 'sub 0, V'.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
match_combine_and< class_match< Constant >, match_unless< constantexpr_match > > m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
CastInst_match< OpTy, FPExtInst > m_FPExt(const OpTy &Op)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
VScaleVal_match m_VScale()
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.
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.
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.
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.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
bool replaceAllDbgUsesWith(Instruction &From, Value &To, Instruction &DomPoint, DominatorTree &DT)
Point debug users of From to To or salvage them.
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.
@ And
Bitwise or logical AND of integers.
void computeKnownBits(const Value *V, KnownBits &Known, const DataLayout &DL, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Determine which bits of V are known to be either zero or one and return them in the KnownZero/KnownOn...
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.
KnownFPClass computeKnownFPClass(const Value *V, const APInt &DemandedElts, FPClassTest InterestedClasses, unsigned Depth, const SimplifyQuery &SQ)
Determine which floating-point classes are valid for V, and return them in KnownFPClass bit sets.
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...
bool isKnownNonNegative(const Value *V, const SimplifyQuery &SQ, unsigned Depth=0)
Returns true if the give value is known to be non-negative.
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 const fltSemantics & IEEEsingle() LLVM_READNONE
static constexpr roundingMode rmNearestTiesToEven
static const fltSemantics & IEEEdouble() LLVM_READNONE
static const fltSemantics & IEEEhalf() LLVM_READNONE
static const fltSemantics & BFloat() LLVM_READNONE
static 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