111#define DEBUG_TYPE "instcombine"
119 "Number of instruction combining iterations performed");
120STATISTIC(NumOneIteration,
"Number of functions with one iteration");
121STATISTIC(NumTwoIterations,
"Number of functions with two iterations");
122STATISTIC(NumThreeIterations,
"Number of functions with three iterations");
124 "Number of functions with four or more iterations");
128STATISTIC(NumDeadInst ,
"Number of dead inst eliminated");
134 "Controls which instructions are visited");
141 "instcombine-max-sink-users",
cl::init(32),
142 cl::desc(
"Maximum number of undroppable users for instruction sinking"));
146 cl::desc(
"Maximum array size considered when doing a combine"));
150 cl::desc(
"Maximum number of users to visit in alloc-site "
151 "removability analysis"));
163InstCombiner::IRBuilderInstCombineInserter::~IRBuilderInstCombineInserter() =
166void InstCombiner::IRBuilderInstCombineInserter::InsertHelper(
171 IC.AC.registerAssumption(Assume);
172 if (IC.AnnotationMetadataSource)
173 I->copyMetadata(*IC.AnnotationMetadataSource, LLVMContext::MD_annotation);
176std::optional<Instruction *>
179 if (
II.getCalledFunction()->isTargetIntrinsic()) {
180 return TTIForTargetIntrinsicsOnly.instCombineIntrinsic(*
this,
II);
187 bool &KnownBitsComputed) {
189 if (
II.getCalledFunction()->isTargetIntrinsic()) {
190 return TTIForTargetIntrinsicsOnly.simplifyDemandedUseBitsIntrinsic(
191 *
this,
II, DemandedMask,
Known, KnownBitsComputed);
202 if (
II.getCalledFunction()->isTargetIntrinsic()) {
203 return TTIForTargetIntrinsicsOnly.simplifyDemandedVectorEltsIntrinsic(
204 *
this,
II, DemandedElts, PoisonElts, PoisonElts2, PoisonElts3,
214 return TTIForTargetIntrinsicsOnly.isValidAddrSpaceCast(FromAS, ToAS);
224 Builder.SetInsertPoint(Inst);
228 if (Inst && !
GEP->hasAllConstantIndices() &&
229 !
GEP->getSourceElementType()->isIntegerTy(8)) {
231 *Inst, Builder.CreateGEP(Builder.getInt8Ty(),
GEP->getPointerOperand(),
249 Value *Sum =
nullptr;
250 Value *OneUseSum =
nullptr;
251 Value *OneUseBase =
nullptr;
258 IRBuilderBase::InsertPointGuard Guard(
Builder);
260 if (RewriteGEPs && Inst)
264 if (
Offset->getType() != IdxTy)
267 if (
GEP->hasOneUse()) {
272 OneUseBase =
GEP->getPointerOperand();
281 if (RewriteGEPs && Inst &&
282 Offset->getType()->isVectorTy() ==
GEP->getType()->isVectorTy() &&
283 !(
GEP->getSourceElementType()->isIntegerTy(8) &&
288 OneUseBase ? OneUseBase :
GEP->getPointerOperand(),
Offset,
"",
295 OneUseSum = OneUseBase =
nullptr;
299 Sum =
Add(Sum, OneUseSum);
310bool InstCombinerImpl::isDesirableIntType(
unsigned BitWidth)
const {
329bool InstCombinerImpl::shouldChangeType(
unsigned FromWidth,
330 unsigned ToWidth)
const {
331 bool FromLegal = FromWidth == 1 ||
DL.isLegalInteger(FromWidth);
332 bool ToLegal = ToWidth == 1 ||
DL.isLegalInteger(ToWidth);
336 if (ToWidth < FromWidth && isDesirableIntType(ToWidth))
341 if ((FromLegal || isDesirableIntType(FromWidth)) && !ToLegal)
346 if (!FromLegal && !ToLegal && ToWidth > FromWidth)
357bool InstCombinerImpl::shouldChangeType(
Type *From,
Type *To)
const {
365 return shouldChangeType(FromWidth, ToWidth);
375 if (!OBO || !OBO->hasNoSignedWrap())
378 const APInt *BVal, *CVal;
383 bool Overflow =
false;
384 switch (
I.getOpcode()) {
385 case Instruction::Add:
386 (void)BVal->
sadd_ov(*CVal, Overflow);
388 case Instruction::Sub:
389 (void)BVal->
ssub_ov(*CVal, Overflow);
391 case Instruction::Mul:
392 (void)BVal->
smul_ov(*CVal, Overflow);
403 return OBO && OBO->hasNoUnsignedWrap();
408 return OBO && OBO->hasNoSignedWrap();
418 if (!Cast || !Cast->hasOneUse())
422 auto CastOpcode = Cast->getOpcode();
423 if (CastOpcode != Instruction::ZExt)
432 if (!BinOp2 || !BinOp2->hasOneUse() || BinOp2->getOpcode() != AssocOpcode)
458 Cast->dropPoisonGeneratingFlags();
464Value *InstCombinerImpl::simplifyIntToPtrRoundTripCast(
Value *Val) {
466 if (IntToPtr &&
DL.getTypeSizeInBits(IntToPtr->getDestTy()) ==
467 DL.getTypeSizeInBits(IntToPtr->getSrcTy())) {
469 Type *CastTy = IntToPtr->getDestTy();
472 PtrToInt->getSrcTy()->getPointerAddressSpace() &&
473 DL.getTypeSizeInBits(PtrToInt->getSrcTy()) ==
474 DL.getTypeSizeInBits(PtrToInt->getDestTy()))
475 return PtrToInt->getOperand(0);
512 if (
I.isCommutative()) {
513 if (
auto Pair = matchSymmetricPair(
I.getOperand(0),
I.getOperand(1))) {
523 if (
I.isAssociative()) {
542 PDI->setIsDisjoint(
false);
547 I.setHasNoUnsignedWrap(IsNUW);
548 I.setHasNoSignedWrap(IsNSW);
571 I.dropPoisonGeneratingFlags();
579 if (
I.isAssociative() &&
I.isCommutative()) {
600 I.dropPoisonGeneratingFlags();
621 I.dropPoisonGeneratingFlags();
657 I.dropPoisonGeneratingFlags();
659 I.setHasNoUnsignedWrap(
true);
677 if (LOp == Instruction::And)
678 return ROp == Instruction::Or || ROp == Instruction::Xor;
681 if (LOp == Instruction::Or)
682 return ROp == Instruction::And;
686 if (LOp == Instruction::Mul)
687 return ROp == Instruction::Add || ROp == Instruction::Sub;
724 assert(
Op &&
"Expected a binary operator");
725 LHS =
Op->getOperand(0);
726 RHS =
Op->getOperand(1);
727 if (TopOpcode == Instruction::Add || TopOpcode == Instruction::Sub) {
732 Instruction::Shl, ConstantInt::get(
Op->getType(), 1),
C);
733 assert(
RHS &&
"Constant folding of immediate constants failed");
734 return Instruction::Mul;
739 if (OtherOp && OtherOp->
getOpcode() == Instruction::AShr &&
742 return Instruction::AShr;
745 return Op->getOpcode();
754 assert(
A &&
B &&
C &&
D &&
"All values must be provided");
757 Value *RetVal =
nullptr;
768 if (
A ==
C || (InnerCommutative &&
A ==
D)) {
777 if (!V && (
LHS->hasOneUse() ||
RHS->hasOneUse()))
778 V = Builder.CreateBinOp(TopLevelOpcode,
B,
D,
RHS->getName());
780 RetVal = Builder.CreateBinOp(InnerOpcode,
A, V);
788 if (
B ==
D || (InnerCommutative &&
B ==
C)) {
797 if (!V && (
LHS->hasOneUse() ||
RHS->hasOneUse()))
798 V = Builder.CreateBinOp(TopLevelOpcode,
A,
C,
LHS->getName());
800 RetVal = Builder.CreateBinOp(InnerOpcode, V,
B);
815 HasNSW =
I.hasNoSignedWrap();
816 HasNUW =
I.hasNoUnsignedWrap();
819 HasNSW &= LOBO->hasNoSignedWrap();
820 HasNUW &= LOBO->hasNoUnsignedWrap();
824 HasNSW &= ROBO->hasNoSignedWrap();
825 HasNUW &= ROBO->hasNoUnsignedWrap();
828 if (TopLevelOpcode == Instruction::Add && InnerOpcode == Instruction::Mul) {
856 unsigned Opc =
I->getOpcode();
857 unsigned ConstIdx = 1;
864 case Instruction::Sub:
867 case Instruction::ICmp:
874 case Instruction::Or:
878 case Instruction::Add:
893 Constant *BitWidthC = ConstantInt::get(Ty, Ty->getScalarSizeInBits());
899 if (!Cmp || !Cmp->isNullValue())
904 bool Consumes =
false;
908 assert(NotOp !=
nullptr &&
909 "Desync between isFreeToInvert and getFreelyInverted");
911 Value *CtpopOfNotOp =
Builder.CreateIntrinsic(Ty, Intrinsic::ctpop, NotOp);
918 case Instruction::Sub:
921 case Instruction::Or:
922 case Instruction::Add:
925 case Instruction::ICmp:
961 auto IsValidBinOpc = [](
unsigned Opc) {
965 case Instruction::And:
966 case Instruction::Or:
967 case Instruction::Xor:
968 case Instruction::Add:
977 auto IsCompletelyDistributable = [](
unsigned BinOpc1,
unsigned BinOpc2,
979 assert(ShOpc != Instruction::AShr);
980 return (BinOpc1 != Instruction::Add && BinOpc2 != Instruction::Add) ||
981 ShOpc == Instruction::Shl;
984 auto GetInvShift = [](
unsigned ShOpc) {
985 assert(ShOpc != Instruction::AShr);
986 return ShOpc == Instruction::LShr ? Instruction::Shl : Instruction::LShr;
989 auto CanDistributeBinops = [&](
unsigned BinOpc1,
unsigned BinOpc2,
993 if (BinOpc1 == Instruction::And)
998 if (!IsCompletelyDistributable(BinOpc1, BinOpc2, ShOpc))
1004 if (BinOpc2 == Instruction::And)
1015 auto MatchBinOp = [&](
unsigned ShOpnum) ->
Instruction * {
1017 Value *
X, *
Y, *ShiftedX, *Mask, *Shift;
1018 if (!
match(
I.getOperand(ShOpnum),
1022 I.getOperand(1 - ShOpnum),
1035 unsigned ShOpc = IY->getOpcode();
1036 if (ShOpc != IX->getOpcode())
1044 unsigned BinOpc = BO2->getOpcode();
1046 if (!IsValidBinOpc(
I.getOpcode()) || !IsValidBinOpc(BinOpc))
1049 if (ShOpc == Instruction::AShr) {
1063 if (BinOpc ==
I.getOpcode() &&
1064 IsCompletelyDistributable(
I.getOpcode(), BinOpc, ShOpc)) {
1079 if (!CanDistributeBinops(
I.getOpcode(), BinOpc, ShOpc, CMask, CShift))
1086 Value *NewBinOp1 =
Builder.CreateBinOp(
I.getOpcode(),
Y, NewBinOp2);
1093 return MatchBinOp(1);
1110 Value *LHS =
I.getOperand(0), *RHS =
I.getOperand(1);
1111 Value *
A, *CondVal, *TrueVal, *FalseVal;
1113 Constant *CastTrueVal, *CastFalseVal;
1115 auto MatchSelectAndCast = [&](
Value *CastOp,
Value *SelectOp) {
1124 if (MatchSelectAndCast(LHS, RHS))
1126 else if (MatchSelectAndCast(RHS, LHS))
1133 auto NewFoldedConst = [&](
bool IsTrueArm,
Value *V) {
1134 bool IsCastOpRHS = (CastOp == RHS);
1135 Value *CastVal = IsTrueArm ? CastFalseVal : CastTrueVal;
1137 return IsCastOpRHS ?
Builder.CreateBinOp(
Opc, V, CastVal)
1144 Value *NewTrueVal = NewFoldedConst(
false, TrueVal);
1146 NewFoldedConst(
true, FalseVal),
"",
nullptr,
SI);
1149 Value *NewTrueVal = NewFoldedConst(
true, TrueVal);
1151 NewFoldedConst(
false, FalseVal),
"",
nullptr,
SI);
1158 Value *LHS =
I.getOperand(0), *RHS =
I.getOperand(1);
1172 if (Op0 && Op1 && LHSOpcode == RHSOpcode)
1201 Value *LHS =
I.getOperand(0), *RHS =
I.getOperand(1);
1218 auto SQDistributive =
SQ.getWithInstruction(&
I).getWithoutUndef();
1226 C =
Builder.CreateBinOp(InnerOpcode, L, R);
1235 C =
Builder.CreateBinOp(TopLevelOpcode,
B,
C);
1244 C =
Builder.CreateBinOp(TopLevelOpcode,
A,
C);
1257 auto SQDistributive =
SQ.getWithInstruction(&
I).getWithoutUndef();
1265 A =
Builder.CreateBinOp(InnerOpcode, L, R);
1274 A =
Builder.CreateBinOp(TopLevelOpcode,
A,
C);
1283 A =
Builder.CreateBinOp(TopLevelOpcode,
A,
B);
1292static std::optional<std::pair<Value *, Value *>>
1294 if (
LHS->getParent() !=
RHS->getParent())
1295 return std::nullopt;
1297 if (
LHS->getNumIncomingValues() < 2)
1298 return std::nullopt;
1301 return std::nullopt;
1303 Value *L0 =
LHS->getIncomingValue(0);
1304 Value *R0 =
RHS->getIncomingValue(0);
1306 for (
unsigned I = 1,
E =
LHS->getNumIncomingValues();
I !=
E; ++
I) {
1310 if ((L0 == L1 && R0 == R1) || (L0 == R1 && R0 == L1))
1313 return std::nullopt;
1316 return std::optional(std::pair(L0, R0));
1319std::optional<std::pair<Value *, Value *>>
1324 return std::nullopt;
1326 case Instruction::PHI:
1328 case Instruction::Select: {
1334 return std::pair(TrueVal, FalseVal);
1335 return std::nullopt;
1337 case Instruction::Call: {
1341 if (LHSMinMax && RHSMinMax &&
1348 return std::pair(LHSMinMax->
getLHS(), LHSMinMax->
getRHS());
1349 return std::nullopt;
1352 return std::nullopt;
1362 if (!LHSIsSelect && !RHSIsSelect)
1370 FMF = FPOp->getFastMathFlags();
1371 Builder.setFastMathFlags(FMF);
1377 Value *
Cond, *True =
nullptr, *False =
nullptr;
1385 if (Opcode != Instruction::Add || (!True && !False) || (True && False))
1399 if (LHSIsSelect && RHSIsSelect &&
A ==
D) {
1405 if (LHS->hasOneUse() && RHS->hasOneUse()) {
1407 True =
Builder.CreateBinOp(Opcode,
B, E);
1408 else if (True && !False)
1409 False =
Builder.CreateBinOp(Opcode,
C,
F);
1411 }
else if (LHSIsSelect && LHS->hasOneUse()) {
1416 if (
Value *NewSel = foldAddNegate(
B,
C, RHS))
1418 }
else if (RHSIsSelect && RHS->hasOneUse()) {
1423 if (
Value *NewSel = foldAddNegate(E,
F, LHS))
1427 if (!True || !False)
1440 if (U == IgnoredUser)
1443 case Instruction::Select: {
1446 SI->swapProfMetadata();
1449 case Instruction::CondBr: {
1456 case Instruction::Xor:
1463 "canFreelyInvertAllUsersOf() ?");
1473 for (
unsigned Idx = 0, End = DbgVal->getNumVariableLocationOps();
1475 if (DbgVal->getVariableLocationOp(Idx) ==
I)
1476 DbgVal->setExpression(
1483Value *InstCombinerImpl::dyn_castNegVal(
Value *V)
const {
1493 if (
C->getType()->getElementType()->isIntegerTy())
1497 for (
unsigned i = 0, e = CV->getNumOperands(); i != e; ++i) {
1513 if (CV->getType()->isVectorTy() &&
1514 CV->getType()->getScalarType()->isIntegerTy() && CV->getSplatValue())
1527Instruction *InstCombinerImpl::foldFBinOpOfIntCastsFromSign(
1528 BinaryOperator &BO,
bool OpsFromSigned, std::array<Value *, 2> IntOps,
1532 Type *IntTy = IntOps[0]->getType();
1537 unsigned MaxRepresentableBits =
1542 unsigned NumUsedLeadingBits[2] = {IntSz, IntSz};
1546 auto IsNonZero = [&](
unsigned OpNo) ->
bool {
1547 if (OpsKnown[OpNo].hasKnownBits() &&
1548 OpsKnown[OpNo].getKnownBits(
SQ).isNonZero())
1553 auto IsNonNeg = [&](
unsigned OpNo) ->
bool {
1557 return OpsKnown[OpNo].getKnownBits(
SQ).isNonNegative();
1561 auto IsValidPromotion = [&](
unsigned OpNo) ->
bool {
1572 if (MaxRepresentableBits < IntSz) {
1582 NumUsedLeadingBits[OpNo] =
1583 IntSz - OpsKnown[OpNo].getKnownBits(
SQ).countMinLeadingZeros();
1591 if (MaxRepresentableBits < NumUsedLeadingBits[OpNo])
1594 return !OpsFromSigned || BO.
getOpcode() != Instruction::FMul ||
1599 if (Op1FpC !=
nullptr) {
1601 if (OpsFromSigned && BO.
getOpcode() == Instruction::FMul &&
1606 OpsFromSigned ? Instruction::FPToSI : Instruction::FPToUI, Op1FpC,
1608 if (Op1IntC ==
nullptr)
1611 : Instruction::UIToFP,
1612 Op1IntC, FPTy,
DL) != Op1FpC)
1616 IntOps[1] = Op1IntC;
1620 if (IntTy != IntOps[1]->
getType())
1623 if (Op1FpC ==
nullptr) {
1624 if (!IsValidPromotion(1))
1627 if (!IsValidPromotion(0))
1633 bool NeedsOverflowCheck =
true;
1636 unsigned OverflowMaxOutputBits = OpsFromSigned ? 2 : 1;
1637 unsigned OverflowMaxCurBits =
1638 std::max(NumUsedLeadingBits[0], NumUsedLeadingBits[1]);
1639 bool OutputSigned = OpsFromSigned;
1641 case Instruction::FAdd:
1642 IntOpc = Instruction::Add;
1643 OverflowMaxOutputBits += OverflowMaxCurBits;
1645 case Instruction::FSub:
1646 IntOpc = Instruction::Sub;
1647 OverflowMaxOutputBits += OverflowMaxCurBits;
1649 case Instruction::FMul:
1650 IntOpc = Instruction::Mul;
1651 OverflowMaxOutputBits += OverflowMaxCurBits * 2;
1657 if (OverflowMaxOutputBits < IntSz) {
1658 NeedsOverflowCheck =
false;
1661 if (IntOpc == Instruction::Sub)
1662 OutputSigned =
true;
1668 if (NeedsOverflowCheck &&
1669 !willNotOverflow(IntOpc, IntOps[0], IntOps[1], BO, OutputSigned))
1672 Value *IntBinOp =
Builder.CreateBinOp(IntOpc, IntOps[0], IntOps[1]);
1674 IntBO->setHasNoSignedWrap(OutputSigned);
1675 IntBO->setHasNoUnsignedWrap(!OutputSigned);
1678 return new SIToFPInst(IntBinOp, FPTy);
1679 return new UIToFPInst(IntBinOp, FPTy);
1693 std::array<Value *, 2> IntOps = {
nullptr,
nullptr};
1711 if (Instruction *R = foldFBinOpOfIntCastsFromSign(BO,
false,
1712 IntOps, Op1FpC, OpsKnown))
1714 return foldFBinOpOfIntCastsFromSign(BO,
true, IntOps,
1730 !
X->getType()->isIntOrIntVectorTy(1))
1738 return createSelectInstWithUnknownProfile(
X, TVal, FVal);
1747 V = IsTrueArm ?
SI->getTrueValue() :
SI->getFalseValue();
1748 }
else if (
match(
SI->getCondition(),
1755 V = IsTrueArm ? ConstantInt::get(
Op->getType(), 1)
1776 bool FoldWithMultiUse,
1777 bool SimplifyBothArms) {
1779 if (!
SI->hasOneUser() && !FoldWithMultiUse)
1782 Value *TV =
SI->getTrueValue();
1783 Value *FV =
SI->getFalseValue();
1786 if (
SI->getType()->isIntOrIntVectorTy(1))
1792 for (
Value *IntrinOp :
Op.operands())
1794 for (
Value *PhiOp : PN->operands())
1806 if (CI->hasOneUse()) {
1807 Value *Op0 = CI->getOperand(0), *Op1 = CI->getOperand(1);
1808 if (((TV == Op0 && FV == Op1) || (FV == Op0 && TV == Op1)) &&
1809 !CI->isCommutative())
1818 if (!NewTV && !NewFV)
1821 if (SimplifyBothArms && !(NewTV && NewFV))
1835 {LLVMContext::MD_prof, LLVMContext::MD_unpredictable,
1836 LLVMContext::MD_dbg});
1850 Ops.push_back(InValue);
1890 assert(
Op.isAssociative() &&
"The operation must be associative!");
1896 !
Op.hasOneUse() || !
SI->hasOneUse())
1899 Value *TV =
SI->getTrueValue();
1900 Value *FV =
SI->getFalseValue();
1918 if (!NewTV || !NewFV)
1921 Value *NewSI =
Builder.CreateSelect(
SI->getCondition(), NewTV, NewFV,
"",
SI);
1926 bool AllowMultipleUses) {
1928 if (NumPHIValues == 0)
1935 bool IdenticalUsers =
false;
1936 if (!AllowMultipleUses && !OneUse) {
1940 if (UI != &
I && !
I.isIdenticalTo(UI))
1944 IdenticalUsers =
true;
1974 bool SeenNonSimplifiedInVal =
false;
1975 for (
unsigned i = 0; i != NumPHIValues; ++i) {
1986 auto WillFold = [&]() {
1991 const APInt *Ignored;
2012 if (!OneUse && !IdenticalUsers)
2015 if (SeenNonSimplifiedInVal)
2017 SeenNonSimplifiedInVal =
true;
2025 if (!BI || !
DT.isReachableFromEntry(InBB))
2041 for (
auto OpIndex : OpsToMoveUseToIncomingBB) {
2052 U = U->DoPHITranslation(PN->
getParent(), OpBB);
2055 Clones.
insert({OpBB, Clone});
2060 NewPhiValues[OpIndex] = Clone;
2069 for (
unsigned i = 0; i != NumPHIValues; ++i)
2072 if (IdenticalUsers) {
2103 BO0->getOpcode() !=
Opc || BO1->getOpcode() !=
Opc ||
2104 !BO0->isAssociative() || !BO1->isAssociative() ||
2105 BO0->getParent() != BO1->getParent())
2109 "Expected commutative instructions!");
2113 Value *Start0, *Step0, *Start1, *Step1;
2120 "Expected PHIs with two incoming values!");
2127 if (!Init0 || !Init1 || !C0 || !C1)
2142 if (
Opc == Instruction::FAdd ||
Opc == Instruction::FMul) {
2146 NewBO->setFastMathFlags(Intersect);
2150 Flags.AllKnownNonZero =
false;
2151 Flags.mergeFlags(*BO0);
2152 Flags.mergeFlags(*BO1);
2153 Flags.mergeFlags(BO);
2154 Flags.applyFlags(*NewBO);
2156 NewBO->takeName(&BO);
2166 "Invalid incoming block!");
2167 NewPN->addIncoming(
Init, BB);
2168 }
else if (V == BO0) {
2173 "Invalid incoming block!");
2174 NewPN->addIncoming(NewBO, BB);
2180 <<
"\n with " << *PN1 <<
"\n " << *BO1
2207 if (!Phi0 || !Phi1 || !Phi0->hasOneUse() || !Phi1->hasOneUse() ||
2208 Phi0->getNumOperands() != Phi1->getNumOperands())
2212 if (BO.
getParent() != Phi0->getParent() ||
2229 auto CanFoldIncomingValuePair = [&](std::tuple<Use &, Use &>
T) {
2230 auto &Phi0Use = std::get<0>(
T);
2231 auto &Phi1Use = std::get<1>(
T);
2232 if (Phi0->getIncomingBlock(Phi0Use) != Phi1->getIncomingBlock(Phi1Use))
2234 Value *Phi0UseV = Phi0Use.get();
2235 Value *Phi1UseV = Phi1Use.get();
2238 else if (Phi1UseV ==
C)
2245 if (
all_of(
zip(Phi0->operands(), Phi1->operands()),
2246 CanFoldIncomingValuePair)) {
2249 assert(NewIncomingValues.
size() == Phi0->getNumOperands() &&
2250 "The number of collected incoming values should equal the number "
2251 "of the original PHINode operands!");
2252 for (
unsigned I = 0;
I < Phi0->getNumOperands();
I++)
2253 NewPhi->
addIncoming(NewIncomingValues[
I], Phi0->getIncomingBlock(
I));
2258 if (Phi0->getNumOperands() != 2 || Phi1->getNumOperands() != 2)
2265 ConstBB = Phi0->getIncomingBlock(0);
2266 OtherBB = Phi0->getIncomingBlock(1);
2268 ConstBB = Phi0->getIncomingBlock(1);
2269 OtherBB = Phi0->getIncomingBlock(0);
2280 if (!PredBlockBranch || !
DT.isReachableFromEntry(OtherBB))
2286 for (
auto BBIter = BO.
getParent()->begin(); &*BBIter != &BO; ++BBIter)
2297 Builder.SetInsertPoint(PredBlockBranch);
2299 Phi0->getIncomingValueForBlock(OtherBB),
2300 Phi1->getIncomingValueForBlock(OtherBB));
2302 NotFoldedNewBO->copyIRFlags(&BO);
2312 auto TryFoldOperand = [&](
unsigned OpIdx,
2331 if (
GEP.hasAllZeroIndices() && !Src.hasAllZeroIndices() &&
2362 for (
unsigned I = 0;
I < NumElts; ++
I) {
2364 if (ShMask[
I] >= 0) {
2365 int MaskElt = ShMask[
I];
2366 if (MaskElt >= (
int)NewCNumElts)
2369 Constant *NewCElt = NewVecC[MaskElt];
2379 NewVecC[MaskElt] = CElt;
2397template <Intrinsic::ID SpliceID>
2416 (
LHS->hasOneUse() ||
RHS->hasOneUse() ||
2418 return CreateBinOpSplice(
V1, V2,
Offset);
2430 return CreateBinOpSplice(
LHS, V2,
Offset);
2450 auto foldConstantsThroughSubVectorInsertSplat =
2451 [&](
Value *MaybeSubVector,
Value *MaybeSplat,
2456 !
match(MaybeSubVector,
2463 if (!SubVector || !Dest)
2465 auto *InsertVector =
2466 Builder.CreateInsertVector(Dest->
getType(), Dest, SubVector, Idx);
2474 if (
Instruction *Folded = foldConstantsThroughSubVectorInsertSplat(
2477 if (
Instruction *Folded = foldConstantsThroughSubVectorInsertSplat(
2487 M, Intrinsic::vector_reverse, V->getType());
2498 (LHS->hasOneUse() || RHS->hasOneUse() ||
2499 (LHS == RHS && LHS->hasNUses(2))))
2500 return createBinOpReverse(
V1, V2);
2504 return createBinOpReverse(
V1, RHS);
2508 return createBinOpReverse(LHS, V2);
2519 M, Intrinsic::experimental_vp_reverse, V->getType());
2529 (LHS->hasOneUse() || RHS->hasOneUse() ||
2530 (LHS == RHS && LHS->hasNUses(2))))
2531 return createBinOpVPReverse(
V1, V2, EVL);
2535 return createBinOpVPReverse(
V1, RHS, EVL);
2541 return createBinOpVPReverse(LHS, V2, EVL);
2569 (LHS->hasOneUse() || RHS->hasOneUse() || LHS == RHS)) {
2571 return createBinOpShuffle(
V1, V2, Mask);
2586 if (LShuf->isSelect() &&
2588 RShuf->isSelect() &&
2610 "Shuffle should not change scalar type");
2622 Value *NewLHS = ConstOp1 ?
V1 : NewC;
2623 Value *NewRHS = ConstOp1 ? NewC :
V1;
2624 return createBinOpShuffle(NewLHS, NewRHS, Mask);
2659 Value *NewSplat =
Builder.CreateShuffleVector(NewBO, NewMask);
2665 R->copyFastMathFlags(&Inst);
2669 NewInstBO->copyIRFlags(R);
2699 (Op0->
hasOneUse() || Op1->hasOneUse()))) {
2725 NewBinOp->setHasNoSignedWrap();
2727 NewBinOp->setHasNoUnsignedWrap();
2743 if (!
GEP.hasAllConstantIndices())
2759 Type *Ty =
GEP.getSourceElementType();
2760 Value *NewTrueC = Builder.CreateGEP(Ty, TrueC, IndexC,
"", NW);
2761 Value *NewFalseC = Builder.CreateGEP(Ty, FalseC, IndexC,
"", NW);
2771 if (
GEP.getNumIndices() != 1)
2781 unsigned IndexSizeInBits =
DL.getIndexTypeSizeInBits(PtrTy);
2792 if (NewOffset.
isZero() ||
2793 (Src->hasOneUse() &&
GEP.getOperand(1)->hasOneUse())) {
2795 if (
GEP.hasNoUnsignedWrap() &&
2815 if (!
GEP.hasAllConstantIndices())
2826 if (InnerGEP->hasAllConstantIndices())
2829 if (!InnerGEP->hasOneUse())
2832 Skipped.push_back(InnerGEP);
2838 if (Skipped.empty())
2843 if (!InnerGEP->hasOneUse())
2848 if (InnerGEP->getType() != Ty)
2854 !InnerGEP->accumulateConstantOffset(
DL,
Offset))
2857 IC.
replaceOperand(*Skipped.back(), 0, InnerGEP->getPointerOperand());
2859 SkippedGEP->setNoWrapFlags(NW);
2881 if (Src->getResultElementType() !=
GEP.getSourceElementType())
2887 if (Src->hasOneUse() &&
GEP.getNumIndices() == 1 &&
2888 Src->getNumIndices() == 1) {
2889 Value *SrcIdx = *Src->idx_begin();
2891 const APInt *ConstOffset, *TrueVal, *FalseVal;
2904 if (!
Select->hasOneUse())
2907 if (TrueVal->getBitWidth() != ConstOffset->
getBitWidth() ||
2908 FalseVal->getBitWidth() != ConstOffset->
getBitWidth())
2911 APInt NewTrueVal = *ConstOffset + *TrueVal;
2912 APInt NewFalseVal = *ConstOffset + *FalseVal;
2913 Constant *NewTrue = ConstantInt::get(
Select->getType(), NewTrueVal);
2914 Constant *NewFalse = ConstantInt::get(
Select->getType(), NewFalseVal);
2921 Builder.CreateGEP(
GEP.getResultElementType(),
2922 Src->getPointerOperand(),
2923 NewSelect,
"", Flags));
2928 bool EndsWithSequential =
false;
2931 EndsWithSequential =
I.isSequential();
2932 if (!EndsWithSequential)
2937 Value *SO1 = Src->getOperand(Src->getNumOperands() - 1);
2955 Indices.
append(Src->op_begin() + 1, Src->op_end() - 1);
2960 unsigned NumNonZeroIndices =
count_if(Indices, [](
Value *Idx) {
2962 return !
C || !
C->isNullValue();
2964 if (NumNonZeroIndices > 1)
2969 Src->getSourceElementType(), Src->getOperand(0), Indices,
"",
2975 bool &DoesConsume,
unsigned Depth) {
2994 if (!WillInvertAllUses)
3001 return Builder->CreateCmp(
I->getInversePredicate(),
I->getOperand(0),
3010 DoesConsume,
Depth))
3013 DoesConsume,
Depth))
3022 DoesConsume,
Depth))
3025 DoesConsume,
Depth))
3034 DoesConsume,
Depth))
3043 DoesConsume,
Depth))
3055 bool LocalDoesConsume = DoesConsume;
3057 LocalDoesConsume,
Depth))
3060 LocalDoesConsume,
Depth)) {
3061 DoesConsume = LocalDoesConsume;
3064 DoesConsume,
Depth);
3065 assert(NotB !=
nullptr &&
3066 "Unable to build inverted value for known freely invertable op");
3068 return Builder->CreateBinaryIntrinsic(
3070 return Builder->CreateSelect(
Cond, NotA, NotB,
"",
3078 bool LocalDoesConsume = DoesConsume;
3080 for (
Use &U : PN->operands()) {
3081 BasicBlock *IncomingBlock = PN->getIncomingBlock(U);
3085 if (NewIncomingVal ==
nullptr)
3088 if (NewIncomingVal == V)
3091 IncomingValues.
emplace_back(NewIncomingVal, IncomingBlock);
3094 DoesConsume = LocalDoesConsume;
3099 Builder->CreatePHI(PN->getType(), PN->getNumIncomingValues());
3100 for (
auto [Val, Pred] : IncomingValues)
3109 DoesConsume,
Depth))
3110 return Builder ?
Builder->CreateSExt(AV, V->getType()) : NonNull;
3116 DoesConsume,
Depth))
3117 return Builder ?
Builder->CreateTrunc(AV, V->getType()) : NonNull;
3125 bool IsLogical,
Value *
A,
3127 bool LocalDoesConsume = DoesConsume;
3129 LocalDoesConsume,
Depth))
3132 LocalDoesConsume,
Depth)) {
3134 LocalDoesConsume,
Depth);
3135 DoesConsume = LocalDoesConsume;
3137 return Builder ?
Builder->CreateLogicalOp(Opcode, NotA, NotB) : NonNull;
3138 return Builder ?
Builder->CreateBinOp(Opcode, NotA, NotB) : NonNull;
3145 return TryInvertAndOrUsingDeMorgan(Instruction::And,
false,
A,
3149 return TryInvertAndOrUsingDeMorgan(Instruction::Or,
false,
A,
3153 return TryInvertAndOrUsingDeMorgan(Instruction::And,
true,
A,
3157 return TryInvertAndOrUsingDeMorgan(Instruction::Or,
true,
A,
3166 Type *GEPEltType =
GEP.getSourceElementType();
3177 if (
GEP.getNumIndices() == 1 &&
3186 return PtrOpGep && PtrOpGep->hasAllConstantIndices() &&
3189 return match(V, m_APInt(C)) && !C->isZero();
3213 if (!Op2 || Op1->getNumOperands() != Op2->getNumOperands() ||
3214 Op1->getSourceElementType() != Op2->getSourceElementType())
3222 Type *CurTy =
nullptr;
3224 for (
unsigned J = 0,
F = Op1->getNumOperands(); J !=
F; ++J) {
3225 if (Op1->getOperand(J)->getType() != Op2->getOperand(J)->getType())
3228 if (Op1->getOperand(J) != Op2->getOperand(J)) {
3237 assert(CurTy &&
"No current type?");
3257 CurTy = Op1->getSourceElementType();
3265 NW &= Op2->getNoWrapFlags();
3275 NewGEP->setNoWrapFlags(NW);
3287 Builder.SetInsertPoint(PN);
3288 NewPN = Builder.CreatePHI(Op1->getOperand(DI)->getType(),
3296 NewGEP->setOperand(DI, NewPN);
3299 NewGEP->insertBefore(*
GEP.getParent(),
GEP.getParent()->getFirstInsertionPt());
3306 Type *GEPType =
GEP.getType();
3307 Type *GEPEltType =
GEP.getSourceElementType();
3310 SQ.getWithInstruction(&
GEP)))
3317 auto VWidth = GEPFVTy->getNumElements();
3318 APInt PoisonElts(VWidth, 0);
3330 bool MadeChange =
false;
3334 Type *NewScalarIndexTy =
3335 DL.getIndexType(
GEP.getPointerOperandType()->getScalarType());
3344 Type *IndexTy = (*I)->getType();
3345 Type *NewIndexType =
3354 if (EltTy->
isSized() &&
DL.getTypeAllocSize(EltTy).isZero())
3360 if (IndexTy != NewIndexType) {
3366 if (
GEP.hasNoUnsignedWrap() &&
GEP.hasNoUnsignedSignedWrap())
3367 *
I =
Builder.CreateZExt(*
I, NewIndexType,
"",
true);
3369 *
I =
Builder.CreateSExt(*
I, NewIndexType);
3371 *
I =
Builder.CreateTrunc(*
I, NewIndexType,
"",
GEP.hasNoUnsignedWrap(),
3372 GEP.hasNoUnsignedSignedWrap());
3381 if (!GEPEltType->
isIntegerTy(8) &&
GEP.hasAllConstantIndices()) {
3386 GEP.getNoWrapFlags()));
3398 if (LastIdx && LastIdx->isNullValue() && !LastIdx->getType()->isVectorTy()) {
3406 if (FirstIdx && FirstIdx->isNullValue() &&
3407 !FirstIdx->getType()->isVectorTy()) {
3413 GEP.getPointerOperand(),
3415 GEP.getNoWrapFlags()));
3422 return Op->getType()->isVectorTy() && getSplatValue(Op);
3425 for (
auto &
Op :
GEP.operands()) {
3426 if (
Op->getType()->isVectorTy())
3436 GEP.getNoWrapFlags());
3439 Res =
Builder.CreateVectorSplat(EC, Res);
3444 bool SeenNonZeroIndex =
false;
3445 for (
auto [IdxNum, Idx] :
enumerate(Indices)) {
3448 if (
C &&
C->isNullValue() && IdxNum == 0)
3451 if (!SeenNonZeroIndex) {
3452 SeenNonZeroIndex =
true;
3459 Builder.CreateGEP(GEPEltType, PtrOp, FrontIndices,
3460 GEP.getName() +
".split",
GEP.getNoWrapFlags());
3467 BackIndices,
GEP.getNoWrapFlags());
3471 auto IsCanonicalType = [](
Type *Ty) {
3473 Ty = AT->getElementType();
3474 return Ty->isIntegerTy(8);
3476 if (Indices.
size() == 1 && !IsCanonicalType(GEPEltType)) {
3477 TypeSize Scale =
DL.getTypeAllocSize(GEPEltType);
3482 GEP.setSourceElementType(NewElemTy);
3483 GEP.setResultElementType(NewElemTy);
3498 if (
GEP.getNumIndices() == 1) {
3499 unsigned AS =
GEP.getPointerAddressSpace();
3500 if (
GEP.getOperand(1)->getType()->getScalarSizeInBits() ==
3501 DL.getIndexSizeInBits(AS)) {
3502 uint64_t TyAllocSize =
DL.getTypeAllocSize(GEPEltType).getFixedValue();
3504 if (TyAllocSize == 1) {
3513 GEPType ==
Y->getType()) {
3514 bool HasNonAddressBits =
3515 DL.getAddressSizeInBits(AS) !=
DL.getPointerSizeInBits(AS);
3522 }
else if (
auto *ExactIns =
3526 if (ExactIns->isExact()) {
3534 GEP.getPointerOperand(), V,
3535 GEP.getNoWrapFlags());
3538 if (ExactIns->isExact() && ExactIns->hasOneUse()) {
3544 std::optional<APInt> NewC;
3564 if (NewC.has_value()) {
3567 ConstantInt::get(V->getType(), *NewC),
true);
3569 GEP.getPointerOperand(), NewOp,
3570 GEP.getNoWrapFlags());
3580 if (!
GEP.isInBounds()) {
3583 APInt BasePtrOffset(IdxWidth, 0);
3584 Value *UnderlyingPtrOp =
3588 DL, CanBeNull,
nullptr);
3591 if (!CanBeNull && DerefBytes != 0) {
3592 if (
GEP.accumulateConstantOffset(
DL, BasePtrOffset) &&
3594 APInt AllocSize(IdxWidth, DerefBytes);
3595 if (BasePtrOffset.
ule(AllocSize)) {
3597 GEP.getSourceElementType(), PtrOp, Indices,
GEP.getName());
3604 if (
GEP.hasNoUnsignedSignedWrap() && !
GEP.hasNoUnsignedWrap() &&
3606 return isKnownNonNegative(Idx, SQ.getWithInstruction(&GEP));
3614 if (
GEP.getNumIndices() == 1) {
3617 auto GetPreservedNoWrapFlags = [&](
bool AddIsNUW) {
3620 if (
GEP.hasNoUnsignedWrap() && AddIsNUW)
3621 return GEP.getNoWrapFlags();
3637 Builder.CreateGEP(
GEP.getSourceElementType(),
GEP.getPointerOperand(),
3640 Builder.CreateGEP(
GEP.getSourceElementType(),
3641 NewPtr, Idx2,
"", NWFlags));
3652 bool NUW =
match(
GEP.getOperand(1),
3655 auto *NewPtr =
Builder.CreateGEP(
3656 GEP.getSourceElementType(),
GEP.getPointerOperand(),
3657 Builder.CreateSExt(Idx1,
GEP.getOperand(1)->getType()),
"", NWFlags);
3660 Builder.CreateGEP(
GEP.getSourceElementType(), NewPtr,
3661 Builder.CreateSExt(
C,
GEP.getOperand(1)->getType()),
3670 if (Indices.
size() == 1 &&
GEP.isInBounds() &&
GEP.hasNoUnsignedWrap()) {
3684 GEP.getNoWrapFlags());
3720 return Dest && Dest->Ptr == UsedV;
3723static std::optional<ModRefInfo>
3736 return std::nullopt;
3737 switch (
I->getOpcode()) {
3740 return std::nullopt;
3742 case Instruction::AddrSpaceCast:
3743 case Instruction::BitCast:
3744 case Instruction::GetElementPtr:
3749 case Instruction::ICmp: {
3755 return std::nullopt;
3756 unsigned OtherIndex = (ICI->
getOperand(0) == PI) ? 1 : 0;
3758 return std::nullopt;
3763 auto AlignmentAndSizeKnownValid = [](
CallBase *CB) {
3767 const APInt *Alignment;
3769 return match(CB->getArgOperand(0),
m_APInt(Alignment)) &&
3771 Alignment->isPowerOf2() &&
Size->urem(*Alignment).isZero();
3775 TLI.
getLibFunc(*CB->getCalledFunction()) == LibFunc_aligned_alloc &&
3776 TLI.
has(LibFunc_aligned_alloc) && !AlignmentAndSizeKnownValid(CB))
3777 return std::nullopt;
3782 case Instruction::Call:
3785 switch (
II->getIntrinsicID()) {
3787 return std::nullopt;
3789 case Intrinsic::memmove:
3790 case Intrinsic::memcpy:
3791 case Intrinsic::memset: {
3793 if (
MI->isVolatile())
3794 return std::nullopt;
3800 return std::nullopt;
3804 case Intrinsic::assume:
3805 case Intrinsic::invariant_start:
3806 case Intrinsic::invariant_end:
3807 case Intrinsic::lifetime_start:
3808 case Intrinsic::lifetime_end:
3809 case Intrinsic::objectsize:
3812 case Intrinsic::launder_invariant_group:
3813 case Intrinsic::strip_invariant_group:
3840 return std::nullopt;
3842 case Instruction::Store: {
3844 if (
SI->isVolatile() ||
SI->getPointerOperand() != PI)
3845 return std::nullopt;
3847 return std::nullopt;
3853 case Instruction::Load: {
3856 return std::nullopt;
3858 return std::nullopt;
3866 }
while (!Worklist.
empty());
3894 std::unique_ptr<DIBuilder> DIB;
3902 bool KnowInitUndef =
false;
3903 bool KnowInitZero =
false;
3908 KnowInitUndef =
true;
3909 else if (
Init->isNullValue())
3910 KnowInitZero =
true;
3914 auto &
F = *
MI.getFunction();
3915 if (
F.hasFnAttribute(Attribute::SanitizeMemory) ||
3916 F.hasFnAttribute(Attribute::SanitizeAddress))
3917 KnowInitUndef =
false;
3932 if (
II->getIntrinsicID() == Intrinsic::objectsize) {
3935 II,
DL, &
TLI,
AA,
true, &InsertedInstructions);
3936 for (
Instruction *Inserted : InsertedInstructions)
3944 if (KnowInitZero &&
isRefSet(*Removable)) {
3947 auto *M =
Builder.CreateMemSet(
3950 MTI->getLength(), MTI->getDestAlign());
3951 M->copyMetadata(*MTI);
3964 *
C, ConstantInt::get(
C->getType(),
C->isFalseWhenEqual()));
3966 for (
auto *DVR : DVRs)
3967 if (DVR->isAddressOfVariable())
3974 assert(KnowInitZero || KnowInitUndef);
3989 F,
II->getNormalDest(),
II->getUnwindDest(), {},
"",
II->getParent());
3990 NewII->setDebugLoc(
II->getDebugLoc());
4018 for (
auto *DVR : DVRs)
4019 if (DVR->isAddressOfVariable() || DVR->getExpression()->startsWithDeref())
4020 DVR->eraseFromParent();
4066 if (FreeInstrBB->
size() != 2) {
4068 if (&Inst == &FI || &Inst == FreeInstrBBTerminator ||
4072 if (!Cast || !Cast->isNoopCast(
DL))
4093 "Broken CFG: missing edge from predecessor to successor");
4098 if (&Instr == FreeInstrBBTerminator)
4103 "Only the branch instruction should remain");
4114 Attrs = Attrs.removeParamAttribute(FI.
getContext(), 0, Attribute::NonNull);
4115 Attribute Dereferenceable = Attrs.getParamAttr(0, Attribute::Dereferenceable);
4116 if (Dereferenceable.
isValid()) {
4118 Attrs = Attrs.removeParamAttribute(FI.
getContext(), 0,
4119 Attribute::Dereferenceable);
4120 Attrs = Attrs.addDereferenceableOrNullParamAttr(FI.
getContext(), 0, Bytes);
4158 if (
TLI.getLibFunc(FI) == LibFunc_free &&
TLI.has(LibFunc_free))
4174 bool HasDereferenceable =
4175 F->getAttributes().getRetDereferenceableBytes() > 0;
4176 if (
F->hasRetAttribute(Attribute::NonNull) ||
4177 (HasDereferenceable &&
4179 if (
Value *V = simplifyNonNullOperand(RetVal, HasDereferenceable))
4184 if (!AttributeFuncs::isNoFPClassCompatibleType(RetTy))
4187 FPClassTest ReturnClass =
F->getAttributes().getRetNoFPClass();
4188 if (ReturnClass ==
fcNone)
4193 SQ.getWithInstruction(&RI)))
4210 if (Prev->isEHPad())
4240 if (BBI != FirstInstr)
4242 }
while (BBI != FirstInstr && BBI->isDebugOrPseudoInst());
4256 if (!
DeadEdges.insert({From, To}).second)
4261 for (
Use &U : PN.incoming_values())
4278 std::next(
I->getReverseIterator())))) {
4279 if (!Inst.use_empty() && !Inst.getType()->isTokenTy()) {
4283 if (Inst.isEHPad() || Inst.getType()->isTokenTy())
4286 Inst.dropDbgRecords();
4308 return DeadEdges.contains({Pred, BB}) ||
DT.dominates(BB, Pred);
4321 if (Succ == LiveSucc)
4357 assert(Weights.
size() == 2 &&
"Unexpected number of branch weights!");
4404 if (
DT.dominates(Edge0, U)) {
4410 if (
DT.dominates(Edge1, U)) {
4417 DC.registerBranch(&BI);
4427 unsigned CstOpIdx = IsTrueArm ? 1 : 2;
4432 BasicBlock *CstBB =
SI.findCaseValue(
C)->getCaseSuccessor();
4433 if (CstBB !=
SI.getDefaultDest())
4446 for (
auto Case :
SI.cases())
4447 if (!CR.
contains(Case.getCaseValue()->getValue()))
4456 const APInt *CondOpC;
4459 auto MaybeInvertible = [&](
Value *
Cond) -> InvertFn {
4462 return [](
const APInt &Case,
const APInt &
C) {
return Case -
C; };
4466 return [](
const APInt &Case,
const APInt &
C) {
return C - Case; };
4472 return [](
const APInt &Case,
const APInt &
C) {
return Case ^
C; };
4479 if (
auto InvertFn = MaybeInvertible(
Cond); InvertFn &&
Cond->hasOneUse()) {
4480 for (
auto &Case :
SI.cases()) {
4481 const APInt &New = InvertFn(Case.getCaseValue()->getValue(), *CondOpC);
4482 Case.setValue(ConstantInt::get(
SI.getContext(), New));
4490 all_of(
SI.cases(), [&](
const auto &Case) {
4491 return Case.getCaseValue()->getValue().countr_zero() >= ShiftAmt;
4497 Value *NewCond = Op0;
4504 for (
auto Case :
SI.cases()) {
4505 const APInt &CaseVal = Case.getCaseValue()->getValue();
4507 : CaseVal.
lshr(ShiftAmt);
4508 Case.setValue(ConstantInt::get(
SI.getContext(), ShiftedCase));
4520 if (
all_of(
SI.cases(), [&](
const auto &Case) {
4521 const APInt &CaseVal = Case.getCaseValue()->getValue();
4522 return IsZExt ? CaseVal.isIntN(NewWidth)
4523 : CaseVal.isSignedIntN(NewWidth);
4525 for (
auto &Case :
SI.cases()) {
4526 APInt TruncatedCase = Case.getCaseValue()->getValue().
trunc(NewWidth);
4527 Case.setValue(ConstantInt::get(
SI.getContext(), TruncatedCase));
4544 unsigned LeadingKnownZeros =
Known.countMinLeadingZeros();
4545 unsigned LeadingKnownOnes =
Known.countMinLeadingOnes();
4549 for (
const auto &
C :
SI.cases()) {
4551 std::min(LeadingKnownZeros,
C.getCaseValue()->getValue().countl_zero());
4553 std::min(LeadingKnownOnes,
C.getCaseValue()->getValue().countl_one());
4556 unsigned NewWidth =
Known.getBitWidth() - std::max(LeadingKnownZeros, LeadingKnownOnes);
4562 if (NewWidth > 0 && NewWidth <
Known.getBitWidth() &&
4563 shouldChangeType(
Known.getBitWidth(), NewWidth)) {
4568 for (
auto Case :
SI.cases()) {
4569 APInt TruncatedCase = Case.getCaseValue()->getValue().
trunc(NewWidth);
4570 Case.setValue(ConstantInt::get(
SI.getContext(), TruncatedCase));
4581 SI.findCaseValue(CI)->getCaseSuccessor());
4595 const APInt *
C =
nullptr;
4597 if (*EV.
idx_begin() == 0 && (OvID == Intrinsic::smul_with_overflow ||
4598 OvID == Intrinsic::umul_with_overflow)) {
4603 if (
C->isPowerOf2()) {
4604 return BinaryOperator::CreateShl(
4606 ConstantInt::get(WO->getLHS()->getType(),
C->logBase2()));
4614 if (!WO->hasOneUse())
4628 assert(*EV.
idx_begin() == 1 &&
"Unexpected extract index for overflow inst");
4631 if (OvID == Intrinsic::usub_with_overflow)
4636 if (OvID == Intrinsic::smul_with_overflow &&
4637 WO->getLHS()->getType()->isIntOrIntVectorTy(1))
4638 return BinaryOperator::CreateAnd(WO->getLHS(), WO->getRHS());
4641 if (OvID == Intrinsic::umul_with_overflow && WO->getLHS() == WO->getRHS()) {
4642 unsigned BitWidth = WO->getLHS()->getType()->getScalarSizeInBits();
4645 return new ICmpInst(
4647 ConstantInt::get(WO->getLHS()->getType(),
4658 WO->getBinaryOp(), *
C, WO->getNoWrapKind());
4663 auto *OpTy = WO->getRHS()->getType();
4664 auto *NewLHS = WO->getLHS();
4666 NewLHS =
Builder.CreateAdd(NewLHS, ConstantInt::get(OpTy,
Offset));
4668 ConstantInt::get(OpTy, NewRHSC));
4685 const APFloat *ConstVal =
nullptr;
4686 Value *VarOp =
nullptr;
4687 bool ConstIsTrue =
false;
4694 ConstIsTrue =
false;
4699 Builder.SetInsertPoint(&EV);
4705 Value *NewEV = Builder.CreateExtractValue(NewFrexp, 0,
"mantissa");
4710 Constant *ConstantMantissa = ConstantFP::get(TrueVal->getType(), Mantissa);
4712 Value *NewSel = Builder.CreateSelectFMF(
4713 Cond, ConstIsTrue ? ConstantMantissa : NewEV,
4714 ConstIsTrue ? NewEV : ConstantMantissa,
SelectInst,
"select.frexp");
4724 SQ.getWithInstruction(&EV)))
4738 const unsigned *exti, *exte, *insi, *inse;
4739 for (exti = EV.
idx_begin(), insi =
IV->idx_begin(),
4740 exte = EV.
idx_end(), inse =
IV->idx_end();
4741 exti != exte && insi != inse;
4755 if (exti == exte && insi == inse)
4770 Value *NewEV =
Builder.CreateExtractValue(
IV->getAggregateOperand(),
4788 if (
Instruction *R = foldExtractOfOverflowIntrinsic(EV))
4794 STy && STy->isScalableTy())
4802 if (L->isSimple() && L->hasOneUse()) {
4807 for (
unsigned Idx : EV.
indices())
4814 L->getPointerOperand(), Indices);
4848 switch (Personality) {
4892 bool MakeNewInstruction =
false;
4898 bool isLastClause = i + 1 == e;
4906 if (AlreadyCaught.
insert(TypeInfo).second) {
4911 MakeNewInstruction =
true;
4918 MakeNewInstruction =
true;
4919 CleanupFlag =
false;
4938 if (!NumTypeInfos) {
4941 MakeNewInstruction =
true;
4942 CleanupFlag =
false;
4946 bool MakeNewFilter =
false;
4950 assert(NumTypeInfos > 0 &&
"Should have handled empty filter already!");
4956 MakeNewInstruction =
true;
4963 if (NumTypeInfos > 1)
4964 MakeNewFilter =
true;
4968 NewFilterElts.
reserve(NumTypeInfos);
4973 bool SawCatchAll =
false;
4974 for (
unsigned j = 0; j != NumTypeInfos; ++j) {
5002 if (SeenInFilter.
insert(TypeInfo).second)
5008 MakeNewInstruction =
true;
5013 if (NewFilterElts.
size() < NumTypeInfos)
5014 MakeNewFilter =
true;
5016 if (MakeNewFilter) {
5018 NewFilterElts.
size());
5020 MakeNewInstruction =
true;
5029 if (MakeNewFilter && !NewFilterElts.
size()) {
5030 assert(MakeNewInstruction &&
"New filter but not a new instruction!");
5031 CleanupFlag =
false;
5042 for (
unsigned i = 0, e = NewClauses.
size(); i + 1 < e; ) {
5045 for (j = i; j != e; ++j)
5052 for (
unsigned k = i; k + 1 < j; ++k)
5056 std::stable_sort(NewClauses.
begin() + i, NewClauses.
begin() + j,
5058 MakeNewInstruction =
true;
5077 for (
unsigned i = 0; i + 1 < NewClauses.
size(); ++i) {
5087 for (
unsigned j = NewClauses.
size() - 1; j != i; --j) {
5088 Value *LFilter = NewClauses[j];
5099 NewClauses.
erase(J);
5100 MakeNewInstruction =
true;
5104 unsigned LElts = LTy->getNumElements();
5114 assert(FElts <= LElts &&
"Should have handled this case earlier!");
5116 NewClauses.
erase(J);
5117 MakeNewInstruction =
true;
5126 assert(FElts > 0 &&
"Should have eliminated the empty filter earlier!");
5127 for (
unsigned l = 0; l != LElts; ++l)
5130 NewClauses.
erase(J);
5131 MakeNewInstruction =
true;
5142 bool AllFound =
true;
5143 for (
unsigned f = 0; f != FElts; ++f) {
5146 for (
unsigned l = 0; l != LElts; ++l) {
5148 if (LTypeInfo == FTypeInfo) {
5158 NewClauses.
erase(J);
5159 MakeNewInstruction =
true;
5167 if (MakeNewInstruction) {
5175 if (NewClauses.empty())
5184 assert(!CleanupFlag &&
"Adding a cleanup, not removing one?!");
5214 if (!OrigOpInst || !OrigOpInst->hasOneUse() ||
isa<PHINode>(OrigOp))
5228 Value *MaybePoisonOperand =
nullptr;
5229 for (
Value *V : OrigOpInst->operands()) {
5232 (MaybePoisonOperand && MaybePoisonOperand == V))
5234 if (!MaybePoisonOperand)
5235 MaybePoisonOperand = V;
5240 OrigOpInst->dropPoisonGeneratingAnnotations();
5243 if (!MaybePoisonOperand)
5246 Builder.SetInsertPoint(OrigOpInst);
5247 Value *FrozenMaybePoisonOperand =
Builder.CreateFreeze(
5248 MaybePoisonOperand, MaybePoisonOperand->
getName() +
".fr");
5250 OrigOpInst->replaceUsesOfWith(MaybePoisonOperand, FrozenMaybePoisonOperand);
5261 Use *StartU =
nullptr;
5279 Value *StartV = StartU->get();
5291 if (!Visited.
insert(V).second)
5294 if (Visited.
size() > 32)
5311 I->dropPoisonGeneratingAnnotations();
5313 if (StartNeedsFreeze) {
5341 MoveBefore = *MoveBeforeOpt;
5345 MoveBefore.setHeadBit(
false);
5348 if (&FI != &*MoveBefore) {
5349 FI.
moveBefore(*MoveBefore->getParent(), MoveBefore);
5354 Changed |=
Op->replaceUsesWithIf(&FI, [&](
Use &U) ->
bool {
5355 if (!
DT.dominates(&FI, U))
5358 Users.push_back(U.getUser());
5362 for (
auto *U :
Users) {
5376 for (
auto *U : V->users()) {
5386 Value *Op0 =
I.getOperand(0);
5416 auto getUndefReplacement = [&](
Type *Ty) {
5417 auto pickCommonConstantFromPHI = [](
PHINode &PN) ->
Value * {
5421 for (
Value *V : PN.incoming_values()) {
5432 if (BestValue && BestValue !=
C)
5441 Value *BestValue =
nullptr;
5442 for (
auto *U :
I.users()) {
5443 Value *V = NullValue;
5452 if (
Value *MaybeV = pickCommonConstantFromPHI(*
PHI))
5458 else if (BestValue != V)
5459 BestValue = NullValue;
5461 assert(BestValue &&
"Must have at least one use");
5462 assert(BestValue != &
I &&
"Cannot replace with itself");
5476 Type *Ty =
C->getType();
5489 !
C->containsConstantExpression()) {
5490 if (
Constant *Repl = getFreezeVectorReplacement(
C))
5524 for (
const User *U :
I.users()) {
5525 if (Visited.
insert(U).second)
5530 while (!AllocaUsers.
empty()) {
5553 if (
isa<PHINode>(
I) ||
I->isEHPad() ||
I->mayThrow() || !
I->willReturn() ||
5570 if (CI->isConvergent())
5576 if (
I->mayWriteToMemory()) {
5583 if (
I->mayReadFromMemory() &&
5584 !
I->hasMetadata(LLVMContext::MD_invariant_load)) {
5591 E =
I->getParent()->end();
5597 I->dropDroppableUses([&](
const Use *U) {
5599 if (
I &&
I->getParent() != DestBlock) {
5609 I->moveBefore(*DestBlock, InsertPos);
5619 if (!DbgVariableRecords.
empty())
5621 DbgVariableRecords);
5644 for (
auto &DVR : DbgVariableRecords)
5645 if (DVR->getParent() != DestBlock)
5646 DbgVariableRecordsToSalvage.
push_back(DVR);
5652 if (DVR->getParent() == SrcBlock)
5653 DbgVariableRecordsToSink.
push_back(DVR);
5660 return B->getInstruction()->comesBefore(
A->getInstruction());
5667 using InstVarPair = std::pair<const Instruction *, DebugVariable>;
5669 if (DbgVariableRecordsToSink.
size() > 1) {
5675 DVR->getDebugLoc()->getInlinedAt());
5676 CountMap[std::make_pair(DVR->getInstruction(), DbgUserVariable)] += 1;
5682 for (
auto It : CountMap) {
5683 if (It.second > 1) {
5684 FilterOutMap[It.first] =
nullptr;
5685 DupSet.
insert(It.first.first);
5696 DVR.getDebugLoc()->getInlinedAt());
5698 FilterOutMap.
find(std::make_pair(Inst, DbgUserVariable));
5699 if (FilterIt == FilterOutMap.
end())
5701 if (FilterIt->second !=
nullptr)
5703 FilterIt->second = &DVR;
5718 DVR->getDebugLoc()->getInlinedAt());
5722 if (!FilterOutMap.
empty()) {
5723 InstVarPair IVP = std::make_pair(DVR->getInstruction(), DbgUserVariable);
5724 auto It = FilterOutMap.
find(IVP);
5727 if (It != FilterOutMap.
end() && It->second != DVR)
5731 if (!SunkVariables.
insert(DbgUserVariable).second)
5734 if (DVR->isDbgAssign())
5742 if (DVRClones.
empty())
5756 assert(InsertPos.getHeadBit());
5758 InsertPos->getParent()->insertDbgRecordBefore(DVRClone, InsertPos);
5782 if (
I ==
nullptr)
continue;
5797 auto getOptionalSinkBlockForInst =
5798 [
this](
Instruction *
I) -> std::optional<BasicBlock *> {
5800 return std::nullopt;
5804 unsigned NumUsers = 0;
5806 for (
Use &U :
I->uses()) {
5812 if (
II->getIntrinsicID() != Intrinsic::assume ||
5813 !
II->getOperandBundle(
"dereferenceable"))
5818 return std::nullopt;
5824 UserBB = PN->getIncomingBlock(U);
5828 if (UserParent && UserParent != UserBB)
5829 return std::nullopt;
5830 UserParent = UserBB;
5834 if (NumUsers == 0) {
5837 if (UserParent == BB || !
DT.isReachableFromEntry(UserParent))
5838 return std::nullopt;
5850 return std::nullopt;
5852 assert(
DT.dominates(BB, UserParent) &&
"Dominance relation broken?");
5860 return std::nullopt;
5865 auto OptBB = getOptionalSinkBlockForInst(
I);
5867 auto *UserParent = *OptBB;
5875 for (
Use &U :
I->operands())
5883 Builder.SetCurrentDebugLocation(
I->getDebugLoc());
5898 <<
" New = " << *Result <<
'\n');
5903 Result->setDebugLoc(Result->getDebugLoc().orElse(
I->getDebugLoc()));
5905 Result->copyMetadata(*
I, LLVMContext::MD_annotation);
5907 I->replaceAllUsesWith(Result);
5910 Result->takeName(
I);
5925 Result->insertInto(InstParent, InsertPos);
5929 AC.registerAssumption(Assume);
5932 Worklist.pushUsersToWorkList(*Result);
5938 <<
" New = " << *
I <<
'\n');
5970 if (!
I->hasMetadataOtherThanDebugLoc())
5973 auto Track = [](
Metadata *ScopeList,
auto &Container) {
5975 if (!MDScopeList || !Container.insert(MDScopeList).second)
5977 for (
const auto &
MDOperand : MDScopeList->operands())
5979 Container.insert(MDScope);
5982 Track(
I->getMetadata(LLVMContext::MD_alias_scope), UsedAliasScopesAndLists);
5983 Track(
I->getMetadata(LLVMContext::MD_noalias), UsedNoAliasScopesAndLists);
5992 "llvm.experimental.noalias.scope.decl in use ?");
5995 "llvm.experimental.noalias.scope should refer to a single scope");
5998 return !UsedAliasScopesAndLists.contains(MD) ||
5999 !UsedNoAliasScopesAndLists.contains(MD);
6023 if (Succ != LiveSucc &&
DeadEdges.insert({BB, Succ}).second)
6024 for (
PHINode &PN : Succ->phis())
6025 for (
Use &U : PN.incoming_values())
6034 return DeadEdges.contains({Pred, BB}) ||
DT.dominates(BB, Pred);
6036 HandleOnlyLiveSuccessor(BB,
nullptr);
6043 if (!Inst.use_empty() &&
6044 (Inst.getNumOperands() == 0 ||
isa<Constant>(Inst.getOperand(0))))
6048 Inst.replaceAllUsesWith(
C);
6051 Inst.eraseFromParent();
6057 for (
Use &U : Inst.operands()) {
6062 Constant *&FoldRes = FoldedConstants[
C];
6068 <<
"\n Old = " << *
C
6069 <<
"\n New = " << *FoldRes <<
'\n');
6078 if (!Inst.isDebugOrPseudoInst()) {
6079 InstrsForInstructionWorklist.
push_back(&Inst);
6080 SeenAliasScopes.
analyse(&Inst);
6090 HandleOnlyLiveSuccessor(BB,
nullptr);
6094 bool CondVal =
Cond->getZExtValue();
6095 HandleOnlyLiveSuccessor(BB, BI->getSuccessor(!CondVal));
6101 HandleOnlyLiveSuccessor(BB,
nullptr);
6105 HandleOnlyLiveSuccessor(BB,
6106 SI->findCaseValue(
Cond)->getCaseSuccessor());
6116 if (LiveBlocks.
count(&BB))
6119 unsigned NumDeadInstInBB;
6123 NumDeadInst += NumDeadInstInBB;
6140 Inst->eraseFromParent();
6155 Visited[BB->getNumber()] =
true;
6157 if (Visited[Succ->getNumber()])
6169 auto &
DL =
F.getDataLayout();
6171 !
F.hasFnAttribute(
"instcombine-no-verify-fixpoint");
6177 bool MadeIRChange =
false;
6182 unsigned Iteration = 0;
6186 <<
" on " <<
F.getName()
6187 <<
" reached; stopping without verifying fixpoint\n");
6192 ++NumWorklistIterations;
6193 LLVM_DEBUG(
dbgs() <<
"\n\nINSTCOMBINE ITERATION #" << Iteration <<
" on "
6194 <<
F.getName() <<
"\n");
6196 InstCombinerImpl IC(Worklist,
F,
AA, AC, TLI,
TTI, DT, ORE, BFI, BPI, PSI,
6200 MadeChangeInThisIteration |= IC.
run();
6201 if (!MadeChangeInThisIteration)
6204 MadeIRChange =
true;
6207 "Instruction Combining on " +
Twine(
F.getName()) +
6210 "Use 'instcombine<no-verify-fixpoint>' or function attribute "
6211 "'instcombine-no-verify-fixpoint' to suppress this error.");
6217 else if (Iteration == 2)
6219 else if (Iteration == 3)
6220 ++NumThreeIterations;
6222 ++NumFourOrMoreIterations;
6224 return MadeIRChange;
6231 static_cast<PassInfoMixin<InstCombinePass> *
>(
this)->
printPipeline(
6232 OS, MapClassName2PassName);
6234 OS <<
"max-iterations=" << Options.MaxIterations <<
";";
6235 OS << (Options.VerifyFixpoint ?
"" :
"no-") <<
"verify-fixpoint";
6239char InstCombinePass::ID = 0;
6245 if (LRT.shouldSkip(&ID))
6258 auto *BFI = (PSI && PSI->hasProfileSummary()) ?
6263 BFI, BPI, PSI, Options)) {
6265 LRT.update(&ID,
false);
6271 LRT.update(&ID,
true);
6311 if (
auto *WrapperPass =
6313 BPI = &WrapperPass->getBPI();
6324 "Combine redundant instructions",
false,
false)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
This is the interface for LLVM's primary stateless and local alias analysis.
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file provides an implementation of debug counters.
#define DEBUG_COUNTER(VARNAME, COUNTERNAME, DESC)
This file defines the DenseMap class.
static bool isSigned(unsigned Opcode)
This is the interface for a simple mod/ref and alias analysis over globals.
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This header defines various interfaces for pass management in LLVM.
This defines the Use class.
iv Induction Variable Users
static bool rightDistributesOverLeft(Instruction::BinaryOps LOp, bool HasNUW, bool HasNSW, Intrinsic::ID ROp)
Return whether "(X ROp Y) LOp Z" is always equal to "(X LOp Z) ROp (Y LOp Z)".
static bool leftDistributesOverRight(Instruction::BinaryOps LOp, bool HasNUW, bool HasNSW, Intrinsic::ID ROp)
Return whether "X LOp (Y ROp Z)" is always equal to "(X LOp Y) ROp (X LOp Z)".
This file provides internal interfaces used to implement the InstCombine.
This file provides the primary interface to the instcombine pass.
static Value * simplifySwitchOnSelectUsingRanges(SwitchInst &SI, SelectInst *Select, bool IsTrueArm)
static bool isUsedWithinShuffleVector(Value *V)
static bool isNeverEqualToUnescapedAlloc(Value *V, const TargetLibraryInfo &TLI, Instruction *AI)
static Constant * constantFoldBinOpWithSplat(unsigned Opcode, Constant *Vector, Constant *Splat, bool SplatLHS, const DataLayout &DL)
static bool shorter_filter(const Value *LHS, const Value *RHS)
static Instruction * combineConstantOffsets(GetElementPtrInst &GEP, InstCombinerImpl &IC)
Combine constant offsets separated by variable offsets.
static Instruction * foldSelectGEP(GetElementPtrInst &GEP, InstCombiner::BuilderTy &Builder)
Thread a GEP operation with constant indices through the constant true/false arms of a select.
static bool shouldMergeGEPs(GEPOperator &GEP, GEPOperator &Src)
static cl::opt< unsigned > MaxArraySize("instcombine-maxarray-size", cl::init(1024), cl::desc("Maximum array size considered when doing a combine"))
static Instruction * foldSpliceBinOp(BinaryOperator &Inst, InstCombiner::BuilderTy &Builder)
static cl::opt< unsigned > ShouldLowerDbgDeclare("instcombine-lower-dbg-declare", cl::Hidden, cl::init(true))
static bool hasNoSignedWrap(BinaryOperator &I)
static bool simplifyAssocCastAssoc(BinaryOperator *BinOp1, InstCombinerImpl &IC)
Combine constant operands of associative operations either before or after a cast to eliminate one of...
static bool combineInstructionsOverFunction(Function &F, InstructionWorklist &Worklist, AliasAnalysis *AA, AssumptionCache &AC, TargetLibraryInfo &TLI, TargetTransformInfo &TTI, DominatorTree &DT, OptimizationRemarkEmitter &ORE, BlockFrequencyInfo *BFI, BranchProbabilityInfo *BPI, ProfileSummaryInfo *PSI, const InstCombineOptions &Opts)
static Value * simplifyInstructionWithPHI(Instruction &I, PHINode *PN, Value *InValue, BasicBlock *InBB, const DataLayout &DL, const SimplifyQuery SQ)
static bool shouldCanonicalizeGEPToPtrAdd(GetElementPtrInst &GEP)
Return true if we should canonicalize the gep to an i8 ptradd.
static Value * getIdentityValue(Instruction::BinaryOps Opcode, Value *V)
This function returns identity value for given opcode, which can be used to factor patterns like (X *...
static Value * foldFrexpOfSelect(ExtractValueInst &EV, IntrinsicInst *FrexpCall, SelectInst *SelectInst, InstCombiner::BuilderTy &Builder)
static std::optional< std::pair< Value *, Value * > > matchSymmetricPhiNodesPair(PHINode *LHS, PHINode *RHS)
static std::optional< ModRefInfo > isAllocSiteRemovable(Instruction *AI, SmallVectorImpl< Instruction * > &Users, const TargetLibraryInfo &TLI, bool KnowInit)
static cl::opt< unsigned > MaxAllocSiteRemovableUsers("instcombine-max-allocsite-removable-users", cl::Hidden, cl::init(2048), cl::desc("Maximum number of users to visit in alloc-site " "removability analysis"))
static Value * foldOperationIntoSelectOperand(Instruction &I, SelectInst *SI, Value *NewOp, InstCombiner &IC)
static Instruction * canonicalizeGEPOfConstGEPI8(GetElementPtrInst &GEP, GEPOperator *Src, InstCombinerImpl &IC)
static Instruction * tryToMoveFreeBeforeNullTest(CallInst &FI, const DataLayout &DL)
Move the call to free before a NULL test.
static Value * simplifyOperationIntoSelectOperand(Instruction &I, SelectInst *SI, bool IsTrueArm)
static Value * tryFactorization(BinaryOperator &I, const SimplifyQuery &SQ, InstCombiner::BuilderTy &Builder, Instruction::BinaryOps InnerOpcode, Value *A, Value *B, Value *C, Value *D)
This tries to simplify binary operations by factorizing out common terms (e.
static bool isRemovableWrite(CallBase &CB, Value *UsedV, const TargetLibraryInfo &TLI)
Given a call CB which uses an address UsedV, return true if we can prove the call's only possible eff...
static Instruction::BinaryOps getBinOpsForFactorization(Instruction::BinaryOps TopOpcode, BinaryOperator *Op, Value *&LHS, Value *&RHS, BinaryOperator *OtherOp)
This function predicates factorization using distributive laws.
static bool hasNoUnsignedWrap(BinaryOperator &I)
static bool SoleWriteToDeadLocal(Instruction *I, TargetLibraryInfo &TLI)
Check for case where the call writes to an otherwise dead alloca.
static cl::opt< unsigned > MaxSinkNumUsers("instcombine-max-sink-users", cl::init(32), cl::desc("Maximum number of undroppable users for instruction sinking"))
static Instruction * foldGEPOfPhi(GetElementPtrInst &GEP, PHINode *PN, IRBuilderBase &Builder)
static bool isCatchAll(EHPersonality Personality, Constant *TypeInfo)
Return 'true' if the given typeinfo will match anything.
static cl::opt< bool > EnableCodeSinking("instcombine-code-sinking", cl::desc("Enable code sinking"), cl::init(true))
static bool maintainNoSignedWrap(BinaryOperator &I, Value *B, Value *C)
static GEPNoWrapFlags getMergedGEPNoWrapFlags(GEPOperator &GEP1, GEPOperator &GEP2)
Determine nowrap flags for (gep (gep p, x), y) to (gep p, (x + y)) transform.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
uint64_t IntrinsicInst * II
static bool IsSelect(unsigned Opcode, bool CheckOnlyCC=false)
Check if the opcode is a SELECT or SELECT_CC variant.
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
const SmallVectorImpl< MachineOperand > & Cond
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static SymbolRef::Type getType(const Symbol *Sym)
static const uint32_t IV[8]
bool isNoAliasScopeDeclDead(Instruction *Inst)
void analyse(Instruction *I)
A manager for alias analyses.
A wrapper pass to provide the legacy pass manager access to a suitably prepared AAResults object.
static constexpr roundingMode rmNearestTiesToEven
static LLVM_ABI unsigned int semanticsPrecision(const fltSemantics &)
Class for arbitrary precision integers.
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
static LLVM_ABI void udivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
Dual division/remainder interface.
bool isMinSignedValue() const
Determine if this is the smallest signed value.
static LLVM_ABI void sdivrem(const APInt &LHS, const APInt &RHS, APInt &Quotient, APInt &Remainder)
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
bool isAllOnes() const
Determine if all bits are set. This is true for zero-width values.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
unsigned getBitWidth() const
Return the number of bits in the APInt.
LLVM_ABI APInt sadd_ov(const APInt &RHS, bool &Overflow) const
APInt ashr(unsigned ShiftAmt) const
Arithmetic right-shift function.
LLVM_ABI APInt smul_ov(const APInt &RHS, bool &Overflow) const
bool isMaxSignedValue() const
Determine if this is the largest signed value.
bool isNonNegative() const
Determine if this APInt Value is non-negative (>= 0)
bool ule(const APInt &RHS) const
Unsigned less or equal comparison.
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
LLVM_ABI APInt ssub_ov(const APInt &RHS, bool &Overflow) const
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
LLVM_ABI void setPreservesCFG()
This function should be called by the pass, iff they do not:
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.
size_t size() const
Get the array size.
Class to represent array types.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
uint64_t getNumElements() const
Type * getElementType() const
A function analysis which provides an AssumptionCache.
An immutable pass that tracks lazily created AssumptionCache objects.
A cache of @llvm.assume calls within a function.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
LLVM_ABI uint64_t getDereferenceableBytes() const
Returns the number of dereferenceable bytes from the dereferenceable attribute.
bool isValid() const
Return true if the attribute is any kind of attribute.
LLVM Basic Block Representation.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
LLVM_ABI const_iterator getFirstInsertionPt() const
Returns an iterator to the first instruction in this block that is suitable for inserting a non-PHI i...
LLVM_ABI InstListType::const_iterator getFirstNonPHIIt() const
Returns an iterator to the first instruction in this block that is not a PHINode instruction.
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
const Instruction & front() const
LLVM_ABI const BasicBlock * getUniquePredecessor() const
Return the predecessor of this block if it has a unique predecessor block.
InstListType::iterator iterator
Instruction iterators...
LLVM_ABI const_iterator getFirstNonPHIOrDbgOrAlloca() const
Returns an iterator to the first instruction in this block that is not a PHINode, a debug intrinsic,...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
static LLVM_ABI BinaryOperator * CreateNeg(Value *Op, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Helper functions to construct and inspect unary operations (NEG and NOT) via binary operators SUB and...
BinaryOps getOpcode() const
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
static BinaryOperator * CreateNUW(BinaryOps Opc, Value *V1, Value *V2, const Twine &Name="")
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Analysis pass which computes BranchProbabilityInfo.
Analysis providing branch probability information.
Represents analyses that only rely on functions' control flow.
Base class for all callable instructions (InvokeInst and CallInst) Holds everything related to callin...
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
void setAttributes(AttributeList A)
Set the attributes for this call.
bool doesNotThrow() const
Determine if the call cannot unwind.
Value * getArgOperand(unsigned i) const
AttributeList getAttributes() const
Return the attributes for this call.
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)
static LLVM_ABI CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
@ ICMP_UGT
unsigned greater than
@ ICMP_ULT
unsigned less than
Predicate getSwappedPredicate() const
For example, EQ->EQ, SLE->SGE, ULT->UGT, OEQ->OEQ, ULE->UGE, OLT->OGT, etc.
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
Conditional Branch instruction.
LLVM_ABI void swapSuccessors()
Swap the successors of this branch instruction.
Value * getCondition() const
BasicBlock * getSuccessor(unsigned i) const
ConstantArray - Constant Array Declarations.
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
A vector constant whose element type is a simple 1/2/4/8-byte integer or float/double,...
static LLVM_ABI Constant * getSub(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getNot(Constant *C)
static LLVM_ABI Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static LLVM_ABI Constant * getBinOpIdentity(unsigned Opcode, Type *Ty, bool AllowRHSConstant=false, bool NSZ=false)
Return the identity constant for a binary opcode.
static LLVM_ABI Constant * getNeg(Constant *C, bool HasNSW=false)
This is the shared class of boolean and integer constants.
static LLVM_ABI ConstantInt * getTrue(LLVMContext &Context)
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
This class represents a range of values.
LLVM_ABI bool getEquivalentICmp(CmpInst::Predicate &Pred, APInt &RHS) const
Set up Pred and RHS such that ConstantRange::makeExactICmpRegion(Pred, RHS) == *this.
static LLVM_ABI ConstantRange makeExactICmpRegion(CmpInst::Predicate Pred, const APInt &Other)
Produce the exact range such that all values in the returned range satisfy the given predicate with a...
LLVM_ABI bool contains(const APInt &Val) const
Return true if the specified value is in the set.
static LLVM_ABI ConstantRange makeExactNoWrapRegion(Instruction::BinaryOps BinOp, const APInt &Other, unsigned NoWrapKind)
Produce the range that contains X if and only if "X BinOp Other" does not wrap.
Constant Vector Declarations.
static LLVM_ABI Constant * getSplat(ElementCount EC, Constant *Elt)
Return a ConstantVector with the specified constant in each element.
static LLVM_ABI Constant * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
static LLVM_ABI Constant * replaceUndefsWith(Constant *C, Constant *Replacement)
Try to replace undefined constant C or undefined elements in C with Replacement.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
const Constant * stripPointerCasts() const
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
static LLVM_ABI DIExpression * appendOpsToArg(const DIExpression *Expr, ArrayRef< uint64_t > Ops, unsigned ArgNo, bool StackValue=false)
Create a copy of Expr by appending the given list of Ops to each instance of the operand DW_OP_LLVM_a...
A parsed version of the target data layout string in and methods for querying it.
Record of a variable value-assignment, aka a non instruction representation of the dbg....
static bool shouldExecute(CounterInfo &Counter)
Identifies a unique instance of a variable.
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
iterator find(const_arg_type_t< KeyT > Val)
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Analysis pass which computes a DominatorTree.
Legacy analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Convenience struct for specifying and reasoning about fast-math flags.
This class represents a freeze function that returns random concrete value if an operand is either a ...
FunctionPass class - This class is used to implement most global optimizations.
bool skipFunction(const Function &F) const
Optional passes call this function to check whether the pass should be skipped.
const BasicBlock & getEntryBlock() const
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags inBounds()
static GEPNoWrapFlags all()
static GEPNoWrapFlags noUnsignedWrap()
GEPNoWrapFlags intersectForReassociate(GEPNoWrapFlags Other) const
Given (gep (gep p, x), y), determine the nowrap flags for (gep (gep, p, y), x).
bool hasNoUnsignedWrap() const
GEPNoWrapFlags intersectForOffsetAdd(GEPNoWrapFlags Other) const
Given (gep (gep p, x), y), determine the nowrap flags for (gep p, x+y).
static GEPNoWrapFlags none()
GEPNoWrapFlags getNoWrapFlags() const
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
static LLVM_ABI Type * getTypeAtIndex(Type *Ty, Value *Idx)
Return the type of the element at the given index of an indexable type.
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
static LLVM_ABI Type * getIndexedType(Type *Ty, ArrayRef< Value * > IdxList)
Returns the result type of a getelementptr with the given source element type and indexes.
static GetElementPtrInst * CreateInBounds(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Create an "inbounds" getelementptr.
Legacy wrapper pass to provide the GlobalsAAResult object.
This instruction compares its operands according to the predicate given to the constructor.
CmpPredicate getCmpPredicate() const
static bool isEquality(Predicate P)
Return true if this predicate is either EQ or NE.
Common base class shared among various IRBuilders.
Value * CreatePtrAdd(Value *Ptr, Value *Offset, const Twine &Name="", GEPNoWrapFlags NW=GEPNoWrapFlags::none())
ConstantInt * getInt(const APInt &AI)
Get a constant integer value.
virtual void InsertHelper(Instruction *I, const Twine &Name, BasicBlock::iterator InsertPt) const
This instruction inserts a struct field of array element value into an aggregate value.
static InsertValueInst * Create(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
LLVM_ABI InstCombinePass(InstCombineOptions Opts={})
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Instruction * foldBinOpOfSelectAndCastOfSelectCondition(BinaryOperator &I)
Tries to simplify binops of select and cast of the select condition.
Instruction * visitCondBrInst(CondBrInst &BI)
Instruction * foldBinOpIntoSelectOrPhi(BinaryOperator &I)
This is a convenience wrapper function for the above two functions.
bool SimplifyAssociativeOrCommutative(BinaryOperator &I)
Performs a few simplifications for operators which are associative or commutative.
Instruction * visitGEPOfGEP(GetElementPtrInst &GEP, GEPOperator *Src)
Value * foldUsingDistributiveLaws(BinaryOperator &I)
Tries to simplify binary operations which some other binary operation distributes over.
Instruction * foldBinOpShiftWithShift(BinaryOperator &I)
Instruction * visitUnreachableInst(UnreachableInst &I)
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,...
void handleUnreachableFrom(Instruction *I, SmallVectorImpl< BasicBlock * > &Worklist)
Value * SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, APInt &PoisonElts, unsigned Depth=0, bool AllowMultipleUsers=false) override
The specified value produces a vector with any number of elements.
Instruction * visitFreeze(FreezeInst &I)
Instruction * foldBinOpSelectBinOp(BinaryOperator &Op)
In some cases it is beneficial to fold a select into a binary operator.
void handlePotentiallyDeadBlocks(SmallVectorImpl< BasicBlock * > &Worklist)
bool prepareWorklist(Function &F)
Perform early cleanup and prepare the InstCombine worklist.
Instruction * FoldOpIntoSelect(Instruction &Op, SelectInst *SI, bool FoldWithMultiUse=false, bool SimplifyBothArms=false)
Given an instruction with a select as one operand and a constant as the other operand,...
Instruction * visitFree(CallInst &FI, Value *FreedOp)
Instruction * visitExtractValueInst(ExtractValueInst &EV)
void handlePotentiallyDeadSuccessors(BasicBlock *BB, BasicBlock *LiveSucc)
Instruction * foldBinopWithRecurrence(BinaryOperator &BO)
Try to fold binary operators whose operands are simple interleaved recurrences to a single recurrence...
Instruction * eraseInstFromFunction(Instruction &I) override
Combiner aware instruction erasure.
Instruction * visitLandingPadInst(LandingPadInst &LI)
Instruction * visitReturnInst(ReturnInst &RI)
Instruction * visitSwitchInst(SwitchInst &SI)
Instruction * foldBinopWithPhiOperands(BinaryOperator &BO)
For a binary operator with 2 phi operands, try to hoist the binary operation before the phi.
bool SimplifyDemandedFPClass(Instruction *I, unsigned Op, FPClassTest DemandedMask, KnownFPClass &Known, const SimplifyQuery &Q, unsigned Depth=0)
bool mergeStoreIntoSuccessor(StoreInst &SI)
Try to transform: if () { *P = v1; } else { *P = v2 } or: *P = v1; if () { *P = v2; }...
Instruction * tryFoldInstWithCtpopWithNot(Instruction *I)
Instruction * visitUncondBrInst(UncondBrInst &BI)
void CreateNonTerminatorUnreachable(Instruction *InsertAt)
Create and insert the idiom we use to indicate a block is unreachable without having to rewrite the C...
Value * pushFreezeToPreventPoisonFromPropagating(FreezeInst &FI)
bool run()
Run the combiner over the entire worklist until it is empty.
Instruction * foldVectorBinop(BinaryOperator &Inst)
Canonicalize the position of binops relative to shufflevector.
bool removeInstructionsBeforeUnreachable(Instruction &I)
Value * SimplifySelectsFeedingBinaryOp(BinaryOperator &I, Value *LHS, Value *RHS)
void tryToSinkInstructionDbgVariableRecords(Instruction *I, BasicBlock::iterator InsertPos, BasicBlock *SrcBlock, BasicBlock *DestBlock, SmallVectorImpl< DbgVariableRecord * > &DPUsers)
void addDeadEdge(BasicBlock *From, BasicBlock *To, SmallVectorImpl< BasicBlock * > &Worklist)
Constant * unshuffleConstant(ArrayRef< int > ShMask, Constant *C, VectorType *NewCTy)
Find a constant NewC that has property: shuffle(NewC, poison, ShMask) = C for lanes that select NewC.
Instruction * visitAllocSite(Instruction &FI)
Instruction * visitGetElementPtrInst(GetElementPtrInst &GEP)
Value * tryFactorizationFolds(BinaryOperator &I)
This tries to simplify binary operations by factorizing out common terms (e.
Instruction * foldFreezeIntoRecurrence(FreezeInst &I, PHINode *PN)
bool tryToSinkInstruction(Instruction *I, BasicBlock *DestBlock)
Try to move the specified instruction from its current block into the beginning of DestBlock,...
bool freezeOtherUses(FreezeInst &FI)
void freelyInvertAllUsersOf(Value *V, Value *IgnoredUser=nullptr)
Freely adapt every user of V as-if V was changed to !V.
The core instruction combiner logic.
const DataLayout & getDataLayout() const
bool isFreeToInvert(Value *V, bool WillInvertAllUses, bool &DoesConsume)
Return true if the specified value is free to invert (apply ~ to).
static unsigned getComplexity(Value *V)
Assign a complexity or rank value to LLVM Values.
unsigned ComputeNumSignBits(const Value *Op, const Instruction *CxtI=nullptr, unsigned Depth=0) const
Instruction * InsertNewInstBefore(Instruction *New, BasicBlock::iterator Old)
Inserts an instruction New before instruction Old.
Instruction * replaceInstUsesWith(Instruction &I, Value *V)
A combiner-aware RAUW-like routine.
uint64_t MaxArraySizeForCombine
Maximum size of array considered when transforming.
static bool shouldAvoidAbsorbingNotIntoSelect(const SelectInst &SI)
void replaceUse(Use &U, Value *NewValue)
Replace use and add the previously used value to the worklist.
static bool isCanonicalPredicate(CmpPredicate Pred)
Predicate canonicalization reduces the number of patterns that need to be matched by other transforms...
Instruction * AnnotationMetadataSource
Source for annotation metadata, used by the IRBuilder inserter.
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.
BranchProbabilityInfo * BPI
ReversePostOrderTraversal< BasicBlock * > & RPOT
void computeKnownBits(const Value *V, KnownBits &Known, const Instruction *CxtI, unsigned Depth=0) const
IRBuilder< TargetFolder, IRBuilderInstCombineInserter > BuilderTy
An IRBuilder that automatically inserts new instructions into the worklist.
LLVM_ABI std::optional< Instruction * > targetInstCombineIntrinsic(IntrinsicInst &II)
void addToWorklist(Instruction *I)
LLVM_ABI Value * getFreelyInvertedImpl(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume, unsigned Depth)
Return nonnull value if V is free to invert under the condition of WillInvertAllUses.
SmallDenseSet< std::pair< const BasicBlock *, const BasicBlock * >, 8 > BackEdges
Backedges, used to avoid pushing instructions across backedges in cases where this may result in infi...
LLVM_ABI std::optional< Value * > targetSimplifyDemandedVectorEltsIntrinsic(IntrinsicInst &II, APInt DemandedElts, APInt &UndefElts, APInt &UndefElts2, APInt &UndefElts3, std::function< void(Instruction *, unsigned, APInt, APInt &)> SimplifyAndSetOp)
LLVM_ABI void computeBackEdges()
Instruction * replaceOperand(Instruction &I, unsigned OpNum, Value *V)
Replace operand of instruction and add old operand to the worklist.
static Constant * getSafeVectorConstantForBinop(BinaryOperator::BinaryOps Opcode, Constant *In, bool IsRHSConstant)
Some binary operators require special handling to avoid poison and undefined behavior.
SmallDenseSet< std::pair< BasicBlock *, BasicBlock * >, 8 > DeadEdges
Edges that are known to never be taken.
LLVM_ABI std::optional< Value * > targetSimplifyDemandedUseBitsIntrinsic(IntrinsicInst &II, APInt DemandedMask, KnownBits &Known, bool &KnownBitsComputed)
LLVM_ABI bool isValidAddrSpaceCast(unsigned FromAS, unsigned ToAS) const
Value * getFreelyInverted(Value *V, bool WillInvertAllUses, BuilderTy *Builder, bool &DoesConsume)
bool isBackEdge(const BasicBlock *From, const BasicBlock *To)
bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero=false, const Instruction *CxtI=nullptr, unsigned Depth=0)
void visit(Iterator Start, Iterator End)
The legacy pass manager's instcombine pass.
InstructionCombiningPass()
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
bool runOnFunction(Function &F) override
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
InstructionWorklist - This is the worklist management logic for InstCombine and other simplification ...
LLVM_ABI void dropUBImplyingAttrsAndMetadata(ArrayRef< unsigned > Keep={})
Drop any attributes or metadata that can cause immediate undefined behavior.
static bool isBitwiseLogicOp(unsigned Opcode)
Determine if the Opcode is and/or/xor.
LLVM_ABI void copyIRFlags(const Value *V, bool IncludeWrapFlags=true)
Convenience method to copy supported exact, fast-math, and (optionally) wrapping flags from V to this...
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI const Module * getModule() const
Return the module owning the function this instruction belongs to or nullptr it the function does not...
LLVM_ABI void setAAMetadata(const AAMDNodes &N)
Sets the AA metadata on this instruction from the AAMDNodes structure.
LLVM_ABI bool isAssociative() const LLVM_READONLY
Return true if the instruction is associative:
LLVM_ABI bool isCommutative() const LLVM_READONLY
Return true if the instruction is commutative:
LLVM_ABI void moveBefore(InstListType::iterator InsertPos)
Unlink this instruction from its current basic block and insert it into the basic block that MovePos ...
LLVM_ABI void setFastMathFlags(FastMathFlags FMF)
Convenience function for setting multiple fast-math flags on this instruction, which must be an opera...
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
bool isTerminator() const
iterator_range< user_iterator > users()
LLVM_ABI FastMathFlags getFastMathFlags() const LLVM_READONLY
Convenience function for getting all the fast-math flags, which must be an operator which supports th...
LLVM_ABI bool willReturn() const LLVM_READONLY
Return true if the instruction will return (unwinding is considered as a form of returning control fl...
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
bool isBitwiseLogicOp() const
Return true if this is and/or/xor.
LLVM_ABI void dropPoisonGeneratingFlags()
Drops flags that may cause this instruction to evaluate to poison despite having non-poison inputs.
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM_ABI void copyMetadata(const Instruction &SrcInst, ArrayRef< unsigned > WL=ArrayRef< unsigned >())
Copy metadata from SrcInst to this instruction.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
A wrapper class for inspecting calls to intrinsic functions.
static InvokeInst * Create(FunctionType *Ty, Value *Func, BasicBlock *IfNormal, BasicBlock *IfException, ArrayRef< Value * > Args, const Twine &NameStr, InsertPosition InsertBefore=nullptr)
The landingpad instruction holds all of the information necessary to generate correct exception handl...
bool isCleanup() const
Return 'true' if this landingpad instruction is a cleanup.
unsigned getNumClauses() const
Get the number of clauses for this landing pad.
static LLVM_ABI LandingPadInst * Create(Type *RetTy, unsigned NumReservedClauses, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedClauses is a hint for the number of incoming clauses that this landingpad w...
LLVM_ABI void addClause(Constant *ClauseVal)
Add a catch or filter clause to the landing pad.
bool isCatch(unsigned Idx) const
Return 'true' if the clause and index Idx is a catch clause.
bool isFilter(unsigned Idx) const
Return 'true' if the clause and index Idx is a filter clause.
Constant * getClause(unsigned Idx) const
Get the value of the clause at index Idx.
void setCleanup(bool V)
Indicate that this landingpad instruction is a cleanup.
A function/module analysis which provides an empty LastRunTrackingInfo.
This is an alternative analysis pass to BlockFrequencyInfoWrapperPass.
static void getLazyBFIAnalysisUsage(AnalysisUsage &AU)
Helper for client passes to set up the analysis usage on behalf of this pass.
An instruction for reading from memory.
Value * getPointerOperand()
bool isVolatile() const
Return true if this is a load from a volatile memory location.
const MDOperand & getOperand(unsigned I) const
unsigned getNumOperands() const
Return number of MDNode operands.
Tracking metadata reference owned by Metadata.
This is the common base class for memset/memcpy/memmove.
static LLVM_ABI MemoryLocation getForDest(const MemIntrinsic *MI)
Return a location representing the destination of a memory set or transfer.
static ICmpInst::Predicate getPredicate(Intrinsic::ID ID)
Returns the comparison predicate underlying the intrinsic.
A Module instance is used to store all the information related to an LLVM module.
MDNode * getScopeList() const
Utility class for integer operators which may exhibit overflow - Add, Sub, Mul, and Shl.
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.
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...
PassRegistry - This class manages the registration and intitialization of the pass subsystem as appli...
AnalysisType & getAnalysis() const
getAnalysis<AnalysisType>() - This function is used by subclasses to get to the analysis information ...
AnalysisType * getAnalysisIfAvailable() const
getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to get analysis information tha...
In order to facilitate speculative execution, many instructions do not invoke immediate undefined beh...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
PreservedAnalyses & preserve()
Mark an analysis as preserved.
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
An analysis pass based on legacy pass manager to deliver ProfileSummaryInfo.
Analysis providing profile information.
bool hasProfileSummary() const
Returns true if profile summary is available.
A global registry used in conjunction with static constructors to make pluggable components (like tar...
Return a value (possibly void), from a function.
Value * getReturnValue() const
Convenience accessor. Returns null if there is no return value.
This class represents the LLVM 'select' instruction.
const Value * getFalseValue() const
const Value * getCondition() const
static SelectInst * Create(Value *C, Value *S1, Value *S2, const Twine &NameStr="", InsertPosition InsertBefore=nullptr, const Instruction *MDFrom=nullptr)
const Value * getTrueValue() const
bool insert(const value_type &X)
Insert a new element into the SetVector.
This instruction constructs a fixed permutation of two input vectors.
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
iterator erase(const_iterator CI)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
typename SuperClass::iterator iterator
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Represent a constant reference to a string, i.e.
Analysis pass providing the TargetTransformInfo.
Analysis pass providing the TargetLibraryInfo.
Provides information about what library functions are available for the current target.
bool has(LibFunc F) const
Tests whether a library function is available.
LibFunc getLibFunc(StringRef funcName) const
Searches for a particular function name.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
bool isVectorTy() const
True if this is an instance of VectorType.
bool isPointerTy() const
True if this is an instance of PointerType.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
bool isSized() const
Return true if it makes sense to take the size of this type.
static LLVM_ABI IntegerType * getInt8Ty(LLVMContext &C)
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
bool isStructTy() const
True if this is an instance of StructType.
LLVM_ABI TypeSize getPrimitiveSizeInBits() const LLVM_READONLY
Return the basic size of this type if it is a primitive type.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
LLVM_ABI bool isScalableTy() const
Return true if this is a type whose size is a known multiple of vscale.
bool isIntegerTy() const
True if this is an instance of IntegerType.
LLVM_ABI const fltSemantics & getFltSemantics() const
Unconditional Branch instruction.
static LLVM_ABI UndefValue * get(Type *T)
Static factory methods - Return an 'undef' object of the specified type.
This function has undefined behavior.
A Use represents the edge between a Value definition and its users.
LLVM_ABI bool isDroppable() const
A droppable user is a user for which uses can be dropped without affecting correctness and should be ...
LLVM_ABI bool replaceUsesOfWith(Value *From, Value *To)
Replace uses of one Value with another.
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
const Value * stripAndAccumulateInBoundsConstantOffsets(const DataLayout &DL, APInt &Offset) const
This is a wrapper around stripAndAccumulateConstantOffsets with the in-bounds requirement set to fals...
LLVM_ABI bool hasOneUser() const
Return true if there is exactly one user of this value.
bool hasOneUse() const
Return true if there is exactly one use of this value.
LLVMContext & getContext() const
All values hold a context through their type.
bool hasUseList() const
Check if this Value has a use-list.
LLVM_ABI bool hasNUses(unsigned N) const
Return true if this Value has exactly N uses.
LLVM_ABI const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
LLVM_ABI uint64_t getPointerDereferenceableBytes(const DataLayout &DL, bool &CanBeNull, bool *CanBeFreed) const
Returns the number of bytes known to be dereferenceable for the pointer value.
Base class of all SIMD vector types.
ElementCount getElementCount() const
Return an ElementCount instance to represent the (possibly scalable) number of elements in the vector...
static LLVM_ABI VectorType * get(Type *ElementType, ElementCount EC)
This static method is the primary way to construct an VectorType.
Value handle that is nullable, but tries to track the Value.
constexpr ScalarTy getFixedValue() const
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
An efficient, type-erasing, non-owning reference to a callable.
TypeSize getSequentialElementStride(const DataLayout &DL) const
Type * getIndexedType() const
const ParentTy * getParent() const
reverse_self_iterator getReverseIterator()
self_iterator getIterator()
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Abstract Attribute helper functions.
LLVM_ABI Function * getOrInsertDeclaration(Module *M, ID id, ArrayRef< Type * > OverloadTys={})
Look up the Function declaration of the intrinsic id in the Module M.
BinaryOp_match< SpecificConstantMatch, SrcTy, TargetOpcode::G_SUB > m_Neg(const SrcTy &&Src)
Matches a register negated by a G_SUB.
AllOnesConstantMatch m_AllOnes()
BinaryOp_match< SrcTy, SpecificConstantMatch, TargetOpcode::G_XOR, true > m_Not(const SrcTy &&Src)
Matches a register not-ed by a G_XOR.
OneUse_match< SubPat > m_OneUse(const SubPat &SP)
match_unless< Pattern > m_Unless(const Pattern &P)
Match if the inner matcher does NOT match.
match_combine_or< Ty... > m_CombineOr(const Ty &...Ps)
Combine pattern matchers matching any of Ps patterns.
match_combine_and< Ty... > m_CombineAnd(const Ty &...Ps)
Combine pattern matchers matching all of Ps patterns.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
PtrAdd_match< PointerOpTy, OffsetOpTy > m_PtrAdd(const PointerOpTy &PointerOp, const OffsetOpTy &OffsetOp)
Matches GEP with i8 source element type.
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, FCmpInst > m_FCmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::AShr > m_AShr(const LHS &L, const RHS &R)
auto m_PtrToIntOrAddr(const OpTy &Op)
Matches PtrToInt or PtrToAddr.
OneOps_match< OpTy, Instruction::Freeze > m_Freeze(const OpTy &Op)
Matches FreezeInst.
auto m_Poison()
Match an arbitrary poison constant.
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
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)
br_match m_UnconditionalBr(BasicBlock *&Succ)
ap_match< APInt > m_APIntAllowPoison(const APInt *&Res)
Match APInt while allowing poison in splat vector constants.
auto m_ConstantExpr()
Match a constant expression or a constant that contains a constant expression.
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)
BinOpPred_match< LHS, RHS, is_idiv_op > m_IDiv(const LHS &L, const RHS &R)
Matches integer division operations.
match_bind< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
DisjointOr_match< LHS, RHS > m_DisjointOr(const LHS &L, const RHS &R)
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
ap_match< APFloat > m_APFloat(const APFloat *&Res)
Match a ConstantFP or splatted ConstantVector, binding the specified pointer to the contained APFloat...
cst_pred_ty< is_nonnegative > m_NonNegative()
Match an integer or vector of non-negative values.
ThreeOps_match< Cond, LHS, RHS, Instruction::Select > m_Select(const Cond &C, const LHS &L, const RHS &R)
Matches SelectInst.
auto m_BinOp()
Match an arbitrary binary operation and ignore it.
ExtractValue_match< Ind, Val_t > m_ExtractValue(const Val_t &V)
Match a single index ExtractValue instruction.
match_combine_or< CastInst_match< OpTy, UIToFPInst >, CastInst_match< OpTy, SIToFPInst > > m_IToFP(const OpTy &Op)
auto m_Value()
Match an arbitrary value and ignore it.
auto m_Ctpop(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
auto m_Constant()
Match an arbitrary Constant and ignore it.
ContainsMatchingVectorElement_match< SPTy > m_ContainsMatchingVectorElement(const SPTy &SubPattern)
Match a vector constant where at least one of its elements matches the subpattern.
NNegZExt_match< OpTy > m_NNegZExt(const OpTy &Op)
auto m_LogicalOr()
Matches L || R where L and R are arbitrary values.
Splat_match< T > m_ConstantSplat(const T &SubPattern)
Match a constant splat. TODO: Extend this to non-constant splats.
TwoOps_match< V1_t, V2_t, Instruction::ShuffleVector > m_Shuffle(const V1_t &v1, const V2_t &v2)
Matches ShuffleVectorInst independently of mask value.
ThreeOps_match< decltype(m_Value()), LHS, RHS, Instruction::Select, true > m_c_Select(const LHS &L, const RHS &R)
Match Select(C, LHS, RHS) or Select(C, RHS, LHS)
SpecificCmpClass_match< LHS, RHS, ICmpInst > m_SpecificICmp(CmpPredicate MatchPred, const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
BinaryOp_match< LHS, RHS, Instruction::UDiv > m_UDiv(const LHS &L, const RHS &R)
match_immconstant_ty m_ImmConstant()
Match an arbitrary immediate Constant and ignore it.
SelectLike_match< CondTy, LTy, RTy > m_SelectLike(const CondTy &C, const LTy &TrueC, const RTy &FalseC)
Matches a value that behaves like a boolean-controlled select, i.e.
match_combine_or< BinaryOp_match< LHS, RHS, Instruction::Add >, DisjointOr_match< LHS, RHS > > m_AddLike(const LHS &L, const RHS &R)
Match either "add" or "or disjoint".
CastOperator_match< OpTy, Instruction::BitCast > m_BitCast(const OpTy &Op)
Matches BitCast.
match_combine_or< CastInst_match< OpTy, SExtInst >, NNegZExt_match< OpTy > > m_SExtLike(const OpTy &Op)
Match either "sext" or "zext nneg".
auto m_Intrinsic(const Ts &...Ops)
Match intrinsic calls like this: m_Intrinsic<Intrinsic::fabs>(m_Value(X))
BinaryOp_match< LHS, RHS, Instruction::SDiv > m_SDiv(const LHS &L, const RHS &R)
auto m_VectorInsert(const Opnd0 &Op0, const Opnd1 &Op1, const Opnd2 &Op2)
match_combine_or< OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoSignedWrap >, DisjointOr_match< LHS, RHS > > m_NSWAddLike(const LHS &L, const RHS &R)
Match either "add nsw" or "or disjoint".
AnyBinaryOp_match< LHS, RHS, true > m_c_BinOp(const LHS &L, const RHS &R)
Matches a BinaryOperator with LHS and RHS in either order.
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
match_combine_or< CastInst_match< OpTy, ZExtInst >, CastInst_match< OpTy, SExtInst > > m_ZExtOrSExt(const OpTy &Op)
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)
cstfp_pred_ty< is_non_zero_fp > m_NonZeroFP()
Match a floating-point non-zero.
auto m_MaxOrMin(const Opnd0 &Op0, const Opnd1 &Op1)
auto m_LogicalAnd()
Matches L && R where L and R are arbitrary values.
brc_match< Cond_t, match_bind< BasicBlock >, match_bind< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
BinaryOp_match< LHS, RHS, Instruction::SRem > m_SRem(const LHS &L, const RHS &R)
auto m_Undef()
Match an arbitrary undef constant.
auto m_VecReverse(const Opnd0 &Op0)
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
is_zero m_Zero()
Match any null constant or a vector with all elements equal to 0.
match_combine_or< OverflowingBinaryOp_match< LHS, RHS, Instruction::Add, OverflowingBinaryOperator::NoUnsignedWrap >, DisjointOr_match< LHS, RHS > > m_NUWAddLike(const LHS &L, const RHS &R)
Match either "add nuw" or "or disjoint".
BinaryOp_match< LHS, RHS, Instruction::Sub > m_Sub(const LHS &L, const RHS &R)
auto m_ConstantInt()
Match an arbitrary ConstantInt and ignore it.
initializer< Ty > init(const Ty &Val)
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
LLVM_ABI Intrinsic::ID getInverseMinMaxIntrinsic(Intrinsic::ID MinMaxID)
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
void stable_sort(R &&Range)
LLVM_ABI void initializeInstructionCombiningPassPass(PassRegistry &)
LLVM_ABI unsigned removeAllNonTerminatorAndEHPadInstructions(BasicBlock *BB)
Remove all instructions from a basic block other than its terminator and any present EH pad instructi...
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI Value * simplifyGEPInst(Type *SrcTy, Value *Ptr, ArrayRef< Value * > Indices, GEPNoWrapFlags NW, const SimplifyQuery &Q)
Given operands for a GetElementPtrInst, fold the result or return null.
LLVM_ABI Constant * getInitialValueOfAllocation(const Value *V, const TargetLibraryInfo *TLI, Type *Ty)
If this is a call to an allocation function that initializes memory to a fixed value,...
bool succ_empty(const Instruction *I)
LLVM_ABI Value * simplifyFreezeInst(Value *Op, const SimplifyQuery &Q)
Given an operand for a Freeze, see if we can fold the result.
LLVM_ABI FunctionPass * createInstructionCombiningPass()
LLVM_ABI void findDbgValues(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
Finds the dbg.values describing a value.
@ Known
Known to have no common set bits.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI void salvageDebugInfo(const MachineRegisterInfo &MRI, MachineInstr &MI)
Assuming the instruction MI is going to be deleted, attempt to salvage debug users of MI by writing t...
auto successors(const MachineBasicBlock *BB)
LLVM_ABI Constant * ConstantFoldInstruction(const Instruction *I, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldInstruction - Try to constant fold the specified instruction.
LLVM_ABI bool isRemovableAlloc(const CallBase *V, const TargetLibraryInfo *TLI)
Return true if this is a call to an allocation function that does not have side effects that we are r...
LLVM_ABI std::optional< StringRef > getAllocationFamily(const Value *I, const TargetLibraryInfo *TLI)
If a function is part of an allocation family (e.g.
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
LLVM_ABI Value * lowerObjectSizeCall(IntrinsicInst *ObjectSize, const DataLayout &DL, const TargetLibraryInfo *TLI, bool MustSucceed)
Try to turn a call to @llvm.objectsize into an integer value of the given Type.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI Value * simplifyInstructionWithOperands(Instruction *I, ArrayRef< Value * > NewOps, const SimplifyQuery &Q)
Like simplifyInstruction but the operands of I are replaced with NewOps.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
LLVM_ABI Constant * ConstantFoldCompareInstOperands(unsigned Predicate, Constant *LHS, Constant *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const Instruction *I=nullptr)
Attempt to constant fold a compare instruction (icmp/fcmp) with the specified operands.
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
gep_type_iterator gep_type_end(const User *GEP)
LLVM_ABI Value * getSplatValue(const Value *V)
Get splat value if the input is a splat vector or return nullptr.
LLVM_ABI Value * getReallocatedOperand(const CallBase *CB)
If this is a call to a realloc function, return the reallocated operand.
APFloat frexp(const APFloat &X, int &Exp, APFloat::roundingMode RM)
Equivalent of C standard library function.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
LLVM_ABI bool isAllocLikeFn(const Value *V, const TargetLibraryInfo *TLI)
Tests if a value is a call or invoke to a library function that allocates memory (either malloc,...
LLVM_ABI bool handleUnreachableTerminator(Instruction *I, SmallVectorImpl< Value * > &PoisonedValues)
If a terminator in an unreachable basic block has an operand of type Instruction, transform it into p...
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
LLVM_ABI void setBranchWeights(Instruction &I, ArrayRef< uint32_t > Weights, bool IsExpected, bool ElideAllZero=false)
Create a new branch_weights metadata node and add or overwrite a prof metadata reference to instructi...
LLVM_ABI bool matchSimpleRecurrence(const PHINode *P, BinaryOperator *&BO, Value *&Start, Value *&Step)
Attempt to match a simple first order recurrence cycle of the form: iv = phi Ty [Start,...
LLVM_ABI Value * simplifyAddInst(Value *LHS, Value *RHS, bool IsNSW, bool IsNUW, const SimplifyQuery &Q)
Given operands for an Add, fold the result or return null.
LLVM_ABI Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
auto dyn_cast_or_null(const Y &Val)
constexpr bool has_single_bit(T Value) noexcept
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
LLVM_ABI bool isInstructionTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction is not used, and the instruction will return.
LLVM_ABI bool isSplatValue(const Value *V, int Index=-1, unsigned Depth=0)
Return true if each element of the vector value V is poisoned or equal to every other non-poisoned el...
LLVM_ABI Value * emitGEPOffset(IRBuilderBase *Builder, const DataLayout &DL, User *GEP, bool NoAssumptions=false)
Given a getelementptr instruction/constantexpr, emit the code necessary to compute the offset from th...
constexpr unsigned MaxAnalysisRecursionDepth
auto reverse(ContainerTy &&C)
bool isModSet(const ModRefInfo MRI)
FPClassTest
Floating-point class tests, supported by 'is_fpclass' intrinsic.
LLVM_ABI bool LowerDbgDeclare(Function &F)
Lowers dbg.declare records into appropriate set of dbg.value records.
LLVM_ABI bool NullPointerIsDefined(const Function *F, unsigned AS=0)
Check whether null pointer dereferencing is considered undefined behavior for a given function or an ...
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void salvageDebugInfoForDbgValues(Instruction &I, ArrayRef< DbgVariableRecord * > DbgRecords)
Salvage only the records in DbgRecords instead of finding every debug user of I.
generic_gep_type_iterator<> gep_type_iterator
LLVM_ABI void ConvertDebugDeclareToDebugValue(DbgVariableRecord *DVR, StoreInst *SI, DIBuilder &Builder)
Inserts a dbg.value record before a store to an alloca'd value that has an associated dbg....
LLVM_ABI Constant * ConstantFoldCastOperand(unsigned Opcode, Constant *C, Type *DestTy, const DataLayout &DL)
Attempt to constant fold a cast with the specified operand.
LLVM_ABI bool canCreateUndefOrPoison(const Operator *Op, bool ConsiderFlagsAndMetadata=true)
canCreateUndefOrPoison returns true if Op can create undef or poison from non-undef & non-poison oper...
LLVM_ABI EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ABI Value * simplifyExtractValueInst(Value *Agg, ArrayRef< unsigned > Idxs, const SimplifyQuery &Q)
Given operands for an ExtractValueInst, fold the result or return null.
LLVM_ABI Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
LLVM_ABI bool replaceAllDbgUsesWith(Instruction &From, Value &To, Instruction &DomPoint, DominatorTree &DT)
Point debug users of From to To or salvage them.
LLVM_ABI bool isKnownNonZero(const Value *V, const SimplifyQuery &Q, unsigned Depth=0)
Return true if the given value is known to be non-zero when defined.
constexpr int PoisonMaskElem
auto drop_end(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the last N elements excluded.
ModRefInfo
Flags indicating whether a memory access modifies or references memory.
@ Ref
The access may reference the value stored in memory.
@ ModRef
The access may reference and may modify the value stored in memory.
@ Mod
The access may modify the value stored in memory.
@ NoModRef
The access neither references nor modifies the value stored in memory.
LLVM_ABI Value * simplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const SimplifyQuery &Q)
Given operands for a BinaryOperator, fold the result or return null.
@ Sub
Subtraction of integers.
DWARFExpression::Operation Op
bool isSafeToSpeculativelyExecuteWithVariableReplaced(const Instruction *I, bool IgnoreUBImplyingAttrs=true)
Don't use information from its non-constant operands.
LLVM_ABI bool isGuaranteedNotToBeUndefOrPoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Return true if this function can prove that V does not have undef bits and is never poison.
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI Value * getFreedOperand(const CallBase *CB, const TargetLibraryInfo *TLI)
If this if a call to a free function, return the freed operand.
constexpr unsigned BitWidth
LLVM_ABI bool isGuaranteedToTransferExecutionToSuccessor(const Instruction *I)
Return true if this function can prove that the instruction I will always transfer execution to one o...
LLVM_ABI Constant * getLosslessInvCast(Constant *C, Type *InvCastTo, unsigned CastOp, const DataLayout &DL, PreservedCastFlags *Flags=nullptr)
Try to cast C to InvC losslessly, satisfying CastOp(InvC) equals C, or CastOp(InvC) is a refined valu...
LLVM_ABI bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
gep_type_iterator gep_type_begin(const User *GEP)
auto predecessors(const MachineBasicBlock *BB)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
bool equal(L &&LRange, R &&RRange)
Wrapper function around std::equal to detect if pair-wise elements between two ranges are the same.
LLVM_ABI const Value * getUnderlyingObject(const Value *V, unsigned MaxLookup=MaxLookupSearchDepth)
This method strips off any GEP address adjustments, pointer casts or llvm.threadlocal....
AAResults AliasAnalysis
Temporary typedef for legacy code that uses a generic AliasAnalysis pointer or reference.
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
LLVM_ABI void initializeInstCombine(PassRegistry &)
Initialize all passes linked into the InstCombine library.
LLVM_ABI void findDbgUsers(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
Finds the debug info records describing a value.
LLVM_ABI Constant * ConstantFoldBinaryInstruction(unsigned Opcode, Constant *V1, Constant *V2)
bool isRefSet(const ModRefInfo MRI)
LLVM_ABI std::optional< bool > isImpliedCondition(const Value *LHS, const Value *RHS, const DataLayout &DL, bool LHSIsTrue=true, unsigned Depth=0)
Return true if RHS is known to be implied true by LHS.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
SimplifyQuery getWithInstruction(const Instruction *I) const