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>
487 return isa<PHINode>(IO) || IO->getParent() != I->getParent();
496 return !
I->mayReadOrWriteMemory() && !
I->hasNUsesOrMore(
UsesLimit) &&
498 auto *IU = dyn_cast<Instruction>(U);
501 return IU->getParent() != I->getParent() || isa<PHINode>(IU);
510 return !VL.
empty() &&
523 I * VecTyNumElements, VecTyNumElements)))
525 : Mask[
I] * VecTyNumElements + J;
535 unsigned SVNumElements =
537 unsigned ShuffleMaskSize = SV->getShuffleMask().size();
538 if (SVNumElements % ShuffleMaskSize != 0)
540 unsigned GroupSize = SVNumElements / ShuffleMaskSize;
541 if (GroupSize == 0 || (VL.
size() % GroupSize) != 0)
543 unsigned NumGroup = 0;
544 for (
size_t I = 0, E = VL.
size();
I != E;
I += GroupSize) {
546 Value *Src = SV->getOperand(0);
552 if (SV->getOperand(0) != Src)
555 if (!SV->isExtractSubvectorMask(Index))
557 ExpectedIndex.
set(Index / ShuffleMaskSize);
561 if (!ExpectedIndex.
all())
565 assert(NumGroup == (VL.
size() / GroupSize) &&
"Unexpected number of groups");
572 unsigned SVNumElements =
575 unsigned AccumulateLength = 0;
576 for (
Value *V : VL) {
578 for (
int M : SV->getShuffleMask())
580 : AccumulateLength + M);
581 AccumulateLength += SVNumElements;
608std::optional<TargetTransformInfo::ShuffleKind>
615 Value *Vec1 =
nullptr;
616 Value *Vec2 =
nullptr;
619 std::optional<bool> HasNonUndefVec;
620 auto IsNonUndefVecPresent = [&]() {
627 return Cache.isGuaranteedNotToBePoison(Vec, AC);
629 return *HasNonUndefVec;
632 ShuffleMode CommonShuffleMode =
Unknown;
634 for (
unsigned I = 0, E = VL.
size();
I < E; ++
I) {
644 auto *Vec = EI->getVectorOperand();
660 unsigned IntIdx = Idx->getValue().getZExtValue();
669 if (!Vec1 || Vec1 == Vec) {
671 }
else if (!Vec2 || Vec2 == Vec) {
686 else if (Vec != Vec1)
688 if (CommonShuffleMode == Permute)
692 if (Idx %
Size !=
I) {
693 CommonShuffleMode = Permute;
696 CommonShuffleMode =
Select;
699 if (CommonShuffleMode ==
Select && Vec2)
718 auto *Begin = std::next(Mask.begin(), Index);
719 std::iota(Begin, std::next(Begin, SubVecVF), 0);
720 Vec = Builder.CreateShuffleVector(V, Mask);
723 std::iota(Mask.begin(), Mask.end(), 0);
724 std::iota(std::next(Mask.begin(), Index),
725 std::next(Mask.begin(), Index + SubVecVF), VecVF);
727 return Generator(Vec, V, Mask);
730 std::iota(ResizeMask.
begin(), std::next(ResizeMask.
begin(), SubVecVF), 0);
731 V = Builder.CreateShuffleVector(V, ResizeMask);
733 return Builder.CreateShuffleVector(Vec, V, Mask);
737 unsigned SubVecVF,
unsigned Index) {
739 std::iota(Mask.begin(), Mask.end(), Index);
740 return Builder.CreateShuffleVector(Vec, Mask);
759template <
bool IsPoisonOnly>
762 using T = std::conditional_t<IsPoisonOnly, PoisonValue, UndefValue>;
796 for (
unsigned I = 0, E = VecTy->getNumElements();
I != E; ++
I) {
797 if (
Constant *Elem =
C->getAggregateElement(
I))
817 case Instruction::Load: {
821 case Instruction::Store: {
823 return (
SI->getPointerOperand() == Scalar);
825 case Instruction::Call: {
829 return isVectorIntrinsicWithScalarOpAtArg(ID, Arg.index(), TTI) &&
830 Arg.value().get() == Scalar;
848 return LI->isSimple();
850 return SI->isSimple();
852 return !
MI->isVolatile();
862 uint64_t ScalarSize =
DL.getTypeStoreSize(ScalarTy);
863 Conditions.
assign(PointerOps.
size(),
nullptr);
868 APInt OffsetAP(
DL.getIndexTypeSizeInBits(
GEP->getType()), 0);
869 if (!
GEP->accumulateConstantOffset(
DL, OffsetAP) || OffsetAP.
isNegative())
872 Base =
GEP->getPointerOperand();
877 Value *
T = Sel->getTrueValue();
878 Value *
F = Sel->getFalseValue();
884 }
else if (TrueBase !=
T || FalseBase !=
F) {
889 if (
Offset !=
static_cast<uint64_t
>(Idx) * ScalarSize)
891 Conditions[Idx] = Sel->getCondition();
893 return TrueBase !=
nullptr;
899 "Expected only load lanes in a blended load.");
900 const uint64_t ScalarSize =
DL.getTypeStoreSize(VL.
front()->getType());
906 return BaseAlignment;
912 constexpr unsigned IndexIdx = 1;
916 bool AllSameTy =
true;
917 bool HasNonConstIdx =
false;
918 bool ConstsFitVL0Ty =
true;
921 if (
Op->getType() != VL0Ty)
926 if (
Op->getType() != VL0Ty)
928 HasNonConstIdx =
true;
932 ConstsFitVL0Ty =
false;
936 if (!HasNonConstIdx || VL0Ty == PtrIdxTy)
938 return ConstsFitVL0Ty ? VL0Ty :
nullptr;
943 if (UniquePtrs.
size() != PointerOps.
size())
945 auto IsConstantOffsetPtr = [](
Value *
P) {
950 auto *RefIt =
find_if_not(PointerOps, IsConstantOffsetPtr);
951 if (RefIt == PointerOps.
end())
954 if (!RefGEP || RefGEP->getNumOperands() != 2)
956 Value *
Base = RefGEP->getPointerOperand();
957 Type *PtrTy = RefGEP->getType();
958 Type *SrcElemTy = RefGEP->getSourceElementType();
960 Value *Stride =
nullptr;
961 unsigned CastOpcode = 0;
962 for (
Value *
P : PointerOps) {
963 if (
P->getType() != PtrTy)
968 if (!
GEP ||
GEP->getNumOperands() != 2 ||
969 GEP->getPointerOperand() !=
Base ||
970 GEP->getSourceElementType() != SrcElemTy)
975 unsigned LaneCastOpcode = 0;
977 LaneCastOpcode = Cast->getOpcode();
978 Idx = Cast->getOperand(0);
980 Value *LaneStride = Idx;
983 LaneStride = BO->getOperand(0);
985 LaneStride = BO->getOperand(1);
989 CastOpcode = LaneCastOpcode;
992 if (LaneStride != Stride || LaneCastOpcode != CastOpcode)
995 return Stride !=
nullptr;
999 bool ExtendingManyInputs) {
1000 if (SubMask.
empty())
1003 (!ExtendingManyInputs || SubMask.
size() > Mask.size() ||
1006 "SubMask with many inputs support must be larger than the mask.");
1008 Mask.append(SubMask.
begin(), SubMask.
end());
1012 int TermValue = std::min(Mask.size(), SubMask.
size());
1013 for (
int I = 0, E = SubMask.
size();
I < E; ++
I) {
1015 (!ExtendingManyInputs &&
1016 (SubMask[
I] >= TermValue || Mask[SubMask[
I]] >= TermValue)))
1018 NewMask[
I] = Mask[SubMask[
I]];
1024 const size_t Sz = Order.
size();
1027 for (
unsigned I = 0;
I < Sz; ++
I) {
1029 UnusedIndices.
reset(Order[
I]);
1031 MaskedIndices.
set(
I);
1033 if (MaskedIndices.
none())
1036 "Non-synced masked/available indices.");
1040 assert(Idx >= 0 &&
"Indices must be synced.");
1048 unsigned Opcode0,
unsigned Opcode1) {
1055 OpcodeMask.
set(Lane * ScalarTyNumElements,
1056 Lane * ScalarTyNumElements + ScalarTyNumElements);
1063 "Expected scalar constants.");
1066 std::fill_n(NewVal.begin() +
I * VF, VF, V);
1072 case Instruction::UDiv:
1073 return Intrinsic::masked_udiv;
1074 case Instruction::SDiv:
1075 return Intrinsic::masked_sdiv;
1076 case Instruction::URem:
1077 return Intrinsic::masked_urem;
1078 case Instruction::SRem:
1079 return Intrinsic::masked_srem;
1089 constexpr unsigned MaxIndexChainLength = 3;
1090 const User *U =
I->user_back();
1091 for ([[maybe_unused]]
unsigned _ :
seq<unsigned>(MaxIndexChainLength)) {
1107 unsigned Opcode = BO->getOpcode();
1108 Type *Ty = BO->getType();
1112 Opcode, Ty, Idx == 1) ||
1114 Opcode, Ty, Idx == 0)))
1118 const User *U =
I->user_back();
1130 if (!Wide || !Wide->hasOneUse())
1133 if (!Narrow || !Narrow->hasOneUse())
1135 Value *Src = Narrow->getOperand(0);
1138 if (MustBeElidable && !(Wide->hasAllowContract() && Wide->hasNoNaNs() &&
1139 Wide->hasNoInfs() && Narrow->hasAllowContract()))
1149struct NarrowedChainState {
1151 unsigned NarrowShift = 0;
1152 unsigned NarrowBW = 0;
1170 NarrowedChainState S,
unsigned Depth,
1174 if (
Depth < MaxDepth) {
1176 Z && Z->getSrcTy()->isIntegerTy() && !Z->getSrcTy()->isIntegerTy(1)) {
1179 Depth + 1, MaxDepth, Leaves, ChainInsts);
1182 if (BO->getOpcode() == RdxOpcode) {
1185 Depth + 1, MaxDepth, Leaves, ChainInsts);
1187 Depth + 1, MaxDepth, Leaves, ChainInsts);
1191 unsigned BW = V->getType()->getScalarSizeInBits();
1193 if (BO->getOpcode() == Instruction::Shl && Z && S.NarrowBW == 0 &&
1195 Z->getSrcTy()->isIntegerTy() && !Z->getSrcTy()->isIntegerTy(1) &&
1197 Z->getSrcTy()->getIntegerBitWidth() + Amt->
getZExtValue() <= BW) &&
1203 Depth + 1, MaxDepth, Leaves,
1210 if (BW < WideBW && (S.NarrowBW == 0 || BW == S.NarrowBW)) {
1211 if (BO->getOpcode() == Instruction::Shl &&
1214 S.Shift + S.NarrowShift + Amt->
getZExtValue() < WideBW) {
1216 if (BO->hasNoUnsignedWrap() && S.NarrowBW == 0) {
1223 if (S.NarrowBW == 0) {
1230 S,
Depth + 1, MaxDepth, Leaves,
1236 if (S.NarrowBW == 0) {
1240 S.NarrowMask &= *Amt << S.NarrowShift;
1242 MaxDepth, Leaves, ChainInsts);
1248 S.getMask(V->getType()->getScalarSizeInBits()));
1256 0, MaxDepth, Leaves, ChainInsts);
1260 assert(
F &&
"Expected function.");
1266static std::optional<std::tuple<Value *, unsigned, unsigned>>
1268 if (!V->getType()->isIntegerTy())
1269 return std::nullopt;
1272 auto GetFieldOffset = [](
const APInt *Amt,
unsigned BitWidth,
1273 unsigned FieldWidth) -> std::optional<unsigned> {
1275 if (ShAmt % FieldWidth != 0 || ShAmt + FieldWidth >
BitWidth)
1276 return std::nullopt;
1277 return ShAmt / FieldWidth;
1282 auto MatchLowField =
1284 unsigned FieldWidth) -> std::optional<std::pair<Value *, unsigned>> {
1290 if (std::optional<unsigned>
Offset = GetFieldOffset(
1291 Amt, Src->getType()->getIntegerBitWidth(), FieldWidth)) {
1294 return std::make_pair(Src, *
Offset);
1296 return std::nullopt;
1299 Src->getType()->getIntegerBitWidth() >= FieldWidth)
1300 return std::make_pair(Src, 0u);
1303 return std::make_pair(Val, 0u);
1304 return std::nullopt;
1310 unsigned FieldWidth = 0;
1312 FieldWidth = Mask->popcount();
1315 if (FieldWidth != 0) {
1316 if (std::optional<std::pair<Value *, unsigned>>
Field =
1317 MatchLowField(Val, FieldWidth))
1318 return std::make_tuple(
Field->first, FieldWidth,
Field->second);
1319 return std::nullopt;
1321 unsigned LaneWidth = V->getType()->getIntegerBitWidth();
1325 unsigned SrcWidth = Src->getType()->getIntegerBitWidth();
1328 if (std::optional<unsigned>
Offset =
1329 GetFieldOffset(Amt, SrcWidth, LaneWidth))
1330 return std::make_tuple(Src, LaneWidth, *
Offset);
1332 unsigned FieldWidth = SrcWidth - ShAmt;
1333 if (FieldWidth > 0 && FieldWidth < LaneWidth && ShAmt % FieldWidth == 0)
1334 return std::make_tuple(Src, FieldWidth, ShAmt / FieldWidth);
1335 return std::nullopt;
1340 unsigned ShfWidth = Src->getType()->getIntegerBitWidth();
1342 unsigned FieldWidth = ShfWidth - ShAmt;
1343 if (FieldWidth > 0 && ShAmt % FieldWidth == 0) {
1345 return std::make_tuple(Src, FieldWidth, ShAmt / FieldWidth);
1347 return std::nullopt;
1350 return std::make_tuple(Src, LaneWidth, 0u);
1351 return std::nullopt;
1354std::optional<std::tuple<Value *, unsigned, SmallVector<int>>>
1359 if (VL.
size() < 2 || !VL.
front()->getType()->isIntegerTy() ||
isSplat(VL) ||
1361 return std::nullopt;
1362 Value *Src =
nullptr;
1363 unsigned FieldWidth = 0;
1368 if (V->getType() != VL.
front()->getType())
1369 return std::nullopt;
1370 std::optional<std::tuple<Value *, unsigned, unsigned>>
Field =
1372 if (!
Field || (Src && (Src != std::get<0>(*
Field) ||
1373 FieldWidth != std::get<1>(*
Field))))
1374 return std::nullopt;
1375 Src = std::get<0>(*
Field);
1376 FieldWidth = std::get<1>(*
Field);
1377 Mask[Idx] = std::get<2>(*
Field);
1383 Src->getType()->getIntegerBitWidth() % FieldWidth != 0)
1384 return std::nullopt;
1390 return std::nullopt;
1391 return std::make_tuple(Src, FieldWidth, std::move(Mask));
1399 unsigned BitWidth = V->getType()->getScalarSizeInBits();
1449 unsigned NumElts = PossibleBits.
size();
1452 for (
unsigned Idx :
seq(NumElts)) {
1453 APInt Possible = PossibleBits[Idx].shl(ShlAmts[Idx]) & Masks[Idx];
1458 return std::nullopt;
1459 if (Info.FieldWidth == 0) {
1460 if (W % 8 != 0 ||
BitWidth % W != 0)
1461 return std::nullopt;
1462 Info.FieldWidth = W;
1465 if (W != Info.FieldWidth ||
Lo % W != 0)
1466 return std::nullopt;
1469 return std::nullopt;
1470 Info.LaneOfField[
Field] = Idx;
1471 Info.LShrAmts[Idx] =
Lo - ShlAmts[Idx];
1473 if (Info.FieldWidth == 0)
1474 return std::nullopt;
1479 unsigned NumElts,
unsigned BytesPerLane) {
1480 unsigned BytesPerField = Info.FieldWidth / 8;
1482 for (
unsigned J :
seq(NumBytes)) {
1483 unsigned Lane = Info.LaneOfField[J / BytesPerField];
1485 ? (
int)(NumElts * BytesPerLane)
1486 : (
int)(Lane * BytesPerLane + J % BytesPerField));
1492 Type *ResultTy,
unsigned ShiftWidth,
unsigned &NumInsts) {
1495 unsigned BitWidth = VecTy->getScalarSizeInBits();
1497 "The byte-multiple field width divides the result bit width.");
1498 unsigned NumElts = VecTy->getNumElements();
1504 Y = Z->getOperand(0);
1506 Y = Builder.CreateTrunc(
1512 if (Info.needsShift()) {
1514 for (uint64_t
A : Info.LShrAmts)
1520 unsigned InBytes = NumElts * (ShiftWidth / 8);
1528 Value *Fields = Builder.CreateTrunc(
1529 Y,
Y->getType()->getWithNewBitWidth(Info.FieldWidth));
1530 NumInsts += 1 + (Info.FieldWidth != ShiftWidth) + IsReversed;
1531 if (IsReversed && Info.FieldWidth == 8)
1532 return Builder.CreateUnaryIntrinsic(
1533 Intrinsic::bswap, Builder.CreateBitCast(Fields, ResultTy));
1535 Fields = Builder.CreateVectorReverse(Fields);
1536 return Builder.CreateBitCast(Fields, ResultTy);
1538 Value *Packed = Builder.CreateShuffleVector(
1539 Builder.CreateBitCast(
Y, ByteTy),
1545 return Builder.CreateBitCast(Packed, ResultTy);
1553 if (!DVR->isDbgValue())
1556 if (ExI && MarkedI->
getParent() != ExI->getParent())
1558 if (!ExI || ExI->comesBefore(MarkedI)) {
1559 DVR->replaceVariableLocationOp(&From, &To);
1563 auto HasSameVar = [&](
auto Records) {
1569 if (HasSameVar(
make_range(std::next(DVR->getIterator()),
1572 std::next(ExI->getIterator())),
1574 return HasSameVar(I.getDbgRecordRange());
1579 ExI->getParent()->insertDbgRecordAfter(NewDVR, ExI);
1587 const auto *I1 = IE1;
1588 const auto *I2 = IE2;
1600 if (I1 && (I1 == IE1 || I1->hasOneUse()) &&
1603 if (I2 && ((I2 == IE2 || I2->
hasOneUse())) &&
1606 }
while ((I1 && PrevI1 != I1) || (I2 && PrevI2 != I2));
1620 unsigned AggregateSize = 1;
1622 Type *CurrentType =
IV->getType();
1625 for (
auto *Elt : ST->elements())
1626 if (Elt != ST->getElementType(0))
1627 return std::nullopt;
1628 AggregateSize *= ST->getNumElements();
1629 CurrentType = ST->getElementType(0);
1631 AggregateSize *= AT->getNumElements();
1632 CurrentType = AT->getElementType();
1634 AggregateSize *= VT->getNumElements();
1635 return AggregateSize;
1637 return AggregateSize;
1639 return std::nullopt;
1645 assert(L &&
"Expected valid loop");
1650 while (L && IsLoopInvariant(L, VL))
1651 L = L->getParentLoop();
1656 unsigned LoopAwareTripCount) {
1657 if (LoopAwareTripCount == 0)
1666 if (!L->getExitingBlock())
1667 return std::min<unsigned>(LoopAwareTripCount, Scale);
1670 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.
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...
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.