73 case Instruction::Sub:
74 return Instruction::Add;
75 case Instruction::FSub:
76 return Instruction::FAdd;
83 if (
I->getOpcode() == Instruction::Sub)
85 if (
I->getOpcode() == Instruction::FSub)
86 return I->hasAllowReassoc();
87 return I->isAssociative();
95 switch (
I->getOpcode()) {
96 case Instruction::ExtractValue:
97 case Instruction::InsertValue:
99 case Instruction::ExtractElement:
102 case Instruction::InsertElement:
112 "ScalableVectorType is not supported.");
123 return std::min<unsigned>(PartNumElems,
Size - Part * PartNumElems);
131 OS <<
"Idx: " << Idx <<
", ";
132 OS <<
"n=" << VL.
size() <<
" [" << *VL.
front() <<
", ..]";
147 return !isa<PoisonValue>(V);
153 if (BB !=
II->getParent())
166 Value *FirstNonUndef =
nullptr;
169 if (!FirstNonUndef) {
173 if (V != FirstNonUndef)
176 return FirstNonUndef !=
nullptr;
182 if ((LHS == Intrinsic::fma || LHS == Intrinsic::fmuladd) &&
183 (RHS == Intrinsic::fma || RHS == Intrinsic::fmuladd))
184 return Intrinsic::fma;
192 return isa<CmpInst>(ValWithUses) && Cmp->isCommutative();
194 return BO->isCommutative() ||
195 (BO->getOpcode() == Instruction::Sub && ValWithUses->
hasUseList() &&
202 if (match(U.getUser(),
203 m_ICmp(Pred, m_Specific(U.get()), m_Zero())) &&
204 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE))
208 auto *I = dyn_cast<BinaryOperator>(U.get());
209 return match(U.getUser(),
210 m_Intrinsic<Intrinsic::abs>(
211 m_Specific(U.get()), m_ConstantInt(Flag))) &&
212 ((!IsCopyable && I && !I->hasNoSignedWrap()) ||
215 (BO->getOpcode() == Instruction::FSub && ValWithUses->
hasUseList() &&
218 return match(U.getUser(),
219 m_Intrinsic<Intrinsic::fabs>(m_Specific(U.get())));
221 return I->isCommutative();
229 "The instruction is not commutative.");
233 switch (BO->getOpcode()) {
234 case Instruction::Sub:
235 case Instruction::FSub:
241 return I->isCommutableOperand(
Op);
248 constexpr unsigned IntrinsicNumOperands = 2;
249 return IntrinsicNumOperands;
251 return I->getNumOperands();
266 Type *CurrentType =
IV->getType();
267 for (
unsigned I :
IV->indices()) {
269 Index *= ST->getNumElements();
270 CurrentType = ST->getElementType(
I);
272 Index *= AT->getNumElements();
273 CurrentType = AT->getElementType();
292 if (auto *CI = dyn_cast<CmpInst>(V))
293 return BasePred == CI->getPredicate();
294 if (auto *I = dyn_cast<Instruction>(V))
295 return I->getOpcode() == Opcode;
296 return isa<PoisonValue>(V);
301 unsigned Opcode = E->getOpcode();
302 assert((Opcode == Instruction::ExtractElement ||
303 Opcode == Instruction::ExtractValue) &&
304 "Expected extractelement or extractvalue instruction.");
305 if (Opcode == Instruction::ExtractElement) {
311 unsigned Idx = CI->getZExtValue();
319 if (EI->getNumIndices() != 1)
321 return *EI->idx_begin();
327 const unsigned E = Indices.
size();
329 for (
unsigned I = 0;
I < E; ++
I)
330 Mask[Indices[
I]] =
I;
334 assert(!Mask.empty() &&
"Expected non-empty mask.");
338 for (
unsigned I = 0, E = Prev.
size();
I < E; ++
I)
340 Scalars[Mask[
I]] = Prev[
I];
344 assert(!Mask.empty() && Reuses.
size() == Mask.size() &&
345 "Expected non-empty mask.");
348 for (
unsigned I = 0, E = Prev.
size();
I < E; ++
I)
350 Reuses[Mask[
I]] = Prev[
I];
355 assert(!Mask.empty() &&
"Expected non-empty mask.");
356 unsigned Sz = Mask.size();
361 std::iota(PrevOrder.
begin(), PrevOrder.
end(), 0);
363 PrevOrder.
swap(Order);
366 for (
unsigned I = 0;
I < Sz; ++
I)
368 Order[
I] = PrevOrder[Mask[
I]];
370 return Data.value() == Sz ||
Data.index() ==
Data.value();
381 std::iota(MaskOrder.
begin(), MaskOrder.
end(), 0);
391 for (
unsigned I = 0;
I < Sz; ++
I)
393 Order[MaskOrder[
I]] =
I;
399 "Order is empty. Please check it before using isReverseOrder.");
400 unsigned Sz = Order.
size();
402 return Pair.value() == Sz || Sz - Pair.index() - 1 == Pair.value();
410 for (
unsigned I = Sz, E = Mask.size();
I < E;
I += Sz) {
421 "Expected same size of orders");
422 size_t Sz = Order.
size();
425 if (Order[Idx] != Sz)
426 UsedIndices.
set(Order[Idx]);
428 if (SecondaryOrder.
empty()) {
430 if (Order[Idx] == Sz && !UsedIndices.
test(Idx))
434 if (SecondaryOrder[Idx] != Sz && Order[Idx] == Sz &&
435 !UsedIndices.
test(SecondaryOrder[Idx]))
436 Order[Idx] = SecondaryOrder[Idx];
441 assert(!VL.
empty() &&
"Expected non-empty list of values.");
443 return all_of(VL, [&](
Value *V) {
return V->getType() == Ty; });
449 static_assert(std::is_same_v<T, InsertElementInst> ||
450 std::is_same_v<T, ExtractElementInst>,
457 constexpr bool IsInsert = std::is_same_v<T, InsertElementInst>;
458 Type *VecTy = IsInsert ? IE->getType() : IE->getOperand(0)->getType();
465 if (CI->getValue().uge(VT->getNumElements()))
468 Index *= VT->getNumElements();
469 Index += CI->getZExtValue();
475template std::optional<unsigned>
477template std::optional<unsigned>
486 return isa<PHINode>(IO) || IO->getParent() != I->getParent();
497 auto *IU = dyn_cast<Instruction>(U);
500 return IU->getParent() != I->getParent() || isa<PHINode>(IU);
501 }) && !
I->mayReadOrWriteMemory();
509 return !VL.
empty() &&
522 I * VecTyNumElements, VecTyNumElements)))
524 : Mask[
I] * VecTyNumElements + J;
534 unsigned SVNumElements =
536 unsigned ShuffleMaskSize = SV->getShuffleMask().size();
537 if (SVNumElements % ShuffleMaskSize != 0)
539 unsigned GroupSize = SVNumElements / ShuffleMaskSize;
540 if (GroupSize == 0 || (VL.
size() % GroupSize) != 0)
542 unsigned NumGroup = 0;
543 for (
size_t I = 0, E = VL.
size();
I != E;
I += GroupSize) {
545 Value *Src = SV->getOperand(0);
551 if (SV->getOperand(0) != Src)
554 if (!SV->isExtractSubvectorMask(Index))
556 ExpectedIndex.
set(Index / ShuffleMaskSize);
560 if (!ExpectedIndex.
all())
564 assert(NumGroup == (VL.
size() / GroupSize) &&
"Unexpected number of groups");
571 unsigned SVNumElements =
574 unsigned AccumulateLength = 0;
575 for (
Value *V : VL) {
577 for (
int M : SV->getShuffleMask())
579 : AccumulateLength + M);
580 AccumulateLength += SVNumElements;
607std::optional<TargetTransformInfo::ShuffleKind>
614 Value *Vec1 =
nullptr;
615 Value *Vec2 =
nullptr;
618 std::optional<bool> HasNonUndefVec;
619 auto IsNonUndefVecPresent = [&]() {
626 return Cache.isGuaranteedNotToBePoison(Vec, AC);
628 return *HasNonUndefVec;
631 ShuffleMode CommonShuffleMode =
Unknown;
633 for (
unsigned I = 0, E = VL.
size();
I < E; ++
I) {
643 auto *Vec = EI->getVectorOperand();
659 unsigned IntIdx = Idx->getValue().getZExtValue();
668 if (!Vec1 || Vec1 == Vec) {
670 }
else if (!Vec2 || Vec2 == Vec) {
685 else if (Vec != Vec1)
687 if (CommonShuffleMode == Permute)
691 if (Idx %
Size !=
I) {
692 CommonShuffleMode = Permute;
695 CommonShuffleMode =
Select;
698 if (CommonShuffleMode ==
Select && Vec2)
717 auto *Begin = std::next(Mask.begin(), Index);
718 std::iota(Begin, std::next(Begin, SubVecVF), 0);
719 Vec = Builder.CreateShuffleVector(V, Mask);
722 std::iota(Mask.begin(), Mask.end(), 0);
723 std::iota(std::next(Mask.begin(), Index),
724 std::next(Mask.begin(), Index + SubVecVF), VecVF);
726 return Generator(Vec, V, Mask);
729 std::iota(ResizeMask.
begin(), std::next(ResizeMask.
begin(), SubVecVF), 0);
730 V = Builder.CreateShuffleVector(V, ResizeMask);
732 return Builder.CreateShuffleVector(Vec, V, Mask);
736 unsigned SubVecVF,
unsigned Index) {
738 std::iota(Mask.begin(), Mask.end(), Index);
739 return Builder.CreateShuffleVector(Vec, Mask);
758template <
bool IsPoisonOnly>
761 using T = std::conditional_t<IsPoisonOnly, PoisonValue, UndefValue>;
795 for (
unsigned I = 0, E = VecTy->getNumElements();
I != E; ++
I) {
796 if (
Constant *Elem =
C->getAggregateElement(
I))
816 case Instruction::Load: {
820 case Instruction::Store: {
822 return (
SI->getPointerOperand() == Scalar);
824 case Instruction::Call: {
828 return isVectorIntrinsicWithScalarOpAtArg(ID, Arg.index(), TTI) &&
829 Arg.value().get() == Scalar;
847 return LI->isSimple();
849 return SI->isSimple();
851 return !
MI->isVolatile();
861 uint64_t ScalarSize =
DL.getTypeStoreSize(ScalarTy);
862 Conditions.
assign(PointerOps.
size(),
nullptr);
867 APInt OffsetAP(
DL.getIndexTypeSizeInBits(
GEP->getType()), 0);
868 if (!
GEP->accumulateConstantOffset(
DL, OffsetAP) || OffsetAP.
isNegative())
871 Base =
GEP->getPointerOperand();
876 Value *
T = Sel->getTrueValue();
877 Value *
F = Sel->getFalseValue();
883 }
else if (TrueBase !=
T || FalseBase !=
F) {
888 if (
Offset !=
static_cast<uint64_t
>(Idx) * ScalarSize)
890 Conditions[Idx] = Sel->getCondition();
892 return TrueBase !=
nullptr;
898 "Expected only load lanes in a blended load.");
899 const uint64_t ScalarSize =
DL.getTypeStoreSize(VL.
front()->getType());
905 return BaseAlignment;
911 Ptr =
GEP->getPointerOperand();
918 constexpr unsigned IndexIdx = 1;
922 bool AllSameTy =
true;
923 bool HasNonConstIdx =
false;
924 bool ConstsFitVL0Ty =
true;
927 if (
Op->getType() != VL0Ty)
932 if (
Op->getType() != VL0Ty)
934 HasNonConstIdx =
true;
938 ConstsFitVL0Ty =
false;
942 if (!HasNonConstIdx || VL0Ty == PtrIdxTy)
944 return ConstsFitVL0Ty ? VL0Ty :
nullptr;
949 if (UniquePtrs.
size() != PointerOps.
size())
951 auto IsConstantOffsetPtr = [](
Value *
P) {
956 auto *RefIt =
find_if_not(PointerOps, IsConstantOffsetPtr);
957 if (RefIt == PointerOps.
end())
960 if (!RefGEP || RefGEP->getNumOperands() != 2)
962 Value *
Base = RefGEP->getPointerOperand();
963 Type *PtrTy = RefGEP->getType();
964 Type *SrcElemTy = RefGEP->getSourceElementType();
966 Value *Stride =
nullptr;
967 unsigned CastOpcode = 0;
968 for (
Value *
P : PointerOps) {
969 if (
P->getType() != PtrTy)
974 if (!
GEP ||
GEP->getNumOperands() != 2 ||
975 GEP->getPointerOperand() !=
Base ||
976 GEP->getSourceElementType() != SrcElemTy)
981 unsigned LaneCastOpcode = 0;
983 LaneCastOpcode = Cast->getOpcode();
984 Idx = Cast->getOperand(0);
986 Value *LaneStride = Idx;
989 LaneStride = BO->getOperand(0);
991 LaneStride = BO->getOperand(1);
995 CastOpcode = LaneCastOpcode;
998 if (LaneStride != Stride || LaneCastOpcode != CastOpcode)
1001 return Stride !=
nullptr;
1005 bool ExtendingManyInputs) {
1006 if (SubMask.
empty())
1009 (!ExtendingManyInputs || SubMask.
size() > Mask.size() ||
1012 "SubMask with many inputs support must be larger than the mask.");
1014 Mask.append(SubMask.
begin(), SubMask.
end());
1018 int TermValue = std::min(Mask.size(), SubMask.
size());
1019 for (
int I = 0, E = SubMask.
size();
I < E; ++
I) {
1021 (!ExtendingManyInputs &&
1022 (SubMask[
I] >= TermValue || Mask[SubMask[
I]] >= TermValue)))
1024 NewMask[
I] = Mask[SubMask[
I]];
1030 const size_t Sz = Order.
size();
1033 for (
unsigned I = 0;
I < Sz; ++
I) {
1035 UnusedIndices.
reset(Order[
I]);
1037 MaskedIndices.
set(
I);
1039 if (MaskedIndices.
none())
1042 "Non-synced masked/available indices.");
1046 assert(Idx >= 0 &&
"Indices must be synced.");
1054 unsigned Opcode0,
unsigned Opcode1) {
1061 OpcodeMask.
set(Lane * ScalarTyNumElements,
1062 Lane * ScalarTyNumElements + ScalarTyNumElements);
1069 "Expected scalar constants.");
1072 std::fill_n(NewVal.begin() +
I * VF, VF, V);
1078 case Instruction::UDiv:
1079 return Intrinsic::masked_udiv;
1080 case Instruction::SDiv:
1081 return Intrinsic::masked_sdiv;
1082 case Instruction::URem:
1083 return Intrinsic::masked_urem;
1084 case Instruction::SRem:
1085 return Intrinsic::masked_srem;
1095 constexpr unsigned MaxIndexChainLength = 3;
1096 const User *U =
I->user_back();
1097 for ([[maybe_unused]]
unsigned _ :
seq<unsigned>(MaxIndexChainLength)) {
1113 unsigned Opcode = BO->getOpcode();
1114 Type *Ty = BO->getType();
1118 Opcode, Ty, Idx == 1) ||
1120 Opcode, Ty, Idx == 0)))
1124 const User *U =
I->user_back();
1136 if (!Wide || !Wide->hasOneUse())
1139 if (!Narrow || !Narrow->hasOneUse())
1141 Value *Src = Narrow->getOperand(0);
1144 if (MustBeElidable && !(Wide->hasAllowContract() && Wide->hasNoNaNs() &&
1145 Wide->hasNoInfs() && Narrow->hasAllowContract()))
1155struct NarrowedChainState {
1157 unsigned NarrowShift = 0;
1158 unsigned NarrowBW = 0;
1176 NarrowedChainState S,
unsigned Depth,
1180 if (
Depth < MaxDepth) {
1182 Z && Z->getSrcTy()->isIntegerTy() && !Z->getSrcTy()->isIntegerTy(1)) {
1185 Depth + 1, MaxDepth, Leaves, ChainInsts);
1188 if (BO->getOpcode() == RdxOpcode) {
1191 Depth + 1, MaxDepth, Leaves, ChainInsts);
1193 Depth + 1, MaxDepth, Leaves, ChainInsts);
1197 unsigned BW = V->getType()->getScalarSizeInBits();
1199 if (BO->getOpcode() == Instruction::Shl && Z && S.NarrowBW == 0 &&
1201 Z->getSrcTy()->isIntegerTy() && !Z->getSrcTy()->isIntegerTy(1) &&
1203 Z->getSrcTy()->getIntegerBitWidth() + Amt->
getZExtValue() <= BW) &&
1209 Depth + 1, MaxDepth, Leaves,
1216 if (BW < WideBW && (S.NarrowBW == 0 || BW == S.NarrowBW)) {
1217 if (BO->getOpcode() == Instruction::Shl &&
1220 S.Shift + S.NarrowShift + Amt->
getZExtValue() < WideBW) {
1222 if (BO->hasNoUnsignedWrap() && S.NarrowBW == 0) {
1229 if (S.NarrowBW == 0) {
1236 S,
Depth + 1, MaxDepth, Leaves,
1242 if (S.NarrowBW == 0) {
1246 S.NarrowMask &= *Amt << S.NarrowShift;
1248 MaxDepth, Leaves, ChainInsts);
1254 S.getMask(V->getType()->getScalarSizeInBits()));
1262 0, MaxDepth, Leaves, ChainInsts);
1266 assert(
F &&
"Expected function.");
1272static std::optional<std::tuple<Value *, unsigned, unsigned>>
1274 if (!V->getType()->isIntegerTy())
1275 return std::nullopt;
1278 auto GetFieldOffset = [](
const APInt *Amt,
unsigned BitWidth,
1279 unsigned FieldWidth) -> std::optional<unsigned> {
1281 if (ShAmt % FieldWidth != 0 || ShAmt + FieldWidth >
BitWidth)
1282 return std::nullopt;
1283 return ShAmt / FieldWidth;
1288 auto MatchLowField =
1290 unsigned FieldWidth) -> std::optional<std::pair<Value *, unsigned>> {
1296 if (std::optional<unsigned>
Offset = GetFieldOffset(
1297 Amt, Src->getType()->getIntegerBitWidth(), FieldWidth)) {
1300 return std::make_pair(Src, *
Offset);
1302 return std::nullopt;
1305 Src->getType()->getIntegerBitWidth() >= FieldWidth)
1306 return std::make_pair(Src, 0u);
1309 return std::make_pair(Val, 0u);
1310 return std::nullopt;
1316 unsigned FieldWidth = 0;
1318 FieldWidth = Mask->popcount();
1321 if (FieldWidth != 0) {
1322 if (std::optional<std::pair<Value *, unsigned>>
Field =
1323 MatchLowField(Val, FieldWidth))
1324 return std::make_tuple(
Field->first, FieldWidth,
Field->second);
1325 return std::nullopt;
1327 unsigned LaneWidth = V->getType()->getIntegerBitWidth();
1331 unsigned SrcWidth = Src->getType()->getIntegerBitWidth();
1334 if (std::optional<unsigned>
Offset =
1335 GetFieldOffset(Amt, SrcWidth, LaneWidth))
1336 return std::make_tuple(Src, LaneWidth, *
Offset);
1338 unsigned FieldWidth = SrcWidth - ShAmt;
1339 if (FieldWidth > 0 && FieldWidth < LaneWidth && ShAmt % FieldWidth == 0)
1340 return std::make_tuple(Src, FieldWidth, ShAmt / FieldWidth);
1341 return std::nullopt;
1346 unsigned ShfWidth = Src->getType()->getIntegerBitWidth();
1348 unsigned FieldWidth = ShfWidth - ShAmt;
1349 if (FieldWidth > 0 && ShAmt % FieldWidth == 0) {
1351 return std::make_tuple(Src, FieldWidth, ShAmt / FieldWidth);
1353 return std::nullopt;
1356 return std::make_tuple(Src, LaneWidth, 0u);
1357 return std::nullopt;
1360std::optional<std::tuple<Value *, unsigned, SmallVector<int>>>
1365 if (VL.
size() < 2 || !VL.
front()->getType()->isIntegerTy() ||
isSplat(VL) ||
1367 return std::nullopt;
1368 Value *Src =
nullptr;
1369 unsigned FieldWidth = 0;
1374 if (V->getType() != VL.
front()->getType())
1375 return std::nullopt;
1376 std::optional<std::tuple<Value *, unsigned, unsigned>>
Field =
1378 if (!
Field || (Src && (Src != std::get<0>(*
Field) ||
1379 FieldWidth != std::get<1>(*
Field))))
1380 return std::nullopt;
1381 Src = std::get<0>(*
Field);
1382 FieldWidth = std::get<1>(*
Field);
1383 Mask[Idx] = std::get<2>(*
Field);
1389 Src->getType()->getIntegerBitWidth() % FieldWidth != 0)
1390 return std::nullopt;
1396 return std::nullopt;
1397 return std::make_tuple(Src, FieldWidth, std::move(Mask));
1405 unsigned BitWidth = V->getType()->getScalarSizeInBits();
1455 unsigned NumElts = PossibleBits.
size();
1458 for (
unsigned Idx :
seq(NumElts)) {
1459 APInt Possible = PossibleBits[Idx].shl(ShlAmts[Idx]) & Masks[Idx];
1464 return std::nullopt;
1465 if (Info.FieldWidth == 0) {
1466 if (W % 8 != 0 ||
BitWidth % W != 0)
1467 return std::nullopt;
1468 Info.FieldWidth = W;
1471 if (W != Info.FieldWidth ||
Lo % W != 0)
1472 return std::nullopt;
1475 return std::nullopt;
1476 Info.LaneOfField[
Field] = Idx;
1477 Info.LShrAmts[Idx] =
Lo - ShlAmts[Idx];
1479 if (Info.FieldWidth == 0)
1480 return std::nullopt;
1485 unsigned NumElts,
unsigned BytesPerLane) {
1486 unsigned BytesPerField = Info.FieldWidth / 8;
1488 for (
unsigned J :
seq(NumBytes)) {
1489 unsigned Lane = Info.LaneOfField[J / BytesPerField];
1491 ? (
int)(NumElts * BytesPerLane)
1492 : (
int)(Lane * BytesPerLane + J % BytesPerField));
1498 Type *ResultTy,
unsigned ShiftWidth,
unsigned &NumInsts) {
1501 unsigned BitWidth = VecTy->getScalarSizeInBits();
1503 "The byte-multiple field width divides the result bit width.");
1504 unsigned NumElts = VecTy->getNumElements();
1510 Y = Z->getOperand(0);
1512 Y = Builder.CreateTrunc(
1518 if (Info.needsShift()) {
1520 for (uint64_t
A : Info.LShrAmts)
1526 unsigned InBytes = NumElts * (ShiftWidth / 8);
1534 Value *Fields = Builder.CreateTrunc(
1535 Y,
Y->getType()->getWithNewBitWidth(Info.FieldWidth));
1536 NumInsts += 1 + (Info.FieldWidth != ShiftWidth) + IsReversed;
1537 if (IsReversed && Info.FieldWidth == 8)
1538 return Builder.CreateUnaryIntrinsic(
1539 Intrinsic::bswap, Builder.CreateBitCast(Fields, ResultTy));
1541 Fields = Builder.CreateVectorReverse(Fields);
1542 return Builder.CreateBitCast(Fields, ResultTy);
1544 Value *Packed = Builder.CreateShuffleVector(
1545 Builder.CreateBitCast(
Y, ByteTy),
1551 return Builder.CreateBitCast(Packed, ResultTy);
1559 if (!DVR->isDbgValue())
1562 if (ExI && MarkedI->
getParent() != ExI->getParent())
1564 if (!ExI || ExI->comesBefore(MarkedI)) {
1565 DVR->replaceVariableLocationOp(&From, &To);
1569 auto HasSameVar = [&](
auto Records) {
1575 if (HasSameVar(
make_range(std::next(DVR->getIterator()),
1578 std::next(ExI->getIterator())),
1580 return HasSameVar(I.getDbgRecordRange());
1585 ExI->getParent()->insertDbgRecordAfter(NewDVR, ExI);
1593 const auto *I1 = IE1;
1594 const auto *I2 = IE2;
1606 if (I1 && (I1 == IE1 || I1->hasOneUse()) &&
1609 if (I2 && ((I2 == IE2 || I2->
hasOneUse())) &&
1612 }
while ((I1 && PrevI1 != I1) || (I2 && PrevI2 != I2));
1626 unsigned AggregateSize = 1;
1628 Type *CurrentType =
IV->getType();
1631 for (
auto *Elt : ST->elements())
1632 if (Elt != ST->getElementType(0))
1633 return std::nullopt;
1634 AggregateSize *= ST->getNumElements();
1635 CurrentType = ST->getElementType(0);
1637 AggregateSize *= AT->getNumElements();
1638 CurrentType = AT->getElementType();
1640 AggregateSize *= VT->getNumElements();
1641 return AggregateSize;
1643 return AggregateSize;
1645 return std::nullopt;
1651 assert(L &&
"Expected valid loop");
1656 while (L && IsLoopInvariant(L, VL))
1657 L = L->getParentLoop();
1662 unsigned LoopAwareTripCount) {
1663 if (LoopAwareTripCount == 0)
1672 if (!L->getExitingBlock())
1673 return std::min<unsigned>(LoopAwareTripCount, Scale);
1676 return LoopAwareTripCount;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Register Bank Select
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static MaybeAlign getAlign(Value *Ptr)
static std::pair< Value *, APInt > getMask(Value *WideMask, unsigned Factor, ElementCount LeafValueEC)
uint64_t IntrinsicInst * II
OptimizedStructLayoutField Field
Provides some synthesis utilities to produce sequences of values.
This file defines the SmallPtrSet class.
static TableGen::Emitter::Opt Y("gen-skeleton-entry", EmitSkeleton, "Generate example skeleton entry")
static const uint32_t IV[8]
Class for arbitrary precision integers.
static APInt getAllOnes(unsigned numBits)
Return an APInt of a specified width with all bits set.
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
uint64_t getZExtValue() const
Get zero extended value.
unsigned getActiveBits() const
Compute the number of active bits in the value.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
bool ult(const APInt &RHS) const
Unsigned less than comparison.
bool isNegative() const
Determine sign of this APInt.
bool isShiftedMask() const
Return true if this APInt value contains a non-empty sequence of ones with the remainder zero.
uint64_t getLimitedValue(uint64_t Limit=UINT64_MAX) const
If this value is smaller than the specified limit, return it, otherwise return the limit value.
LLVM_ABI APInt uadd_sat(const APInt &RHS) const
APInt shl(unsigned shiftAmt) const
Left-shift function.
LLVM_ABI APInt umul_sat(const APInt &RHS) const
static APInt getLowBitsSet(unsigned numBits, unsigned loBitsSet)
Constructs an APInt value that has the bottom loBitsSet bits set.
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
const T & front() const
Get the first element.
size_t size() const
Get the array size.
bool empty() const
Check if the array is empty.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
const T & consume_front()
consume_front() - Returns the first element and drops it from ArrayRef.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
iterator_range< User::op_iterator > args()
Iteration adapter for range-for loops.
This class represents a function call, abstracting a target machine's calling convention.
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
static LLVM_ABI Constant * getBinOpAbsorber(unsigned Opcode, Type *Ty, bool AllowLHSConstant=false)
Return the absorbing element for the given binary operation, i.e.
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 * get(ArrayRef< Constant * > V)
This is an important base class in LLVM.
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
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....
LLVM_ABI void replaceVariableLocationOp(Value *OldValue, Value *NewValue, bool AllowEmpty=false)
LLVM_ABI DbgVariableRecord * clone() const
static DebugLoc getUnknown()
Identifies a unique instance of a whole variable (discards/ignores fragment information).
static LLVM_ABI FixedVectorType * get(Type *ElementType, unsigned NumElts)
Common base class shared among various IRBuilders.
This instruction inserts a single (scalar) element into a VectorType value.
iterator_range< simple_ilist< DbgRecord >::iterator > getDbgRecordRange() const
Return a range over the DbgRecords attached to this instruction.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
An instruction for reading from memory.
Value * getPointerOperand()
Represents a single loop in the control flow graph.
This is the common base class for memset/memcpy/memmove.
Representation for a specific memory location.
static LLVM_ABI MemoryLocation get(const LoadInst *LI)
Return a location with information about the memory reference by the given instruction.
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
The main scalar evolution driver.
LLVM_ABI unsigned getSmallConstantTripCount(const Loop *L)
Returns the exact trip count of the loop if we can compute it, and the result is a small constant.
This class represents the LLVM 'select' instruction.
static LLVM_ABI bool isIdentityMask(ArrayRef< int > Mask, int NumSrcElts)
Return true if this shuffle mask chooses elements from exactly one source vector without lane crossin...
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
int find_first() const
Returns the index of the first set bit, -1 if none of the bits are set.
bool test(unsigned Idx) const
Returns true if bit Idx is set.
int find_next(unsigned Prev) const
Returns the index of the next set bit following the "Prev" bit.
bool all() const
Returns true if all bits are set.
size_type count() const
Returns the number of bits which are set.
bool none() const
Returns true if none of the bits are set.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
reference emplace_back(ArgTypes &&... Args)
void swap(SmallVectorImpl &RHS)
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.
Provides information about what library functions are available for the current target.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI unsigned getIntegerBitWidth() const
bool isIntOrIntVectorTy() const
Return true if this is an integer type or a vector of integer types.
bool isSingleValueType() const
Return true if the type is a valid type for a register in codegen.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
A Use represents the edge between a Value definition and its users.
Value * getOperand(unsigned i) const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
bool hasOneUse() const
Return true if there is exactly one use of this value.
bool hasUseList() const
Check if this Value has a use-list.
LLVM_ABI bool hasNUsesOrMore(unsigned N) const
Return true if this value has N uses or more.
iterator_range< use_iterator > uses()
constexpr ScalarTy getFixedValue() const
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
self_iterator getIterator()
A raw_ostream that writes to an std::string.
Caches the results of the expensive analyses that are queried repeatedly for the same values while th...
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
const APInt & umin(const APInt &A, const APInt &B)
Determine the smaller of two APInts considered to be unsigned.
const APInt & umax(const APInt &A, const APInt &B)
Determine the larger of two APInts considered to be unsigned.
BinaryOp_match< LHS, RHS, Instruction::And > m_And(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Add > m_Add(const LHS &L, const RHS &R)
ap_match< APInt > m_APInt(const APInt *&Res)
Match a ConstantInt or splatted ConstantVector, binding the specified pointer to the contained APInt.
BinaryOp_match< LHS, RHS, Instruction::And, true > m_c_And(const LHS &L, const RHS &R)
Matches an And with LHS and RHS in either order.
CastInst_match< OpTy, TruncInst > m_Trunc(const OpTy &Op)
Matches Trunc.
BinaryOp_match< LHS, RHS, Instruction::Xor > m_Xor(const LHS &L, const RHS &R)
bool match(Val *V, const Pattern &P)
BinOpPred_match< LHS, RHS, is_right_shift_op > m_Shr(const LHS &L, const RHS &R)
Matches logical shift operations.
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.
auto m_Value()
Match an arbitrary value and ignore it.
BinaryOp_match< LHS, RHS, Instruction::Mul > m_Mul(const LHS &L, const RHS &R)
CastInst_match< OpTy, ZExtInst > m_ZExt(const OpTy &Op)
Matches ZExt.
OverflowingBinaryOp_match< LHS, RHS, Instruction::Sub, OverflowingBinaryOperator::NoUnsignedWrap > m_NUWSub(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::LShr > m_LShr(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Shl > m_Shl(const LHS &L, const RHS &R)
BinaryOp_match< LHS, RHS, Instruction::Or > m_Or(const LHS &L, const RHS &R)
CastInst_match< OpTy, SExtInst > m_SExt(const OpTy &Op)
Matches SExt.
A private "module" namespace for types and utilities used by this pass.
std::optional< unsigned > getExtractIndex(const Instruction *E)
template SmallBitVector isUndefVector< true >(const Value *, const SmallBitVector &)
Value * createInsertVector(IRBuilderBase &Builder, Value *Vec, Value *V, unsigned Index, function_ref< Value *(Value *, Value *, ArrayRef< int >)> Generator)
Creates subvector insert.
bool areAllOperandsNonInsts(Value *V)
Checks if the provided value does not require scheduling.
std::optional< unsigned > getElementIndex(const Value *Inst, unsigned Offset)
DebugLoc getDebugLocFromPHI(const PHINode &PN)
bool doesInTreeUserNeedToExtract(Value *Scalar, Instruction *UserInst, TargetLibraryInfo *TLI, const TargetTransformInfo *TTI)
bool isCopyableGEPAddressVector(ArrayRef< Value * > PointerOps)
Checks if the pointers PointerOps of the gathered loads, which are not compatible in the usual sense ...
std::optional< std::tuple< Value *, unsigned, SmallVector< int > > > matchGatheredExtractedFields(ArrayRef< Value * > VL, const DataLayout &DL)
Checks if the values in VL are zero-extended sub-fields of the same wider integer scalar.
MemoryLocation getLocation(Instruction *I)
std::optional< BitPackInfo > computeBitPackInfo(unsigned BitWidth, ArrayRef< APInt > PossibleBits, ArrayRef< uint64_t > ShlAmts, ArrayRef< APInt > Masks)
Computes the bitfield packing layout from the per-lane possibly set bits of the source values,...
bool isSelectedBaseLoad(Type *ScalarTy, ArrayRef< Value * > PointerOps, const DataLayout &DL, Value *&TrueBase, Value *&FalseBase, SmallVectorImpl< Value * > &Conditions)
Checks if the loads with scalar type ScalarTy and pointer operands PointerOps are each (optionally vi...
SmallBitVector getAltInstrMask(ArrayRef< Value * > VL, Type *ScalarTy, unsigned Opcode0, unsigned Opcode1)
SmallBitVector isUndefVector(const Value *V, const SmallBitVector &UseMask)
Checks if the given value is actually an undefined constant vector.
Intrinsic::ID getMaskedDivRemIntrinsic(unsigned Opcode)
bool isUsedOutsideBlock(Value *V)
Checks if the provided value does not require scheduling.
bool doesNotNeedToSchedule(ArrayRef< Value * > VL)
Checks if the specified array of instructions does not require scheduling.
std::optional< unsigned > getInsertExtractIndex(const Value *Inst, unsigned Offset)
void redirectDbgValues(Instruction &From, Value &To)
The debug values of the erased From are kept on its replacement To.
void reorderScalars(SmallVectorImpl< Value * > &Scalars, ArrayRef< int > Mask)
Reorders the list of scalars in accordance with the given Mask.
SmallVector< int > getBitPackMask(const BitPackInfo &Info, unsigned NumBytes, unsigned NumElts, unsigned BytesPerLane)
Returns the byte shuffle mask packing the per-lane fields of the shifted lanes (BytesPerLane bytes ea...
SelectInst * getBlendedLoadSelect(ArrayRef< Value * > VL)
Returns the select instruction picking between the candidate base pointers of the blended loads VL.
static std::optional< std::tuple< Value *, unsigned, unsigned > > matchExtractedField(Value *V)
Checks if V is a zero-extended sub-field of a wider integer scalar.
bool allSameType(ArrayRef< Value * > VL)
void combineOrders(MutableArrayRef< unsigned > Order, ArrayRef< unsigned > SecondaryOrder)
Fills unset elements of Order (marked with the sentinel value equal to the order size) with the corre...
bool allSameOpcode(ArrayRef< Value * > VL)
bool isSplat(ArrayRef< Value * > VL)
unsigned getNumElements(Type *Ty)
std::string shortBundleName(ArrayRef< Value * > VL, int Idx)
Print a short descriptor of the instruction bundle suitable for debug output.
unsigned getLoopTripCount(const Loop *L, ScalarEvolution &SE, unsigned LoopAwareTripCount)
bool isOnceUsedSeed(const Instruction *I)
Returns true if I forms a vectorizable bundle on its own and its single user does not tear the vector...
unsigned getPartNumElems(unsigned Size, unsigned NumParts)
Returns power-of-2 number of elements in a single register (part), given the total number of elements...
constexpr unsigned MaxBitPackAnalysisDepth
Deeper than the standard analysis recursion depth to keep the numeric bound precise through arithmeti...
bool isCommutableOperand(const Instruction *I, Value *ValWithUses, unsigned Op, bool IsCopyable)
Checks if the operand is commutative.
Align computeBlendedLoadBaseAlignment(ArrayRef< Value * > VL, const DataLayout &DL)
Returns the alignment of the shared base pointer of a blended load for the loads VL.
TargetTransformInfo::TargetCostKind getSLPCostKind(const Function *F)
bool isReverseOrder(ArrayRef< unsigned > Order)
Check if Order represents reverse order.
Type * getCommonGEPIndexType(ArrayRef< Value * > VL, Instruction *VL0, function_ref< bool(Value *)> IsGEPLane, const DataLayout &DL)
Returns the common type for the indices of the single-index GEP lanes of a GEP node with the main op ...
void transformScalarShuffleIndiciesToVector(unsigned VecTyNumElements, SmallVectorImpl< int > &Mask)
SmallVector< int > calculateShufflevectorMask(ArrayRef< Value * > VL)
SmallBitVector buildUseMask(int VF, ArrayRef< int > Mask, UseMask MaskArg)
Prepares a use bitset for the given mask either for the first argument or for the second.
bool isCommutative(const Instruction *I, const Value *ValWithUses, bool IsCopyable)
template SmallBitVector isUndefVector< false >(const Value *, const SmallBitVector &)
unsigned getNumberOfPotentiallyCommutativeOps(Instruction *I)
bool allConstant(ArrayRef< Value * > VL)
template std::optional< unsigned > getInsertExtractIndex< InsertElementInst >(const Value *, unsigned)
void inversePermutation(ArrayRef< unsigned > Indices, SmallVectorImpl< int > &Mask)
Compute the inverse permutation Mask of Indices.
bool allSameBlock(ArrayRef< Value * > VL)
bool isReassocChainLink(const Instruction *I)
Intrinsic::ID isEquivalentIntrinsicID(Intrinsic::ID LHS, Intrinsic::ID RHS)
Checks if LHS and RHS are the same intrinsic, or one is llvm.fma and the other is llvm....
std::optional< TargetTransformInfo::ShuffleKind > isFixedVectorShuffle(ArrayRef< Value * > VL, SmallVectorImpl< int > &Mask, AssumptionCache *AC, SLPAnalysisCache &Cache)
Checks if the vector of instructions can be represented as a shuffle, like: x0 = extractelement <4 x ...
UseMask
Specifies the way the mask should be analyzed for undefs/poisonous elements in the shuffle mask.
@ SecondArg
The mask is expected to be for permutation of 2 vectors, check for the mask elements for the second a...
@ UndefsAsMask
Consider undef mask elements (-1) as placeholders for future shuffle elements and mark them as ones a...
@ FirstArg
The mask is expected to be for permutation of 1-2 vectors, check for the mask elements for the first ...
void reorderOrder(SmallVectorImpl< unsigned > &Order, ArrayRef< int > Mask, bool BottomOrder)
Reorders the given Order according to the given Mask.
static void collectNarrowedLeavesImpl(Value *V, unsigned RdxOpcode, unsigned WideBW, NarrowedChainState S, unsigned Depth, unsigned MaxDepth, SmallVectorImpl< NarrowedLeafInfo > &Leaves, SmallVectorImpl< Instruction * > &ChainInsts)
void reorderReuses(SmallVectorImpl< int > &Reuses, ArrayRef< int > Mask)
Reorders the given Reuses mask according to the given Mask.
void addMask(SmallVectorImpl< int > &Mask, ArrayRef< int > SubMask, bool ExtendingManyInputs)
Shuffles Mask in accordance with the given SubMask.
bool isSimple(Instruction *I)
Instruction * lookThroughCastRoundTrip(Value *V, bool MustBeElidable)
If V is a single-use fpext of a single-use fptrunc forming a round-trip back to the type of V,...
std::optional< unsigned > getAggregateSize(Instruction *InsertInst)
const LoadInst * getLoadOfUndefTolerantBinOp(const Value *V)
bool isBinOpIdentityConstant(const Value *V, unsigned Opcode)
bool isUndefTolerantBinOp(const Value *V)
APInt getScalarMaxValue(const Value *V, unsigned Depth)
Returns a saturating unsigned upper bound of the scalar V.
Value * buildBitPack(IRBuilderBase &Builder, Value *X, const BitPackInfo &Info, Type *ResultTy, unsigned ShiftWidth, unsigned &NumInsts)
Builds the bitfield packing of X into ResultTy per the layout and the shift width.
unsigned getShufflevectorNumGroups(ArrayRef< Value * > VL)
const Loop * findInnermostNonInvariantLoop(const Loop *L, ArrayRef< Value * > VL)
SmallVector< Constant * > replicateMask(ArrayRef< Constant * > Val, unsigned VF)
Replicates the given Val VF times.
unsigned getReassocCombineOpcode(unsigned Opcode)
bool isVectorLikeInstWithConstOps(Value *V)
Checks if V is one of vector-like instructions, i.e.
bool doesNotNeedToBeScheduled(Value *V)
Checks if the specified value does not require scheduling.
unsigned getNumElems(unsigned Size, unsigned PartNumElems, unsigned Part)
Returns correct remaining number of elements, considering total amount Size, (power-of-2 number) of e...
constexpr int UsesLimit
Limit of the number of uses for potentially transformed instructions/values, used in checks to avoid ...
bool isFirstInsertElement(const InsertElementInst *IE1, const InsertElementInst *IE2)
void collectNarrowedLeaves(Value *V, unsigned RdxOpcode, unsigned WideBW, unsigned MaxDepth, SmallVectorImpl< NarrowedLeafInfo > &Leaves, SmallVectorImpl< Instruction * > &ChainInsts)
Recursively collects the narrow leaves of the widened reduction value V.
bool isRepeatedNonIdentityClusteredMask(ArrayRef< int > Mask, unsigned Sz)
Checks if the given mask is a "clustered" mask with the same clusters of size Sz, which are not ident...
bool isConstant(Value *V)
static bool isNonProfitableIndex(const Instruction *I)
Returns true if I is a part of a single-use chain, computing an address, which does not pay off the v...
Value * createExtractVector(IRBuilderBase &Builder, Value *Vec, unsigned SubVecVF, unsigned Index)
Generates subvector extract.
template std::optional< unsigned > getInsertExtractIndex< ExtractElementInst >(const Value *, unsigned)
void fixupOrderingIndices(MutableArrayRef< unsigned > Order)
Order may have elements assigned special value (size) which is out of bounds.
This is an optimization pass for GlobalISel generic memory operations.
constexpr auto not_equal_to(T &&Arg)
Functor variant of std::not_equal_to that can be used as a UnaryPredicate in functional algorithms li...
LLVM_ABI std::optional< unsigned > getLoopEstimatedTripCount(Loop *L, unsigned *EstimatedLoopInvocationWeight=nullptr)
Return either:
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 Intrinsic::ID getVectorIntrinsicIDForCall(const CallInst *CI, const TargetLibraryInfo *TLI)
Returns intrinsic ID for call.
LLVM_ABI void findDbgValues(Value *V, SmallVectorImpl< DbgVariableRecord * > &DbgVariableRecords)
Finds the dbg.values describing a value.
@ Unknown
Not 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.
constexpr from_range_t from_range
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
bool isVectorizedTy(Type *Ty)
Returns true if Ty is a vector type or a struct of vector types where all vector types share the same...
T bit_ceil(T Value)
Returns the smallest integral power of two no smaller than Value if Value is nonzero.
auto make_isa_range(RangeT &&Range)
Return a range over Range containing only elements for which isa<T> holds, casting each of them to T.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
constexpr unsigned MaxAnalysisRecursionDepth
auto reverse(ContainerTy &&C)
ElementCount getVectorizedTypeVF(Type *Ty)
Returns the number of vector elements for a vectorized type.
auto find_if_not(R &&Range, UnaryPredicate P)
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly.
iterator_range< filter_iterator< detail::IterOfRange< RangeT >, PredicateT > > make_filter_range(RangeT &&Range, PredicateT Pred)
Convenience function that takes a range of elements and a predicate, and return a new filter_iterator...
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...
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
constexpr int PoisonMaskElem
iterator_range(Container &&) -> iterator_range< llvm::detail::IterOfRange< Container > >
constexpr T divideCeil(U Numerator, V Denominator)
Returns the integer ceil(Numerator / Denominator).
@ First
Helpers to iterate all locations in the MemoryEffectsBase class.
DWARFExpression::Operation Op
constexpr unsigned BitWidth
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
constexpr auto seq(T Begin, T End)
Iterate over an integral type from Begin up to - but not including - End.
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Align commonAlignment(Align A, uint64_t Offset)
Returns the alignment that satisfies both alignments.
bool equal(L &&LRange, R &&RRange)
Wrapper function around std::equal to detect if pair-wise elements between two ranges are the same.
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
LLVM_ABI bool mayHaveNonDefUseDependency(const Instruction &I)
Returns true if the result or effects of the given instructions I depend values not reachable through...
constexpr detail::IsaCheckPredicate< Types... > IsaPred
Function object wrapper for the llvm::isa type check.
This struct is a compact representation of a valid (non-zero power of two) alignment.
Description of a bitfield packing of vector lanes into a scalar value: every lane contributes a disjo...
static constexpr unsigned NoLane
SmallVector< uint64_t, 8 > LShrAmts
Per-lane right-shift amounts bringing the field content to the low bits.