53 if (Negated && Opcode == Instruction::FAdd)
54 Opcode = Instruction::FSub;
80 case Instruction::Sub:
81 return Instruction::Add;
82 case Instruction::FSub:
83 return Instruction::FAdd;
90 if (
I->getOpcode() == Instruction::Sub)
92 if (
I->getOpcode() == Instruction::FSub)
93 return I->hasAllowReassoc();
94 return I->isAssociative();
102 switch (
I->getOpcode()) {
103 case Instruction::ExtractValue:
104 case Instruction::InsertValue:
106 case Instruction::ExtractElement:
109 case Instruction::InsertElement:
119 "ScalableVectorType is not supported.");
130 return std::min<unsigned>(PartNumElems,
Size - Part * PartNumElems);
138 OS <<
"Idx: " << Idx <<
", ";
139 OS <<
"n=" << VL.
size() <<
" [" << *VL.
front() <<
", ..]";
154 return !isa<PoisonValue>(V);
160 if (BB !=
II->getParent())
173 Value *FirstNonUndef =
nullptr;
176 if (!FirstNonUndef) {
180 if (V != FirstNonUndef)
183 return FirstNonUndef !=
nullptr;
189 if ((LHS == Intrinsic::fma || LHS == Intrinsic::fmuladd) &&
190 (RHS == Intrinsic::fma || RHS == Intrinsic::fmuladd))
191 return Intrinsic::fma;
199 return isa<CmpInst>(ValWithUses) && Cmp->isCommutative();
201 return BO->isCommutative() ||
202 (BO->getOpcode() == Instruction::Sub && ValWithUses->
hasUseList() &&
209 if (match(U.getUser(),
210 m_ICmp(Pred, m_Specific(U.get()), m_Zero())) &&
211 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE))
215 auto *I = dyn_cast<BinaryOperator>(U.get());
216 return match(U.getUser(),
217 m_Intrinsic<Intrinsic::abs>(
218 m_Specific(U.get()), m_ConstantInt(Flag))) &&
219 ((!IsCopyable && I && !I->hasNoSignedWrap()) ||
222 (BO->getOpcode() == Instruction::FSub && ValWithUses->
hasUseList() &&
225 return match(U.getUser(),
226 m_Intrinsic<Intrinsic::fabs>(m_Specific(U.get())));
228 return I->isCommutative();
236 "The instruction is not commutative.");
240 switch (BO->getOpcode()) {
241 case Instruction::Sub:
242 case Instruction::FSub:
248 return I->isCommutableOperand(
Op);
255 constexpr unsigned IntrinsicNumOperands = 2;
256 return IntrinsicNumOperands;
258 return I->getNumOperands();
273 Type *CurrentType =
IV->getType();
274 for (
unsigned I :
IV->indices()) {
276 Index *= ST->getNumElements();
277 CurrentType = ST->getElementType(
I);
279 Index *= AT->getNumElements();
280 CurrentType = AT->getElementType();
299 if (auto *CI = dyn_cast<CmpInst>(V))
300 return BasePred == CI->getPredicate();
301 if (auto *I = dyn_cast<Instruction>(V))
302 return I->getOpcode() == Opcode;
303 return isa<PoisonValue>(V);
308 unsigned Opcode = E->getOpcode();
309 assert((Opcode == Instruction::ExtractElement ||
310 Opcode == Instruction::ExtractValue) &&
311 "Expected extractelement or extractvalue instruction.");
312 if (Opcode == Instruction::ExtractElement)
315 if (EI->getNumIndices() != 1)
317 return *EI->idx_begin();
323 const unsigned E = Indices.
size();
325 for (
unsigned I = 0;
I < E; ++
I)
326 Mask[Indices[
I]] =
I;
330 assert(!Mask.empty() &&
"Expected non-empty mask.");
334 for (
unsigned I = 0, E = Prev.
size();
I < E; ++
I)
336 Scalars[Mask[
I]] = Prev[
I];
340 assert(!Mask.empty() && Reuses.
size() == Mask.size() &&
341 "Expected non-empty mask.");
344 for (
unsigned I = 0, E = Prev.
size();
I < E; ++
I)
346 Reuses[Mask[
I]] = Prev[
I];
351 assert(!Mask.empty() &&
"Expected non-empty mask.");
352 unsigned Sz = Mask.size();
357 std::iota(PrevOrder.
begin(), PrevOrder.
end(), 0);
359 PrevOrder.
swap(Order);
362 for (
unsigned I = 0;
I < Sz; ++
I)
364 Order[
I] = PrevOrder[Mask[
I]];
366 return Data.value() == Sz ||
Data.index() ==
Data.value();
377 std::iota(MaskOrder.
begin(), MaskOrder.
end(), 0);
387 for (
unsigned I = 0;
I < Sz; ++
I)
389 Order[MaskOrder[
I]] =
I;
395 "Order is empty. Please check it before using isReverseOrder.");
396 unsigned Sz = Order.
size();
398 return Pair.value() == Sz || Sz - Pair.index() - 1 == Pair.value();
406 for (
unsigned I = Sz, E = Mask.size();
I < E;
I += Sz) {
417 "Expected same size of orders");
418 size_t Sz = Order.
size();
421 if (Order[Idx] != Sz)
422 UsedIndices.
set(Order[Idx]);
424 if (SecondaryOrder.
empty()) {
426 if (Order[Idx] == Sz && !UsedIndices.
test(Idx))
430 if (SecondaryOrder[Idx] != Sz && Order[Idx] == Sz &&
431 !UsedIndices.
test(SecondaryOrder[Idx]))
432 Order[Idx] = SecondaryOrder[Idx];
437 assert(!VL.
empty() &&
"Expected non-empty list of values.");
439 return all_of(VL, [&](
Value *V) {
return V->getType() == Ty; });
445 static_assert(std::is_same_v<T, InsertElementInst> ||
446 std::is_same_v<T, ExtractElementInst>,
453 constexpr bool IsInsert = std::is_same_v<T, InsertElementInst>;
454 Type *VecTy = IsInsert ? IE->getType() : IE->getOperand(0)->getType();
461 if (CI->getValue().uge(VT->getNumElements()))
464 Index *= VT->getNumElements();
465 Index += CI->getZExtValue();
471template std::optional<unsigned>
473template std::optional<unsigned>
482 return isa<PHINode>(IO) || IO->getParent() != I->getParent();
493 auto *IU = dyn_cast<Instruction>(U);
496 return IU->getParent() != I->getParent() || isa<PHINode>(IU);
497 }) && !
I->mayReadOrWriteMemory();
505 return !VL.
empty() &&
518 I * VecTyNumElements, VecTyNumElements)))
520 : Mask[
I] * VecTyNumElements + J;
530 unsigned SVNumElements =
532 unsigned ShuffleMaskSize = SV->getShuffleMask().size();
533 if (SVNumElements % ShuffleMaskSize != 0)
535 unsigned GroupSize = SVNumElements / ShuffleMaskSize;
536 if (GroupSize == 0 || (VL.
size() % GroupSize) != 0)
538 unsigned NumGroup = 0;
539 for (
size_t I = 0, E = VL.
size();
I != E;
I += GroupSize) {
541 Value *Src = SV->getOperand(0);
547 if (SV->getOperand(0) != Src)
550 if (!SV->isExtractSubvectorMask(Index))
552 ExpectedIndex.
set(Index / ShuffleMaskSize);
556 if (!ExpectedIndex.
all())
560 assert(NumGroup == (VL.
size() / GroupSize) &&
"Unexpected number of groups");
567 unsigned SVNumElements =
570 unsigned AccumulateLength = 0;
571 for (
Value *V : VL) {
573 for (
int M : SV->getShuffleMask())
575 : AccumulateLength + M);
576 AccumulateLength += SVNumElements;
603std::optional<TargetTransformInfo::ShuffleKind>
610 Value *Vec1 =
nullptr;
611 Value *Vec2 =
nullptr;
614 std::optional<bool> HasNonUndefVec;
615 auto IsNonUndefVecPresent = [&]() {
622 return Cache.isGuaranteedNotToBePoison(Vec, AC);
624 return *HasNonUndefVec;
627 ShuffleMode CommonShuffleMode =
Unknown;
629 for (
unsigned I = 0, E = VL.
size();
I < E; ++
I) {
639 auto *Vec = EI->getVectorOperand();
655 unsigned IntIdx = Idx->getValue().getZExtValue();
664 if (!Vec1 || Vec1 == Vec) {
666 }
else if (!Vec2 || Vec2 == Vec) {
681 else if (Vec != Vec1)
683 if (CommonShuffleMode == Permute)
687 if (Idx %
Size !=
I) {
688 CommonShuffleMode = Permute;
691 CommonShuffleMode =
Select;
694 if (CommonShuffleMode ==
Select && Vec2)
713 auto *Begin = std::next(Mask.begin(), Index);
714 std::iota(Begin, std::next(Begin, SubVecVF), 0);
715 Vec = Builder.CreateShuffleVector(V, Mask);
718 std::iota(Mask.begin(), Mask.end(), 0);
719 std::iota(std::next(Mask.begin(), Index),
720 std::next(Mask.begin(), Index + SubVecVF), VecVF);
722 return Generator(Vec, V, Mask);
725 std::iota(ResizeMask.
begin(), std::next(ResizeMask.
begin(), SubVecVF), 0);
726 V = Builder.CreateShuffleVector(V, ResizeMask);
728 return Builder.CreateShuffleVector(Vec, V, Mask);
732 unsigned SubVecVF,
unsigned Index) {
734 std::iota(Mask.begin(), Mask.end(), Index);
735 return Builder.CreateShuffleVector(Vec, Mask);
754template <
bool IsPoisonOnly>
757 using T = std::conditional_t<IsPoisonOnly, PoisonValue, UndefValue>;
791 for (
unsigned I = 0, E = VecTy->getNumElements();
I != E; ++
I) {
792 if (
Constant *Elem =
C->getAggregateElement(
I))
812 case Instruction::Load: {
816 case Instruction::Store: {
818 return (
SI->getPointerOperand() ==
Scalar);
820 case Instruction::Call: {
824 return isVectorIntrinsicWithScalarOpAtArg(ID, Arg.index(), TTI) &&
825 Arg.value().get() == Scalar;
843 return LI->isSimple();
845 return SI->isSimple();
847 return !
MI->isVolatile();
857 uint64_t ScalarSize =
DL.getTypeStoreSize(ScalarTy);
858 Conditions.
assign(PointerOps.
size(),
nullptr);
863 APInt OffsetAP(
DL.getIndexTypeSizeInBits(
GEP->getType()), 0);
864 if (!
GEP->accumulateConstantOffset(
DL, OffsetAP) || OffsetAP.
isNegative())
867 Base =
GEP->getPointerOperand();
872 Value *
T = Sel->getTrueValue();
873 Value *
F = Sel->getFalseValue();
879 }
else if (TrueBase !=
T || FalseBase !=
F) {
884 if (
Offset !=
static_cast<uint64_t
>(Idx) * ScalarSize)
886 Conditions[Idx] = Sel->getCondition();
888 return TrueBase !=
nullptr;
894 "Expected only load lanes in a blended load.");
895 const uint64_t ScalarSize =
DL.getTypeStoreSize(VL.
front()->getType());
901 return BaseAlignment;
907 Ptr =
GEP->getPointerOperand();
914 constexpr unsigned IndexIdx = 1;
918 bool AllSameTy =
true;
919 bool HasNonConstIdx =
false;
920 bool ConstsFitVL0Ty =
true;
923 if (
Op->getType() != VL0Ty)
928 if (
Op->getType() != VL0Ty)
930 HasNonConstIdx =
true;
934 ConstsFitVL0Ty =
false;
938 if (!HasNonConstIdx || VL0Ty == PtrIdxTy)
940 return ConstsFitVL0Ty ? VL0Ty :
nullptr;
945 if (UniquePtrs.
size() != PointerOps.
size())
947 auto IsConstantOffsetPtr = [](
Value *
P) {
952 auto *RefIt =
find_if_not(PointerOps, IsConstantOffsetPtr);
953 if (RefIt == PointerOps.
end())
956 if (!RefGEP || RefGEP->getNumOperands() != 2)
958 Value *
Base = RefGEP->getPointerOperand();
959 Type *PtrTy = RefGEP->getType();
960 Type *SrcElemTy = RefGEP->getSourceElementType();
962 Value *Stride =
nullptr;
963 unsigned CastOpcode = 0;
964 for (
Value *
P : PointerOps) {
965 if (
P->getType() != PtrTy)
970 if (!
GEP ||
GEP->getNumOperands() != 2 ||
971 GEP->getPointerOperand() !=
Base ||
972 GEP->getSourceElementType() != SrcElemTy)
977 unsigned LaneCastOpcode = 0;
979 LaneCastOpcode = Cast->getOpcode();
980 Idx = Cast->getOperand(0);
982 Value *LaneStride = Idx;
985 LaneStride = BO->getOperand(0);
987 LaneStride = BO->getOperand(1);
991 CastOpcode = LaneCastOpcode;
994 if (LaneStride != Stride || LaneCastOpcode != CastOpcode)
997 return Stride !=
nullptr;
1001 bool ExtendingManyInputs) {
1002 if (SubMask.
empty())
1005 (!ExtendingManyInputs || SubMask.
size() > Mask.size() ||
1008 "SubMask with many inputs support must be larger than the mask.");
1010 Mask.append(SubMask.
begin(), SubMask.
end());
1014 int TermValue = std::min(Mask.size(), SubMask.
size());
1015 for (
int I = 0, E = SubMask.
size();
I < E; ++
I) {
1017 (!ExtendingManyInputs &&
1018 (SubMask[
I] >= TermValue || Mask[SubMask[
I]] >= TermValue)))
1020 NewMask[
I] = Mask[SubMask[
I]];
1026 const size_t Sz = Order.
size();
1029 for (
unsigned I = 0;
I < Sz; ++
I) {
1031 UnusedIndices.
reset(Order[
I]);
1033 MaskedIndices.
set(
I);
1035 if (MaskedIndices.
none())
1038 "Non-synced masked/available indices.");
1042 assert(Idx >= 0 &&
"Indices must be synced.");
1050 unsigned Opcode0,
unsigned Opcode1) {
1057 OpcodeMask.
set(Lane * ScalarTyNumElements,
1058 Lane * ScalarTyNumElements + ScalarTyNumElements);
1065 "Expected scalar constants.");
1068 std::fill_n(NewVal.begin() +
I * VF, VF, V);
1074 case Instruction::UDiv:
1075 return Intrinsic::masked_udiv;
1076 case Instruction::SDiv:
1077 return Intrinsic::masked_sdiv;
1078 case Instruction::URem:
1079 return Intrinsic::masked_urem;
1080 case Instruction::SRem:
1081 return Intrinsic::masked_srem;
1091 constexpr unsigned MaxIndexChainLength = 3;
1092 const User *U =
I->user_back();
1093 for ([[maybe_unused]]
unsigned _ :
seq<unsigned>(MaxIndexChainLength)) {
1109 unsigned Opcode = BO->getOpcode();
1110 Type *Ty = BO->getType();
1114 Opcode, Ty, Idx == 1) ||
1116 Opcode, Ty, Idx == 0)))
1120 const User *U =
I->user_back();
1132 if (!Wide || !Wide->hasOneUse())
1135 if (!Narrow || !Narrow->hasOneUse())
1137 Value *Src = Narrow->getOperand(0);
1140 if (MustBeElidable && !(Wide->hasAllowContract() && Wide->hasNoNaNs() &&
1141 Wide->hasNoInfs() && Narrow->hasAllowContract()))
1151struct NarrowedChainState {
1153 unsigned NarrowShift = 0;
1154 unsigned NarrowBW = 0;
1172 NarrowedChainState S,
unsigned Depth,
1176 if (
Depth < MaxDepth) {
1178 Z && Z->getSrcTy()->isIntegerTy() && !Z->getSrcTy()->isIntegerTy(1)) {
1181 Depth + 1, MaxDepth, Leaves, ChainInsts);
1184 if (BO->getOpcode() == RdxOpcode) {
1187 Depth + 1, MaxDepth, Leaves, ChainInsts);
1189 Depth + 1, MaxDepth, Leaves, ChainInsts);
1193 unsigned BW = V->getType()->getScalarSizeInBits();
1195 if (BO->getOpcode() == Instruction::Shl && Z && S.NarrowBW == 0 &&
1197 Z->getSrcTy()->isIntegerTy() && !Z->getSrcTy()->isIntegerTy(1) &&
1199 Z->getSrcTy()->getIntegerBitWidth() + Amt->
getZExtValue() <= BW) &&
1205 Depth + 1, MaxDepth, Leaves,
1212 if (BW < WideBW && (S.NarrowBW == 0 || BW == S.NarrowBW)) {
1213 if (BO->getOpcode() == Instruction::Shl &&
1216 S.Shift + S.NarrowShift + Amt->
getZExtValue() < WideBW) {
1218 if (BO->hasNoUnsignedWrap() && S.NarrowBW == 0) {
1225 if (S.NarrowBW == 0) {
1232 S,
Depth + 1, MaxDepth, Leaves,
1238 if (S.NarrowBW == 0) {
1242 S.NarrowMask &= *Amt << S.NarrowShift;
1244 MaxDepth, Leaves, ChainInsts);
1250 S.getMask(V->getType()->getScalarSizeInBits()));
1258 0, MaxDepth, Leaves, ChainInsts);
1262 assert(
F &&
"Expected function.");
1268static std::optional<std::tuple<Value *, unsigned, unsigned>>
1270 if (!V->getType()->isIntegerTy())
1271 return std::nullopt;
1274 auto GetFieldOffset = [](
const APInt *Amt,
unsigned BitWidth,
1275 unsigned FieldWidth) -> std::optional<unsigned> {
1277 if (ShAmt % FieldWidth != 0 || ShAmt + FieldWidth >
BitWidth)
1278 return std::nullopt;
1279 return ShAmt / FieldWidth;
1284 auto MatchLowField =
1286 unsigned FieldWidth) -> std::optional<std::pair<Value *, unsigned>> {
1292 if (std::optional<unsigned>
Offset = GetFieldOffset(
1293 Amt, Src->getType()->getIntegerBitWidth(), FieldWidth)) {
1296 return std::make_pair(Src, *
Offset);
1298 return std::nullopt;
1301 Src->getType()->getIntegerBitWidth() >= FieldWidth)
1302 return std::make_pair(Src, 0u);
1305 return std::make_pair(Val, 0u);
1306 return std::nullopt;
1312 unsigned FieldWidth = 0;
1314 FieldWidth = Mask->popcount();
1317 if (FieldWidth != 0) {
1318 if (std::optional<std::pair<Value *, unsigned>>
Field =
1319 MatchLowField(Val, FieldWidth))
1320 return std::make_tuple(
Field->first, FieldWidth,
Field->second);
1321 return std::nullopt;
1323 unsigned LaneWidth = V->getType()->getIntegerBitWidth();
1327 unsigned SrcWidth = Src->getType()->getIntegerBitWidth();
1330 if (std::optional<unsigned>
Offset =
1331 GetFieldOffset(Amt, SrcWidth, LaneWidth))
1332 return std::make_tuple(Src, LaneWidth, *
Offset);
1334 unsigned FieldWidth = SrcWidth - ShAmt;
1335 if (FieldWidth > 0 && FieldWidth < LaneWidth && ShAmt % FieldWidth == 0)
1336 return std::make_tuple(Src, FieldWidth, ShAmt / FieldWidth);
1337 return std::nullopt;
1342 unsigned ShfWidth = Src->getType()->getIntegerBitWidth();
1344 unsigned FieldWidth = ShfWidth - ShAmt;
1345 if (FieldWidth > 0 && ShAmt % FieldWidth == 0) {
1347 return std::make_tuple(Src, FieldWidth, ShAmt / FieldWidth);
1349 return std::nullopt;
1352 return std::make_tuple(Src, LaneWidth, 0u);
1353 return std::nullopt;
1356std::optional<std::tuple<Value *, unsigned, SmallVector<int>>>
1361 if (VL.
size() < 2 || !VL.
front()->getType()->isIntegerTy() ||
isSplat(VL) ||
1363 return std::nullopt;
1364 Value *Src =
nullptr;
1365 unsigned FieldWidth = 0;
1370 if (V->getType() != VL.
front()->getType())
1371 return std::nullopt;
1372 std::optional<std::tuple<Value *, unsigned, unsigned>>
Field =
1374 if (!
Field || (Src && (Src != std::get<0>(*
Field) ||
1375 FieldWidth != std::get<1>(*
Field))))
1376 return std::nullopt;
1377 Src = std::get<0>(*
Field);
1378 FieldWidth = std::get<1>(*
Field);
1379 Mask[Idx] = std::get<2>(*
Field);
1385 Src->getType()->getIntegerBitWidth() % FieldWidth != 0)
1386 return std::nullopt;
1392 return std::nullopt;
1393 return std::make_tuple(Src, FieldWidth, std::move(Mask));
1401 unsigned BitWidth = V->getType()->getScalarSizeInBits();
1451 unsigned NumElts = PossibleBits.
size();
1454 for (
unsigned Idx :
seq(NumElts)) {
1455 APInt Possible = PossibleBits[Idx].shl(ShlAmts[Idx]) & Masks[Idx];
1460 return std::nullopt;
1461 if (Info.FieldWidth == 0) {
1462 if (W % 8 != 0 ||
BitWidth % W != 0)
1463 return std::nullopt;
1464 Info.FieldWidth = W;
1467 if (W != Info.FieldWidth ||
Lo % W != 0)
1468 return std::nullopt;
1471 return std::nullopt;
1472 Info.LaneOfField[
Field] = Idx;
1473 Info.LShrAmts[Idx] =
Lo - ShlAmts[Idx];
1475 if (Info.FieldWidth == 0)
1476 return std::nullopt;
1481 unsigned NumElts,
unsigned BytesPerLane) {
1482 unsigned BytesPerField = Info.FieldWidth / 8;
1484 for (
unsigned J :
seq(NumBytes)) {
1485 unsigned Lane = Info.LaneOfField[J / BytesPerField];
1487 ? (
int)(NumElts * BytesPerLane)
1488 : (
int)(Lane * BytesPerLane + J % BytesPerField));
1494 Type *ResultTy,
unsigned ShiftWidth,
unsigned &NumInsts) {
1497 unsigned BitWidth = VecTy->getScalarSizeInBits();
1499 "The byte-multiple field width divides the result bit width.");
1500 unsigned NumElts = VecTy->getNumElements();
1506 Y = Z->getOperand(0);
1508 Y = Builder.CreateTrunc(
1514 if (Info.needsShift()) {
1516 for (uint64_t
A : Info.LShrAmts)
1522 unsigned InBytes = NumElts * (ShiftWidth / 8);
1530 Value *Fields = Builder.CreateTrunc(
1531 Y,
Y->getType()->getWithNewBitWidth(Info.FieldWidth));
1532 NumInsts += 1 + (Info.FieldWidth != ShiftWidth) + IsReversed;
1533 if (IsReversed && Info.FieldWidth == 8)
1534 return Builder.CreateUnaryIntrinsic(
1535 Intrinsic::bswap, Builder.CreateBitCast(Fields, ResultTy));
1537 Fields = Builder.CreateVectorReverse(Fields);
1538 return Builder.CreateBitCast(Fields, ResultTy);
1540 Value *Packed = Builder.CreateShuffleVector(
1541 Builder.CreateBitCast(
Y, ByteTy),
1547 return Builder.CreateBitCast(Packed, ResultTy);
1555 if (!DVR->isDbgValue())
1558 if (ExI && MarkedI->
getParent() != ExI->getParent())
1560 if (!ExI || ExI->comesBefore(MarkedI)) {
1561 DVR->replaceVariableLocationOp(&From, &To);
1565 auto HasSameVar = [&](
auto Records) {
1571 if (HasSameVar(
make_range(std::next(DVR->getIterator()),
1574 std::next(ExI->getIterator())),
1576 return HasSameVar(I.getDbgRecordRange());
1581 ExI->getParent()->insertDbgRecordAfter(NewDVR, ExI);
1589 const auto *I1 = IE1;
1590 const auto *I2 = IE2;
1602 if (I1 && (I1 == IE1 || I1->hasOneUse()) &&
1605 if (I2 && ((I2 == IE2 || I2->
hasOneUse())) &&
1608 }
while ((I1 && PrevI1 != I1) || (I2 && PrevI2 != I2));
1622 unsigned AggregateSize = 1;
1624 Type *CurrentType =
IV->getType();
1627 for (
auto *Elt : ST->elements())
1628 if (Elt != ST->getElementType(0))
1629 return std::nullopt;
1630 AggregateSize *= ST->getNumElements();
1631 CurrentType = ST->getElementType(0);
1633 AggregateSize *= AT->getNumElements();
1634 CurrentType = AT->getElementType();
1636 AggregateSize *= VT->getNumElements();
1637 return AggregateSize;
1639 return AggregateSize;
1641 return std::nullopt;
1647 assert(L &&
"Expected valid loop");
1652 while (L && IsLoopInvariant(L, VL))
1653 L = L->getParentLoop();
1658 unsigned LoopAwareTripCount) {
1659 if (LoopAwareTripCount == 0)
1668 if (!L->getExitingBlock())
1669 return std::min<unsigned>(LoopAwareTripCount, Scale);
1672 return LoopAwareTripCount;
1682 if (VU->
getType() != V->getType())
1685 if (!VU->
hasOneUse() && !V->hasOneUse())
1691 if (Idx1 == std::nullopt || Idx2 == std::nullopt)
1697 bool IsReusedIdx =
false;
1699 if (IE2 == VU && !IE1)
1701 if (IE1 == V && !IE2)
1702 return V->hasOneUse();
1703 if (IE1 && IE1 != V) {
1705 IsReusedIdx |= ReusedIdx.
test(Idx1);
1706 ReusedIdx.
set(Idx1);
1707 if ((IE1 != VU && !IE1->
hasOneUse()) || IsReusedIdx)
1712 if (IE2 && IE2 != VU) {
1714 IsReusedIdx |= ReusedIdx.
test(Idx2);
1715 ReusedIdx.
set(Idx2);
1716 if ((IE2 != V && !IE2->hasOneUse()) || IsReusedIdx)
1721 }
while (!IsReusedIdx && (IE1 || IE2));
const TargetLowering & TLI
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.
VectorType * getType() const
Overload to return most specific vector type.
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()
ElementCount getElementCount() const
Return an ElementCount instance to represent the (possibly scalable) number of elements in the vector...
constexpr ScalarTy getFixedValue() const
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
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 &)
Constant * getReassocIdentity(unsigned Opcode, Type *Ty, bool Negated)
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 isBinOpIdentityConstant(const Value *V, unsigned Opcode, bool Negated)
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)
bool areTwoInsertFromSameBuildVector(InsertElementInst *VU, InsertElementInst *V, function_ref< Value *(InsertElementInst *)> GetBaseOperand)
Check if two insertelement instructions are from the same buildvector.
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 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
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
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.