24using namespace PatternMatch;
26#define DEBUG_TYPE "instcombine"
32 if (
Constant *
C = dyn_cast<Constant>(V)) {
41 unsigned Opc =
I->getOpcode();
43 case Instruction::Add:
44 case Instruction::Sub:
45 case Instruction::Mul:
46 case Instruction::And:
48 case Instruction::Xor:
49 case Instruction::AShr:
50 case Instruction::LShr:
51 case Instruction::Shl:
52 case Instruction::UDiv:
53 case Instruction::URem: {
59 case Instruction::Trunc:
60 case Instruction::ZExt:
61 case Instruction::SExt:
65 if (
I->getOperand(0)->getType() == Ty)
66 return I->getOperand(0);
71 Opc == Instruction::SExt);
73 case Instruction::Select: {
79 case Instruction::PHI: {
90 case Instruction::FPToUI:
91 case Instruction::FPToSI:
95 case Instruction::Call:
97 switch (II->getIntrinsicID()) {
100 case Intrinsic::vscale: {
119InstCombinerImpl::isEliminableCastPair(
const CastInst *CI1,
134 DstTy, SrcIntPtrTy, MidIntPtrTy,
139 if ((Res == Instruction::IntToPtr && SrcTy != DstIntPtrTy) ||
140 (Res == Instruction::PtrToInt && DstTy != SrcIntPtrTy))
151 if (
auto *SrcC = dyn_cast<Constant>(Src))
156 if (
auto *CSrc = dyn_cast<CastInst>(Src)) {
162 if (CSrc->hasOneUse())
168 if (
auto *Sel = dyn_cast<SelectInst>(Src)) {
174 auto *Cmp = dyn_cast<CmpInst>(Sel->getCondition());
175 if (!Cmp || Cmp->getOperand(0)->getType() != Sel->getType() ||
186 if (
auto *PN = dyn_cast<PHINode>(Src)) {
203 auto *SrcTy = dyn_cast<FixedVectorType>(
X->getType());
204 auto *DestTy = dyn_cast<FixedVectorType>(Ty);
205 if (SrcTy && DestTy &&
206 SrcTy->getNumElements() == DestTy->getNumElements() &&
219 if (isa<Constant>(V))
232 assert(!isa<Constant>(V) &&
"Constant should already be handled.");
233 if (!isa<Instruction>(V))
261 auto *
I = cast<Instruction>(V);
262 Type *OrigTy = V->getType();
263 switch (
I->getOpcode()) {
264 case Instruction::Add:
265 case Instruction::Sub:
266 case Instruction::Mul:
267 case Instruction::And:
268 case Instruction::Or:
269 case Instruction::Xor:
274 case Instruction::UDiv:
275 case Instruction::URem: {
288 case Instruction::Shl: {
299 case Instruction::LShr: {
317 case Instruction::AShr: {
327 unsigned ShiftedBits = OrigBitWidth -
BitWidth;
334 case Instruction::Trunc:
337 case Instruction::ZExt:
338 case Instruction::SExt:
342 case Instruction::Select: {
347 case Instruction::PHI: {
357 case Instruction::FPToUI:
358 case Instruction::FPToSI: {
362 Type *InputTy =
I->getOperand(0)->getType()->getScalarType();
366 I->getOpcode() == Instruction::FPToSI);
387 if (!TruncOp->
hasOneUse() || !isa<IntegerType>(DestType))
390 Value *VecInput =
nullptr;
395 !isa<VectorType>(VecInput->
getType()))
399 unsigned VecWidth = VecType->getPrimitiveSizeInBits();
401 unsigned ShiftAmount = ShiftVal ? ShiftVal->
getZExtValue() : 0;
403 if ((VecWidth % DestWidth != 0) || (ShiftAmount % DestWidth != 0))
408 unsigned NumVecElts = VecWidth / DestWidth;
409 if (VecType->getElementType() != DestType) {
414 unsigned Elt = ShiftAmount / DestWidth;
416 Elt = NumVecElts - 1 - Elt;
426 "Don't narrow to an illegal scalar type");
442 Value *ShVal0, *ShVal1, *ShAmt0, *ShAmt1;
449 if (Or0->
getOpcode() == BinaryOperator::LShr) {
455 Or1->
getOpcode() == BinaryOperator::LShr &&
456 "Illegal or(shift,shift) pair");
465 unsigned MaxShiftAmountWidth =
Log2_32(NarrowWidth);
466 APInt HiBitMask =
~APInt::getLowBitsSet(WideWidth, MaxShiftAmountWidth);
473 if (ShVal0 != ShVal1)
492 Value *ShAmt = matchShiftAmount(ShAmt0, ShAmt1, NarrowWidth);
495 ShAmt = matchShiftAmount(ShAmt1, ShAmt0, NarrowWidth);
515 if (ShVal0 != ShVal1)
517 Intrinsic::ID IID = IsFshl ? Intrinsic::fshl : Intrinsic::fshr;
530 if (!isa<VectorType>(SrcTy) && !shouldChangeType(SrcTy, DestTy))
540 case Instruction::And:
541 case Instruction::Or:
542 case Instruction::Xor:
543 case Instruction::Add:
544 case Instruction::Sub:
545 case Instruction::Mul: {
572 case Instruction::LShr:
573 case Instruction::AShr: {
578 unsigned MaxShiftAmt = SrcWidth - DestWidth;
582 APInt(SrcWidth, MaxShiftAmt)))) {
583 auto *OldShift = cast<Instruction>(Trunc.
getOperand(0));
584 bool IsExact = OldShift->isExact();
588 OldShift->getOpcode() == Instruction::AShr
599 if (
Instruction *NarrowOr = narrowFunnelShift(Trunc))
610 auto *Shuf = dyn_cast<ShuffleVectorInst>(Trunc.
getOperand(0));
611 if (Shuf && Shuf->hasOneUse() &&
match(Shuf->getOperand(1),
m_Undef()) &&
613 Shuf->getType() == Shuf->getOperand(0)->getType()) {
631 assert((Opcode == Instruction::Trunc || Opcode == Instruction::FPTrunc) &&
632 "Unexpected instruction for shrinking");
634 auto *InsElt = dyn_cast<InsertElementInst>(Trunc.
getOperand(0));
635 if (!InsElt || !InsElt->hasOneUse())
640 Value *VecOp = InsElt->getOperand(0);
641 Value *ScalarOp = InsElt->getOperand(1);
648 Value *NarrowOp =
Builder.CreateCast(Opcode, ScalarOp, DestScalarTy);
660 Type *DestTy = Trunc.
getType(), *SrcTy = Src->getType();
668 if ((DestTy->
isVectorTy() || shouldChangeType(SrcTy, DestTy)) &&
674 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
686 if (
auto *DestITy = dyn_cast<IntegerType>(DestTy)) {
687 if (DestWidth * 2 < SrcWidth) {
688 auto *NewDestTy = DestITy->getExtendedType();
689 if (shouldChangeType(SrcTy, NewDestTy) &&
692 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
693 " to reduce the width of operand of"
706 if (
SelectInst *Sel = dyn_cast<SelectInst>(Src))
715 if (DestWidth == 1) {
751 unsigned AWidth =
A->getType()->getScalarSizeInBits();
752 unsigned MaxShiftAmt = SrcWidth - std::max(DestWidth, AWidth);
753 auto *OldSh = cast<Instruction>(Src);
754 bool IsExact = OldSh->isExact();
759 APInt(SrcWidth, MaxShiftAmt)))) {
760 auto GetNewShAmt = [&](
unsigned Width) {
770 if (
A->getType() == DestTy) {
771 Constant *ShAmt = GetNewShAmt(DestWidth);
773 return IsExact ? BinaryOperator::CreateExactAShr(
A, ShAmt)
774 : BinaryOperator::CreateAShr(
A, ShAmt);
778 if (Src->hasOneUse()) {
779 Constant *ShAmt = GetNewShAmt(AWidth);
796 if (Src->hasOneUse() &&
797 (isa<VectorType>(SrcTy) || shouldChangeType(SrcTy, DestTy))) {
804 APInt Threshold =
APInt(
C->getType()->getScalarSizeInBits(), DestWidth);
827 auto *VecOpTy = cast<VectorType>(VecOp->
getType());
828 auto VecElts = VecOpTy->getElementCount();
831 if (SrcWidth % DestWidth == 0) {
832 uint64_t TruncRatio = SrcWidth / DestWidth;
833 uint64_t BitCastNumElts = VecElts.getKnownMinValue() * TruncRatio;
836 : VecOpIdx * TruncRatio;
837 assert(BitCastNumElts <= std::numeric_limits<uint32_t>::max() &&
850 unsigned AWidth =
A->getType()->getScalarSizeInBits();
851 if (AWidth == DestWidth && AWidth >
Log2_32(SrcWidth)) {
855 return BinaryOperator::CreateAdd(NarrowCtlz, WidthDiff);
865 if (
Log2_32(*MaxVScale) < DestWidth) {
893 Value *In = Cmp->getOperand(0);
895 In->getType()->getScalarSizeInBits() - 1);
897 if (In->getType() != Zext.
getType())
907 if (Op1CV->
isZero() && Cmp->isEquality() &&
908 (Cmp->getOperand(0)->getType() == Zext.
getType() ||
916 if (KnownZeroMask.isPowerOf2() &&
918 KnownZeroMask.logBase2() + 1)) {
919 uint32_t ShAmt = KnownZeroMask.logBase2();
920 Value *In = Cmp->getOperand(0);
925 In->getName() +
".lobit");
941 if (
Cmp->isEquality() && Zext.
getType() ==
Cmp->getOperand(0)->getType()) {
986 auto *
I = cast<Instruction>(V);
988 switch (
I->getOpcode()) {
989 case Instruction::ZExt:
990 case Instruction::SExt:
991 case Instruction::Trunc:
993 case Instruction::And:
994 case Instruction::Or:
995 case Instruction::Xor:
996 case Instruction::Add:
997 case Instruction::Sub:
998 case Instruction::Mul:
1003 if (BitsToClear == 0 && Tmp == 0)
1008 if (Tmp == 0 &&
I->isBitwiseLogicOp()) {
1011 unsigned VSize = V->getType()->getScalarSizeInBits();
1017 if (
I->getOpcode() == Instruction::And)
1026 case Instruction::Shl: {
1034 BitsToClear = ShiftAmt < BitsToClear ? BitsToClear - ShiftAmt : 0;
1039 case Instruction::LShr: {
1047 if (BitsToClear > V->getType()->getScalarSizeInBits())
1048 BitsToClear = V->getType()->getScalarSizeInBits();
1054 case Instruction::Select:
1063 case Instruction::PHI: {
1078 case Instruction::Call:
1082 if (II->getIntrinsicID() == Intrinsic::vscale)
1103 Type *SrcTy = Src->getType(), *DestTy = Zext.
getType();
1106 unsigned BitsToClear;
1107 if (shouldChangeType(SrcTy, DestTy) &&
1110 "Can't clear more bits than in SrcTy");
1114 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1115 " to avoid zero extend: "
1121 if (
auto *
SrcOp = dyn_cast<Instruction>(Src))
1122 if (
SrcOp->hasOneUse())
1132 DestBitSize - SrcBitsKept),
1139 return BinaryOperator::CreateAnd(Res,
C);
1145 if (
auto *CSrc = dyn_cast<TruncInst>(Src)) {
1150 Value *
A = CSrc->getOperand(0);
1151 unsigned SrcSize =
A->getType()->getScalarSizeInBits();
1152 unsigned MidSize = CSrc->getType()->getScalarSizeInBits();
1158 if (SrcSize < DstSize) {
1165 if (SrcSize == DstSize) {
1170 if (SrcSize > DstSize) {
1173 return BinaryOperator::CreateAnd(Trunc,
1179 if (
auto *Cmp = dyn_cast<ICmpInst>(Src))
1180 return transformZExtICmp(Cmp, Zext);
1186 X->getType() == DestTy)
1193 X->getType() == DestTy) {
1204 X->getType() == DestTy) {
1206 return BinaryOperator::CreateAnd(
X, ZextC);
1215 unsigned TypeWidth = Src->getType()->getScalarSizeInBits();
1216 if (
Log2_32(*MaxVScale) < TypeWidth) {
1230 Value *Op0 = Cmp->getOperand(0), *Op1 = Cmp->getOperand(1);
1234 if (!Op1->getType()->isIntOrIntVectorTy())
1242 if (In->getType() != Sext.
getType())
1248 if (
ConstantInt *Op1C = dyn_cast<ConstantInt>(Op1)) {
1252 if (Cmp->hasOneUse() &&
1253 Cmp->isEquality() && (Op1C->isZero() || Op1C->getValue().isPowerOf2())){
1257 if (KnownZeroMask.isPowerOf2()) {
1258 Value *In = Cmp->getOperand(0);
1261 if (!Op1C->isZero() && Op1C->getValue() != KnownZeroMask) {
1271 unsigned ShiftAmt = KnownZeroMask.countr_zero();
1285 unsigned ShiftAmt = KnownZeroMask.countl_zero();
1293 KnownZeroMask.getBitWidth() - 1),
"sext");
1315 "Can't sign extend type to a smaller type");
1321 auto *
I = cast<Instruction>(V);
1322 switch (
I->getOpcode()) {
1323 case Instruction::SExt:
1324 case Instruction::ZExt:
1325 case Instruction::Trunc:
1327 case Instruction::And:
1328 case Instruction::Or:
1329 case Instruction::Xor:
1330 case Instruction::Add:
1331 case Instruction::Sub:
1332 case Instruction::Mul:
1340 case Instruction::Select:
1344 case Instruction::PHI: {
1371 Type *SrcTy = Src->getType(), *DestTy = Sext.
getType();
1383 dbgs() <<
"ICE: EvaluateInDifferentType converting expression type"
1384 " to avoid sign extend: "
1404 unsigned XBitSize =
X->getType()->getScalarSizeInBits();
1409 if (Src->hasOneUse() &&
X->getType() == DestTy) {
1420 if (Src->hasOneUse() &&
1428 if (
auto *Cmp = dyn_cast<ICmpInst>(Src))
1429 return transformSExtICmp(Cmp, Sext);
1446 Constant *BA =
nullptr, *CA =
nullptr;
1459 return BinaryOperator::CreateAShr(
A, NewShAmt);
1467 Type *XTy =
X->getType();
1474 if (cast<BinaryOperator>(Src)->getOperand(0)->hasOneUse()) {
1486 if (
Log2_32(*MaxVScale) < (SrcBitSize - 1)) {
1526 auto *CV = dyn_cast<Constant>(V);
1527 auto *CVVTy = dyn_cast<FixedVectorType>(V->getType());
1531 Type *MinType =
nullptr;
1533 unsigned NumElts = CVVTy->getNumElements();
1537 for (
unsigned i = 0; i != NumElts; ++i) {
1538 if (isa<UndefValue>(CV->getAggregateElement(i)))
1541 auto *CFP = dyn_cast_or_null<ConstantFP>(CV->getAggregateElement(i));
1561 if (
auto *FPExt = dyn_cast<FPExtInst>(V))
1562 return FPExt->getOperand(0)->getType();
1567 if (
auto *CFP = dyn_cast<ConstantFP>(V))
1574 if (
auto *FPCExt = dyn_cast<ConstantExpr>(V))
1575 if (FPCExt->getOpcode() == Instruction::FPExt)
1576 return FPCExt->getOperand(0)->getType();
1583 return V->getType();
1590 assert((Opcode == CastInst::SIToFP || Opcode == CastInst::UIToFP) &&
1592 Value *Src =
I.getOperand(0);
1593 Type *SrcTy = Src->getType();
1594 Type *FPTy =
I.getType();
1595 bool IsSigned = Opcode == Instruction::SIToFP;
1601 if (SrcSize <= DestNumSigBits)
1610 int SrcNumSigBits =
F->getType()->getFPMantissaWidth();
1617 if (SrcNumSigBits > 0 && DestNumSigBits > 0 &&
1618 SrcNumSigBits <= DestNumSigBits)
1629 if (SigBits <= DestNumSigBits)
1647 auto *BO = dyn_cast<BinaryOperator>(FPT.
getOperand(0));
1648 if (BO && BO->hasOneUse()) {
1651 unsigned OpWidth = BO->getType()->getFPMantissaWidth();
1654 unsigned SrcWidth = std::max(LHSWidth, RHSWidth);
1656 switch (BO->getOpcode()) {
1658 case Instruction::FAdd:
1659 case Instruction::FSub:
1678 if (OpWidth >= 2*DstWidth+1 && DstWidth >= SrcWidth) {
1686 case Instruction::FMul:
1692 if (OpWidth >= LHSWidth + RHSWidth && DstWidth >= SrcWidth) {
1698 case Instruction::FDiv:
1705 if (OpWidth >= 2*DstWidth && DstWidth >= SrcWidth) {
1711 case Instruction::FRem: {
1716 if (SrcWidth == OpWidth)
1719 if (LHSWidth == SrcWidth) {
1736 if (
Op &&
Op->hasOneUse()) {
1739 if (isa<FPMathOperator>(
Op))
1752 X->getType() == Ty) {
1759 X->getType() == Ty) {
1767 if (
auto *II = dyn_cast<IntrinsicInst>(FPT.
getOperand(0))) {
1768 switch (II->getIntrinsicID()) {
1770 case Intrinsic::ceil:
1771 case Intrinsic::fabs:
1772 case Intrinsic::floor:
1773 case Intrinsic::nearbyint:
1774 case Intrinsic::rint:
1775 case Intrinsic::round:
1776 case Intrinsic::roundeven:
1777 case Intrinsic::trunc: {
1778 Value *Src = II->getArgOperand(0);
1779 if (!Src->hasOneUse())
1785 if (II->getIntrinsicID() != Intrinsic::fabs) {
1786 FPExtInst *FPExtSrc = dyn_cast<FPExtInst>(Src);
1787 if (!FPExtSrc || FPExtSrc->
getSrcTy() != Ty)
1795 II->getIntrinsicID(), Ty);
1797 II->getOperandBundlesAsDefs(OpBundles);
1810 if (isa<SIToFPInst>(Src) || isa<UIToFPInst>(Src)) {
1811 auto *FPCast = cast<CastInst>(Src);
1824 if (isa<SIToFPInst>(Src) || isa<UIToFPInst>(Src)) {
1825 auto *FPCast = cast<CastInst>(Src);
1841 auto *OpI = cast<CastInst>(FI.
getOperand(0));
1842 Value *
X = OpI->getOperand(0);
1843 Type *XType =
X->getType();
1845 bool IsOutputSigned = isa<FPToSIInst>(FI);
1860 if (OutputSize > OpI->getType()->getFPMantissaWidth())
1865 bool IsInputSigned = isa<SIToFPInst>(OpI);
1866 if (IsInputSigned && IsOutputSigned)
1873 assert(XType == DestType &&
"Unexpected types for int to FP to int casts");
1925 if (
GEP->hasAllZeroIndices() &&
1929 (!isa<AddrSpaceCastInst>(CI) ||
1930 GEP->getType() ==
GEP->getPointerOperandType())) {
1951 if (TySize != PtrSize) {
1958 if (
auto *
GEP = dyn_cast<GetElementPtrInst>(
SrcOp)) {
1963 if (
GEP->hasOneUse() &&
1964 isa<ConstantPointerNull>(
GEP->getPointerOperand())) {
2009 if (SrcTy->getElementType() != DestTy->getElementType()) {
2014 if (SrcTy->getElementType()->getPrimitiveSizeInBits() !=
2015 DestTy->getElementType()->getPrimitiveSizeInBits())
2020 cast<FixedVectorType>(SrcTy)->getNumElements());
2025 unsigned SrcElts = cast<FixedVectorType>(SrcTy)->getNumElements();
2026 unsigned DestElts = cast<FixedVectorType>(DestTy)->getNumElements();
2028 assert(SrcElts != DestElts &&
"Element counts should be different.");
2033 auto ShuffleMaskStorage = llvm::to_vector<16>(llvm::seq<int>(0, SrcElts));
2037 if (SrcElts > DestElts) {
2046 ShuffleMask = ShuffleMaskStorage;
2048 ShuffleMask = ShuffleMask.
take_back(DestElts);
2050 ShuffleMask = ShuffleMask.
take_front(DestElts);
2061 unsigned DeltaElts = DestElts - SrcElts;
2063 ShuffleMaskStorage.insert(ShuffleMaskStorage.begin(), DeltaElts, NullElt);
2065 ShuffleMaskStorage.append(DeltaElts, NullElt);
2066 ShuffleMask = ShuffleMaskStorage;
2094 "Shift should be a multiple of the element type size");
2097 if (isa<UndefValue>(V))
return true;
2101 if (V->getType() == VecEltTy) {
2103 if (
Constant *
C = dyn_cast<Constant>(V))
2104 if (
C->isNullValue())
2109 ElementIndex = Elements.size() - ElementIndex - 1;
2112 if (Elements[ElementIndex])
2115 Elements[ElementIndex] = V;
2119 if (
Constant *
C = dyn_cast<Constant>(V)) {
2132 if (!isa<IntegerType>(
C->getType()))
2134 C->getType()->getPrimitiveSizeInBits()));
2138 for (
unsigned i = 0; i != NumElts; ++i) {
2139 unsigned ShiftI = Shift+i*ElementSize;
2150 if (!V->hasOneUse())
return false;
2153 if (!
I)
return false;
2154 switch (
I->getOpcode()) {
2155 default:
return false;
2156 case Instruction::BitCast:
2157 if (
I->getOperand(0)->getType()->isVectorTy())
2161 case Instruction::ZExt:
2163 I->getOperand(0)->getType()->getPrimitiveSizeInBits(),
2168 case Instruction::Or:
2173 case Instruction::Shl: {
2175 ConstantInt *CI = dyn_cast<ConstantInt>(
I->getOperand(1));
2176 if (!CI)
return false;
2203 auto *DestVecTy = cast<FixedVectorType>(CI.
getType());
2208 DestVecTy->getElementType(),
2216 for (
unsigned i = 0, e = Elements.size(); i != e; ++i) {
2217 if (!Elements[i])
continue;
2249 auto *FixedVType = dyn_cast<FixedVectorType>(VecType);
2250 if (DestType->
isVectorTy() && FixedVType && FixedVType->getNumElements() == 1)
2277 if (
X->getType()->isFPOrFPVectorTy() &&
2278 Y->getType()->isIntOrIntVectorTy()) {
2284 if (
X->getType()->isIntOrIntVectorTy() &&
2285 Y->getType()->isFPOrFPVectorTy()) {
2300 X->getType() == DestTy && !isa<Constant>(
X)) {
2307 X->getType() == DestTy && !isa<Constant>(
X)) {
2339 if (
auto *CondVTy = dyn_cast<VectorType>(CondTy))
2341 CondVTy->getElementCount() !=
2342 cast<VectorType>(DestTy)->getElementCount())
2352 auto *Sel = cast<Instruction>(BitCast.
getOperand(0));
2355 !isa<Constant>(
X)) {
2357 Value *CastedVal =
Builder.CreateBitCast(FVal, DestTy);
2362 !isa<Constant>(
X)) {
2364 Value *CastedVal =
Builder.CreateBitCast(TVal, DestTy);
2374 if (!isa<StoreInst>(U))
2395 Type *SrcTy = Src->getType();
2407 while (!PhiWorklist.
empty()) {
2409 for (
Value *IncValue : OldPN->incoming_values()) {
2410 if (isa<Constant>(IncValue))
2413 if (
auto *
LI = dyn_cast<LoadInst>(IncValue)) {
2419 if (
Addr == &CI || isa<LoadInst>(
Addr))
2427 if (
LI->hasOneUse() &&
LI->isSimple())
2434 if (
auto *PNode = dyn_cast<PHINode>(IncValue)) {
2435 if (OldPhiNodes.
insert(PNode))
2440 auto *BCI = dyn_cast<BitCastInst>(IncValue);
2446 Type *TyA = BCI->getOperand(0)->getType();
2447 Type *TyB = BCI->getType();
2448 if (TyA != DestTy || TyB != SrcTy)
2455 for (
auto *OldPN : OldPhiNodes) {
2457 if (
auto *SI = dyn_cast<StoreInst>(V)) {
2458 if (!
SI->isSimple() ||
SI->getOperand(0) != OldPN)
2460 }
else if (
auto *BCI = dyn_cast<BitCastInst>(V)) {
2462 Type *TyB = BCI->getOperand(0)->getType();
2463 Type *TyA = BCI->getType();
2464 if (TyA != DestTy || TyB != SrcTy)
2466 }
else if (
auto *
PHI = dyn_cast<PHINode>(V)) {
2470 if (!OldPhiNodes.contains(
PHI))
2480 for (
auto *OldPN : OldPhiNodes) {
2483 NewPNodes[OldPN] = NewPN;
2487 for (
auto *OldPN : OldPhiNodes) {
2488 PHINode *NewPN = NewPNodes[OldPN];
2489 for (
unsigned j = 0, e = OldPN->getNumOperands(); j != e; ++j) {
2490 Value *
V = OldPN->getOperand(j);
2491 Value *NewV =
nullptr;
2492 if (
auto *
C = dyn_cast<Constant>(V)) {
2494 }
else if (
auto *
LI = dyn_cast<LoadInst>(V)) {
2503 }
else if (
auto *BCI = dyn_cast<BitCastInst>(V)) {
2504 NewV = BCI->getOperand(0);
2505 }
else if (
auto *PrevPN = dyn_cast<PHINode>(V)) {
2506 NewV = NewPNodes[PrevPN];
2509 NewPN->
addIncoming(NewV, OldPN->getIncomingBlock(j));
2523 for (
auto *OldPN : OldPhiNodes) {
2524 PHINode *NewPN = NewPNodes[OldPN];
2526 if (
auto *SI = dyn_cast<StoreInst>(V)) {
2527 assert(
SI->isSimple() &&
SI->getOperand(0) == OldPN);
2531 SI->setOperand(0, NewBC);
2535 else if (
auto *BCI = dyn_cast<BitCastInst>(V)) {
2536 Type *TyB = BCI->getOperand(0)->getType();
2537 Type *TyA = BCI->getType();
2538 assert(TyA == DestTy && TyB == SrcTy);
2544 }
else if (
auto *
PHI = dyn_cast<PHINode>(V)) {
2560 Type *SrcTy = Src->getType();
2565 if (DestTy == Src->getType())
2570 if (DestVTy->getNumElements() == 1 && SrcTy->
isX86_MMXTy()) {
2576 if (isa<IntegerType>(SrcTy)) {
2580 if (isa<TruncInst>(Src) || isa<ZExtInst>(Src)) {
2581 CastInst *SrcCast = cast<CastInst>(Src);
2583 if (isa<VectorType>(BCIn->getOperand(0)->getType()))
2585 BCIn->getOperand(0), cast<VectorType>(DestTy), *
this))
2598 if (SrcVTy->getNumElements() == 1) {
2611 if (
auto *InsElt = dyn_cast<InsertElementInst>(Src))
2612 return new BitCastInst(InsElt->getOperand(1), DestTy);
2622 Y->getType()->isIntegerTy() && isDesirableIntType(
BitWidth)) {
2625 IndexC = SrcVTy->getNumElements() - 1 - IndexC;
2631 unsigned EltWidth =
Y->getType()->getScalarSizeInBits();
2635 return BinaryOperator::CreateOr(AndX, ZextY);
2640 if (
auto *Shuf = dyn_cast<ShuffleVectorInst>(Src)) {
2643 Value *ShufOp0 = Shuf->getOperand(0);
2644 Value *ShufOp1 = Shuf->getOperand(1);
2645 auto ShufElts = cast<VectorType>(Shuf->getType())->getElementCount();
2646 auto SrcVecElts = cast<VectorType>(ShufOp0->
getType())->getElementCount();
2647 if (Shuf->hasOneUse() && DestTy->
isVectorTy() &&
2648 cast<VectorType>(DestTy)->getElementCount() == ShufElts &&
2649 ShufElts == SrcVecElts) {
2654 if (((Tmp = dyn_cast<BitCastInst>(ShufOp0)) &&
2656 ((Tmp = dyn_cast<BitCastInst>(ShufOp1)) &&
2670 if (DestTy->
isIntegerTy() && ShufElts.getKnownMinValue() % 2 == 0 &&
2671 Shuf->hasOneUse() && Shuf->isReverse()) {
2672 unsigned IntrinsicNum = 0;
2675 IntrinsicNum = Intrinsic::bswap;
2677 IntrinsicNum = Intrinsic::bitreverse;
2679 if (IntrinsicNum != 0) {
2680 assert(ShufOp0->
getType() == SrcTy &&
"Unexpected shuffle mask");
2691 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 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 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 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 Type * shrinkFPConstant(ConstantFP *CFP)
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 Type * getMinimumFPType(Value *V)
Find the minimum FP type we can safely truncate to.
static unsigned getTypeSizeIndex(unsigned Value, Type *Ty)
static Type * shrinkFPConstantVector(Value *V)
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.
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.
uint64_t getZExtValue() const
Get zero extended value.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
bool ult(const APInt &RHS) const
Unsigned less than comparison.
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.
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.
static BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), Instruction *InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static BinaryOperator * CreateFDivFMF(Value *V1, Value *V2, Instruction *FMFSource, const Twine &Name="")
BinaryOps getOpcode() const
static BinaryOperator * CreateFMulFMF(Value *V1, Value *V2, Instruction *FMFSource, 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="", Instruction *InsertBefore=nullptr)
This is the base class for all instructions that perform data casts.
Type * getSrcTy() const
Return the source type, as a convenience.
static CastInst * CreateIntegerCast(Value *S, Type *Ty, bool isSigned, const Twine &Name="", Instruction *InsertBefore=nullptr)
Create a ZExt, BitCast, or Trunc for int -> int casts.
static CastInst * CreateBitOrPointerCast(Value *S, Type *Ty, const Twine &Name="", Instruction *InsertBefore=nullptr)
Create a BitCast, a PtrToInt, or an IntToPTr cast instruction.
Instruction::CastOps getOpcode() const
Return the opcode of this CastInst.
static CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", Instruction *InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
static CastInst * CreateFPCast(Value *S, Type *Ty, const Twine &Name="", Instruction *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="", Instruction *InsertBefore=nullptr)
Create a Trunc or BitCast cast instruction.
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 * getZExt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getIntegerCast(Constant *C, Type *Ty, bool IsSigned)
Create a ZExt, Bitcast or Trunc for integer -> integer casts.
static Constant * getSExt(Constant *C, Type *Ty, bool OnlyIfReduced=false)
static Constant * getShl(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static Constant * getLShr(Constant *C1, Constant *C2, bool isExact=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 Constant * get(Type *Ty, uint64_t V, bool IsSigned=false)
If Ty is a vector type, return a Constant with a splat of the given value.
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.
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.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
This instruction compares its operands according to the predicate given to the constructor.
Value * CreateTrunc(Value *V, Type *DestTy, const Twine &Name="")
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 * CreateFPTrunc(Value *V, Type *DestTy, 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.
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.
Value * CreateZExt(Value *V, Type *DestTy, const Twine &Name="")
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 * 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 * CreateOr(Value *LHS, Value *RHS, const Twine &Name="")
Value * CreateCast(Instruction::CastOps Op, Value *V, Type *DestTy, const Twine &Name="")
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="")
static InsertElementInst * Create(Value *Vec, Value *NewElt, Value *Idx, const Twine &NameStr="", Instruction *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)
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.
Instruction * commonPointerCastTransforms(CastInst &CI)
Implement the transforms for cast of pointer (bitcast/ptrtoint)
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
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
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
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.
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()
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", Instruction *InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
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 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="", Instruction *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.
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.
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isPointerTy() const
True if this is an instance of PointerType.
bool isX86_MMXTy() const
Return true if this is X86 MMX.
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'.
static UnaryOperator * CreateFNegFMF(Value *Op, Instruction *FMFSource, const Twine &Name="", Instruction *InsertBefore=nullptr)
'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 bool isValidElementType(Type *ElemTy)
Return true if the specified type is valid as a element type.
static VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
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 * getDeclaration(Module *M, ID id, ArrayRef< Type * > Tys=std::nullopt)
Create or insert an LLVM Function declaration for an intrinsic, and return it.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
specific_intval< false > m_SpecificInt(APInt V)
Match a specific integer value or vector with all elements equal to the value.
class_match< BinaryOperator > m_BinOp()
Match an arbitrary binary operation and ignore it.
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
CastClass_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
CastClass_match< OpTy, Instruction::SExt > m_SExt(const OpTy &Op)
Matches SExt.
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.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
CastClass_match< OpTy, Instruction::ZExt > m_ZExt(const OpTy &Op)
Matches ZExt.
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.
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.
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.
CastClass_match< OpTy, Instruction::Trunc > m_Trunc(const OpTy &Op)
Matches Trunc.
CastClass_match< OpTy, Instruction::IntToPtr > m_IntToPtr(const OpTy &Op)
Matches IntToPtr.
CastClass_match< OpTy, Instruction::FPToSI > m_FPToSI(const OpTy &Op)
match_combine_or< CastClass_match< OpTy, Instruction::ZExt >, CastClass_match< OpTy, Instruction::SExt > > m_ZExtOrSExt(const OpTy &Op)
CastClass_match< OpTy, Instruction::FPToUI > m_FPToUI(const OpTy &Op)
CastClass_match< OpTy, Instruction::FPExt > m_FPExt(const OpTy &Op)
VScaleVal_match m_VScale()
specific_intval< true > m_SpecificIntAllowUndef(APInt V)
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)
FNeg_match< OpTy > m_FNeg(const OpTy &X)
Match 'fneg X' as 'fsub -0.0, X'.
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)
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.
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.
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.
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...
Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
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.
SelectPatternResult matchSelectPattern(Value *V, Value *&LHS, Value *&RHS, Instruction::CastOps *CastOp=nullptr, unsigned Depth=0)
Pattern match integer [SU]MIN, [SU]MAX and ABS idioms, returning the kind and providing the out param...
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.
@ 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 isKnownNonNegative(const Value *V, const DataLayout &DL, unsigned Depth=0, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr, const DominatorTree *DT=nullptr, bool UseInstrInfo=true)
Returns true if the give value is known to be non-negative.
bool all_equal(std::initializer_list< T > Values)
Returns true if all Values in the initializer lists are equal or the list.
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 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.