66 case Instruction::Sub:
67 return Instruction::Add;
68 case Instruction::FSub:
69 return Instruction::FAdd;
76 if (
I->getOpcode() == Instruction::Sub)
78 if (
I->getOpcode() == Instruction::FSub)
79 return I->hasAllowReassoc();
80 return I->isAssociative();
88 switch (
I->getOpcode()) {
89 case Instruction::ExtractValue:
90 case Instruction::InsertValue:
92 case Instruction::ExtractElement:
95 case Instruction::InsertElement:
105 "ScalableVectorType is not supported.");
116 return std::min<unsigned>(PartNumElems,
Size - Part * PartNumElems);
124 OS <<
"Idx: " << Idx <<
", ";
125 OS <<
"n=" << VL.
size() <<
" [" << *VL.
front() <<
", ..]";
140 return !isa<PoisonValue>(V);
146 if (BB !=
II->getParent())
159 Value *FirstNonUndef =
nullptr;
162 if (!FirstNonUndef) {
166 if (V != FirstNonUndef)
169 return FirstNonUndef !=
nullptr;
175 if ((LHS == Intrinsic::fma || LHS == Intrinsic::fmuladd) &&
176 (RHS == Intrinsic::fma || RHS == Intrinsic::fmuladd))
177 return Intrinsic::fma;
184 return Cmp->isCommutative();
186 return BO->isCommutative() ||
187 (BO->getOpcode() == Instruction::Sub && ValWithUses->
hasUseList() &&
194 if (match(U.getUser(),
195 m_ICmp(Pred, m_Specific(U.get()), m_Zero())) &&
196 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE))
200 auto *I = dyn_cast<BinaryOperator>(U.get());
201 return match(U.getUser(),
202 m_Intrinsic<Intrinsic::abs>(
203 m_Specific(U.get()), m_ConstantInt(Flag))) &&
204 ((!IsCopyable && I && !I->hasNoSignedWrap()) ||
207 (BO->getOpcode() == Instruction::FSub && ValWithUses->
hasUseList() &&
210 return match(U.getUser(),
211 m_Intrinsic<Intrinsic::fabs>(m_Specific(U.get())));
213 return I->isCommutative();
221 "The instruction is not commutative.");
225 switch (BO->getOpcode()) {
226 case Instruction::Sub:
227 case Instruction::FSub:
233 return I->isCommutableOperand(
Op);
240 constexpr unsigned IntrinsicNumOperands = 2;
241 return IntrinsicNumOperands;
243 return I->getNumOperands();
258 Type *CurrentType =
IV->getType();
259 for (
unsigned I :
IV->indices()) {
261 Index *= ST->getNumElements();
262 CurrentType = ST->getElementType(
I);
264 Index *= AT->getNumElements();
265 CurrentType = AT->getElementType();
284 if (auto *CI = dyn_cast<CmpInst>(V))
285 return BasePred == CI->getPredicate();
286 if (auto *I = dyn_cast<Instruction>(V))
287 return I->getOpcode() == Opcode;
288 return isa<PoisonValue>(V);
293 unsigned Opcode = E->getOpcode();
294 assert((Opcode == Instruction::ExtractElement ||
295 Opcode == Instruction::ExtractValue) &&
296 "Expected extractelement or extractvalue instruction.");
297 if (Opcode == Instruction::ExtractElement) {
303 unsigned Idx = CI->getZExtValue();
311 if (EI->getNumIndices() != 1)
313 return *EI->idx_begin();
319 const unsigned E = Indices.
size();
321 for (
unsigned I = 0;
I < E; ++
I)
322 Mask[Indices[
I]] =
I;
326 assert(!Mask.empty() &&
"Expected non-empty mask.");
330 for (
unsigned I = 0, E = Prev.
size();
I < E; ++
I)
332 Scalars[Mask[
I]] = Prev[
I];
336 assert(!Mask.empty() && Reuses.
size() == Mask.size() &&
337 "Expected non-empty mask.");
340 for (
unsigned I = 0, E = Prev.
size();
I < E; ++
I)
342 Reuses[Mask[
I]] = Prev[
I];
347 assert(!Mask.empty() &&
"Expected non-empty mask.");
348 unsigned Sz = Mask.size();
353 std::iota(PrevOrder.
begin(), PrevOrder.
end(), 0);
355 PrevOrder.
swap(Order);
358 for (
unsigned I = 0;
I < Sz; ++
I)
360 Order[
I] = PrevOrder[Mask[
I]];
362 return Data.value() == Sz ||
Data.index() ==
Data.value();
373 std::iota(MaskOrder.
begin(), MaskOrder.
end(), 0);
383 for (
unsigned I = 0;
I < Sz; ++
I)
385 Order[MaskOrder[
I]] =
I;
391 "Order is empty. Please check it before using isReverseOrder.");
392 unsigned Sz = Order.
size();
394 return Pair.value() == Sz || Sz - Pair.index() - 1 == Pair.value();
402 for (
unsigned I = Sz, E = Mask.size();
I < E;
I += Sz) {
413 "Expected same size of orders");
414 size_t Sz = Order.
size();
417 if (Order[Idx] != Sz)
418 UsedIndices.
set(Order[Idx]);
420 if (SecondaryOrder.
empty()) {
422 if (Order[Idx] == Sz && !UsedIndices.
test(Idx))
426 if (SecondaryOrder[Idx] != Sz && Order[Idx] == Sz &&
427 !UsedIndices.
test(SecondaryOrder[Idx]))
428 Order[Idx] = SecondaryOrder[Idx];
433 assert(!VL.
empty() &&
"Expected non-empty list of values.");
435 return all_of(VL, [&](
Value *V) {
return V->getType() == Ty; });
441 static_assert(std::is_same_v<T, InsertElementInst> ||
442 std::is_same_v<T, ExtractElementInst>,
449 constexpr bool IsInsert = std::is_same_v<T, InsertElementInst>;
450 Type *VecTy = IsInsert ? IE->getType() : IE->getOperand(0)->getType();
457 if (CI->getValue().uge(VT->getNumElements()))
460 Index *= VT->getNumElements();
461 Index += CI->getZExtValue();
467template std::optional<unsigned>
469template std::optional<unsigned>
479 return isa<PHINode>(IO) || IO->getParent() != I->getParent();
488 return !
I->mayReadOrWriteMemory() && !
I->hasNUsesOrMore(
UsesLimit) &&
490 auto *IU = dyn_cast<Instruction>(U);
493 return IU->getParent() != I->getParent() || isa<PHINode>(IU);
502 return !VL.
empty() &&
515 I * VecTyNumElements, VecTyNumElements)))
517 : Mask[
I] * VecTyNumElements + J;
527 unsigned SVNumElements =
529 unsigned ShuffleMaskSize = SV->getShuffleMask().size();
530 if (SVNumElements % ShuffleMaskSize != 0)
532 unsigned GroupSize = SVNumElements / ShuffleMaskSize;
533 if (GroupSize == 0 || (VL.
size() % GroupSize) != 0)
535 unsigned NumGroup = 0;
536 for (
size_t I = 0, E = VL.
size();
I != E;
I += GroupSize) {
538 Value *Src = SV->getOperand(0);
544 if (SV->getOperand(0) != Src)
547 if (!SV->isExtractSubvectorMask(Index))
549 ExpectedIndex.
set(Index / ShuffleMaskSize);
553 if (!ExpectedIndex.
all())
557 assert(NumGroup == (VL.
size() / GroupSize) &&
"Unexpected number of groups");
564 unsigned SVNumElements =
567 unsigned AccumulateLength = 0;
568 for (
Value *V : VL) {
570 for (
int M : SV->getShuffleMask())
572 : AccumulateLength + M);
573 AccumulateLength += SVNumElements;
600std::optional<TargetTransformInfo::ShuffleKind>
607 Value *Vec1 =
nullptr;
608 Value *Vec2 =
nullptr;
617 ShuffleMode CommonShuffleMode =
Unknown;
619 for (
unsigned I = 0, E = VL.
size();
I < E; ++
I) {
629 auto *Vec = EI->getVectorOperand();
645 unsigned IntIdx = Idx->getValue().getZExtValue();
654 if (!Vec1 || Vec1 == Vec) {
656 }
else if (!Vec2 || Vec2 == Vec) {
671 else if (Vec != Vec1)
673 if (CommonShuffleMode == Permute)
677 if (Idx %
Size !=
I) {
678 CommonShuffleMode = Permute;
681 CommonShuffleMode =
Select;
684 if (CommonShuffleMode ==
Select && Vec2)
703 auto *Begin = std::next(Mask.begin(), Index);
704 std::iota(Begin, std::next(Begin, SubVecVF), 0);
705 Vec = Builder.CreateShuffleVector(V, Mask);
708 std::iota(Mask.begin(), Mask.end(), 0);
709 std::iota(std::next(Mask.begin(), Index),
710 std::next(Mask.begin(), Index + SubVecVF), VecVF);
712 return Generator(Vec, V, Mask);
715 std::iota(ResizeMask.
begin(), std::next(ResizeMask.
begin(), SubVecVF), 0);
716 V = Builder.CreateShuffleVector(V, ResizeMask);
718 return Builder.CreateShuffleVector(Vec, V, Mask);
722 unsigned SubVecVF,
unsigned Index) {
724 std::iota(Mask.begin(), Mask.end(), Index);
725 return Builder.CreateShuffleVector(Vec, Mask);
744template <
bool IsPoisonOnly>
747 using T = std::conditional_t<IsPoisonOnly, PoisonValue, UndefValue>;
781 for (
unsigned I = 0, E = VecTy->getNumElements();
I != E; ++
I) {
782 if (
Constant *Elem =
C->getAggregateElement(
I))
802 case Instruction::Load: {
806 case Instruction::Store: {
808 return (
SI->getPointerOperand() == Scalar);
810 case Instruction::Call: {
814 return isVectorIntrinsicWithScalarOpAtArg(ID, Arg.index(), TTI) &&
815 Arg.value().get() == Scalar;
833 return LI->isSimple();
835 return SI->isSimple();
837 return !
MI->isVolatile();
847 uint64_t ScalarSize =
DL.getTypeStoreSize(ScalarTy);
848 Conditions.
assign(PointerOps.
size(),
nullptr);
853 APInt OffsetAP(
DL.getIndexTypeSizeInBits(
GEP->getType()), 0);
854 if (!
GEP->accumulateConstantOffset(
DL, OffsetAP) || OffsetAP.
isNegative())
857 Base =
GEP->getPointerOperand();
862 Value *
T = Sel->getTrueValue();
863 Value *
F = Sel->getFalseValue();
869 }
else if (TrueBase !=
T || FalseBase !=
F) {
874 if (
Offset !=
static_cast<uint64_t
>(Idx) * ScalarSize)
876 Conditions[Idx] = Sel->getCondition();
878 return TrueBase !=
nullptr;
884 "Expected only load lanes in a blended load.");
885 const uint64_t ScalarSize =
DL.getTypeStoreSize(VL.
front()->getType());
891 return BaseAlignment;
897 constexpr unsigned IndexIdx = 1;
901 bool AllSameTy =
true;
902 bool HasNonConstIdx =
false;
903 bool ConstsFitVL0Ty =
true;
906 if (
Op->getType() != VL0Ty)
911 if (
Op->getType() != VL0Ty)
913 HasNonConstIdx =
true;
917 ConstsFitVL0Ty =
false;
921 if (!HasNonConstIdx || VL0Ty == PtrIdxTy)
923 return ConstsFitVL0Ty ? VL0Ty :
nullptr;
928 if (UniquePtrs.
size() != PointerOps.
size())
930 auto IsConstantOffsetPtr = [](
Value *
P) {
935 auto *RefIt =
find_if_not(PointerOps, IsConstantOffsetPtr);
936 if (RefIt == PointerOps.
end())
939 if (!RefGEP || RefGEP->getNumOperands() != 2)
941 Value *
Base = RefGEP->getPointerOperand();
942 Type *PtrTy = RefGEP->getType();
943 Type *SrcElemTy = RefGEP->getSourceElementType();
945 Value *Stride =
nullptr;
946 unsigned CastOpcode = 0;
947 for (
Value *
P : PointerOps) {
948 if (
P->getType() != PtrTy)
953 if (!
GEP ||
GEP->getNumOperands() != 2 ||
954 GEP->getPointerOperand() !=
Base ||
955 GEP->getSourceElementType() != SrcElemTy)
960 unsigned LaneCastOpcode = 0;
962 LaneCastOpcode = Cast->getOpcode();
963 Idx = Cast->getOperand(0);
965 Value *LaneStride = Idx;
968 LaneStride = BO->getOperand(0);
970 LaneStride = BO->getOperand(1);
974 CastOpcode = LaneCastOpcode;
977 if (LaneStride != Stride || LaneCastOpcode != CastOpcode)
980 return Stride !=
nullptr;
984 bool ExtendingManyInputs) {
988 (!ExtendingManyInputs || SubMask.
size() > Mask.size() ||
991 "SubMask with many inputs support must be larger than the mask.");
993 Mask.append(SubMask.
begin(), SubMask.
end());
997 int TermValue = std::min(Mask.size(), SubMask.
size());
998 for (
int I = 0, E = SubMask.
size();
I < E; ++
I) {
1000 (!ExtendingManyInputs &&
1001 (SubMask[
I] >= TermValue || Mask[SubMask[
I]] >= TermValue)))
1003 NewMask[
I] = Mask[SubMask[
I]];
1009 const size_t Sz = Order.
size();
1012 for (
unsigned I = 0;
I < Sz; ++
I) {
1014 UnusedIndices.
reset(Order[
I]);
1016 MaskedIndices.
set(
I);
1018 if (MaskedIndices.
none())
1021 "Non-synced masked/available indices.");
1025 assert(Idx >= 0 &&
"Indices must be synced.");
1033 unsigned Opcode0,
unsigned Opcode1) {
1040 OpcodeMask.
set(Lane * ScalarTyNumElements,
1041 Lane * ScalarTyNumElements + ScalarTyNumElements);
1048 "Expected scalar constants.");
1051 std::fill_n(NewVal.begin() +
I * VF, VF, V);
1057 case Instruction::UDiv:
1058 return Intrinsic::masked_udiv;
1059 case Instruction::SDiv:
1060 return Intrinsic::masked_sdiv;
1061 case Instruction::URem:
1062 return Intrinsic::masked_urem;
1063 case Instruction::SRem:
1064 return Intrinsic::masked_srem;
1074 constexpr unsigned MaxIndexChainLength = 3;
1075 const User *U =
I->user_back();
1076 for ([[maybe_unused]]
unsigned _ :
seq<unsigned>(MaxIndexChainLength)) {
1092 unsigned Opcode = BO->getOpcode();
1093 Type *Ty = BO->getType();
1097 Opcode, Ty, Idx == 1) ||
1099 Opcode, Ty, Idx == 0)))
1103 const User *U =
I->user_back();
1115 if (!Wide || !Wide->hasOneUse())
1118 if (!Narrow || !Narrow->hasOneUse())
1120 Value *Src = Narrow->getOperand(0);
1123 if (MustBeElidable && !(Wide->hasAllowContract() && Wide->hasNoNaNs() &&
1124 Wide->hasNoInfs() && Narrow->hasAllowContract()))
1134struct NarrowedChainState {
1136 unsigned NarrowShift = 0;
1137 unsigned NarrowBW = 0;
1155 NarrowedChainState S,
unsigned Depth,
1159 if (
Depth < MaxDepth) {
1161 Z && Z->getSrcTy()->isIntegerTy() && !Z->getSrcTy()->isIntegerTy(1)) {
1164 Depth + 1, MaxDepth, Leaves, ChainInsts);
1167 if (BO->getOpcode() == RdxOpcode) {
1170 Depth + 1, MaxDepth, Leaves, ChainInsts);
1172 Depth + 1, MaxDepth, Leaves, ChainInsts);
1176 unsigned BW = V->getType()->getScalarSizeInBits();
1178 if (BO->getOpcode() == Instruction::Shl && Z && S.NarrowBW == 0 &&
1180 Z->getSrcTy()->isIntegerTy() && !Z->getSrcTy()->isIntegerTy(1) &&
1182 Z->getSrcTy()->getIntegerBitWidth() + Amt->
getZExtValue() <= BW) &&
1188 Depth + 1, MaxDepth, Leaves,
1195 if (BW < WideBW && (S.NarrowBW == 0 || BW == S.NarrowBW)) {
1196 if (BO->getOpcode() == Instruction::Shl &&
1199 S.Shift + S.NarrowShift + Amt->
getZExtValue() < WideBW) {
1201 if (BO->hasNoUnsignedWrap() && S.NarrowBW == 0) {
1208 if (S.NarrowBW == 0) {
1215 S,
Depth + 1, MaxDepth, Leaves,
1221 if (S.NarrowBW == 0) {
1225 S.NarrowMask &= *Amt << S.NarrowShift;
1227 MaxDepth, Leaves, ChainInsts);
1233 S.getMask(V->getType()->getScalarSizeInBits()));
1241 0, MaxDepth, Leaves, ChainInsts);
1245 assert(
F &&
"Expected function.");
1251static std::optional<std::tuple<Value *, unsigned, unsigned>>
1253 if (!V->getType()->isIntegerTy())
1254 return std::nullopt;
1257 auto GetFieldOffset = [](
const APInt *Amt,
unsigned BitWidth,
1258 unsigned FieldWidth) -> std::optional<unsigned> {
1260 if (ShAmt % FieldWidth != 0 || ShAmt + FieldWidth >
BitWidth)
1261 return std::nullopt;
1262 return ShAmt / FieldWidth;
1267 auto MatchLowField =
1269 unsigned FieldWidth) -> std::optional<std::pair<Value *, unsigned>> {
1275 if (std::optional<unsigned>
Offset = GetFieldOffset(
1276 Amt, Src->getType()->getIntegerBitWidth(), FieldWidth)) {
1279 return std::make_pair(Src, *
Offset);
1281 return std::nullopt;
1284 Src->getType()->getIntegerBitWidth() >= FieldWidth)
1285 return std::make_pair(Src, 0u);
1288 return std::make_pair(Val, 0u);
1289 return std::nullopt;
1295 unsigned FieldWidth = 0;
1297 FieldWidth = Mask->popcount();
1300 if (FieldWidth != 0) {
1301 if (std::optional<std::pair<Value *, unsigned>>
Field =
1302 MatchLowField(Val, FieldWidth))
1303 return std::make_tuple(
Field->first, FieldWidth,
Field->second);
1304 return std::nullopt;
1306 unsigned LaneWidth = V->getType()->getIntegerBitWidth();
1310 unsigned SrcWidth = Src->getType()->getIntegerBitWidth();
1313 if (std::optional<unsigned>
Offset =
1314 GetFieldOffset(Amt, SrcWidth, LaneWidth))
1315 return std::make_tuple(Src, LaneWidth, *
Offset);
1317 unsigned FieldWidth = SrcWidth - ShAmt;
1318 if (FieldWidth > 0 && FieldWidth < LaneWidth && ShAmt % FieldWidth == 0)
1319 return std::make_tuple(Src, FieldWidth, ShAmt / FieldWidth);
1320 return std::nullopt;
1325 unsigned ShfWidth = Src->getType()->getIntegerBitWidth();
1327 unsigned FieldWidth = ShfWidth - ShAmt;
1328 if (FieldWidth > 0 && ShAmt % FieldWidth == 0) {
1330 return std::make_tuple(Src, FieldWidth, ShAmt / FieldWidth);
1332 return std::nullopt;
1335 return std::make_tuple(Src, LaneWidth, 0u);
1336 return std::nullopt;
1339std::optional<std::tuple<Value *, unsigned, SmallVector<int>>>
1344 if (VL.
size() < 2 || !VL.
front()->getType()->isIntegerTy() ||
isSplat(VL) ||
1346 return std::nullopt;
1347 Value *Src =
nullptr;
1348 unsigned FieldWidth = 0;
1353 if (V->getType() != VL.
front()->getType())
1354 return std::nullopt;
1355 std::optional<std::tuple<Value *, unsigned, unsigned>>
Field =
1357 if (!
Field || (Src && (Src != std::get<0>(*
Field) ||
1358 FieldWidth != std::get<1>(*
Field))))
1359 return std::nullopt;
1360 Src = std::get<0>(*
Field);
1361 FieldWidth = std::get<1>(*
Field);
1362 Mask[Idx] = std::get<2>(*
Field);
1368 Src->getType()->getIntegerBitWidth() % FieldWidth != 0)
1369 return std::nullopt;
1375 return std::nullopt;
1376 return std::make_tuple(Src, FieldWidth, std::move(Mask));
1384 unsigned BitWidth = V->getType()->getScalarSizeInBits();
1434 unsigned NumElts = PossibleBits.
size();
1437 for (
unsigned Idx :
seq(NumElts)) {
1438 APInt Possible = PossibleBits[Idx].shl(ShlAmts[Idx]) & Masks[Idx];
1443 return std::nullopt;
1444 if (Info.FieldWidth == 0) {
1445 if (W % 8 != 0 ||
BitWidth % W != 0)
1446 return std::nullopt;
1447 Info.FieldWidth = W;
1450 if (W != Info.FieldWidth ||
Lo % W != 0)
1451 return std::nullopt;
1454 return std::nullopt;
1455 Info.LaneOfField[
Field] = Idx;
1456 Info.LShrAmts[Idx] =
Lo - ShlAmts[Idx];
1458 if (Info.FieldWidth == 0)
1459 return std::nullopt;
1464 unsigned NumElts,
unsigned BytesPerLane) {
1465 unsigned BytesPerField = Info.FieldWidth / 8;
1467 for (
unsigned J :
seq(NumBytes)) {
1468 unsigned Lane = Info.LaneOfField[J / BytesPerField];
1470 ? (
int)(NumElts * BytesPerLane)
1471 : (
int)(Lane * BytesPerLane + J % BytesPerField));
1477 unsigned ShiftWidth,
unsigned &NumInsts) {
1480 unsigned BitWidth = VecTy->getScalarSizeInBits();
1482 "The byte-multiple field width divides the result bit width.");
1483 unsigned NumElts = VecTy->getNumElements();
1489 Y = Z->getOperand(0);
1491 Y = Builder.CreateTrunc(
1497 if (Info.needsShift()) {
1499 for (uint64_t
A : Info.LShrAmts)
1505 unsigned InBytes = NumElts * (ShiftWidth / 8);
1513 return Builder.CreateUnaryIntrinsic(Intrinsic::bswap,
1514 Builder.CreateBitCast(
Y, IntTy));
1519 return Builder.CreateBitCast(
Y, IntTy);
1521 Value *Packed = Builder.CreateShuffleVector(
1522 Builder.CreateBitCast(
Y, ByteTy),
1528 return Builder.CreateBitCast(Packed, IntTy);
1536 if (!DVR->isDbgValue())
1539 if (ExI && MarkedI->
getParent() != ExI->getParent())
1541 if (!ExI || ExI->comesBefore(MarkedI)) {
1542 DVR->replaceVariableLocationOp(&From, &To);
1546 auto HasSameVar = [&](
auto Records) {
1552 if (HasSameVar(
make_range(std::next(DVR->getIterator()),
1555 std::next(ExI->getIterator())),
1557 return HasSameVar(I.getDbgRecordRange());
1562 ExI->getParent()->insertDbgRecordAfter(NewDVR, ExI);
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
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.
iterator_range< simple_ilist< DbgRecord >::iterator > getDbgRecordRange() const
Return a range over the DbgRecords attached to this instruction.
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()
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.
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...
static LLVM_ABI bool isReverseMask(ArrayRef< int > Mask, int NumSrcElts)
Return true if this shuffle mask swaps the order of elements from exactly one source vector.
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.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
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 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.
#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)
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)
Value * buildBitPack(IRBuilderBase &Builder, Value *X, const BitPackInfo &Info, unsigned ShiftWidth, unsigned &NumInsts)
Builds the bitfield packing of X per the layout and the shift width.
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.
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....
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,...
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.
unsigned getShufflevectorNumGroups(ArrayRef< Value * > VL)
std::optional< TargetTransformInfo::ShuffleKind > isFixedVectorShuffle(ArrayRef< Value * > VL, SmallVectorImpl< int > &Mask, AssumptionCache *AC)
Checks if the vector of instructions can be represented as a shuffle, like: x0 = extractelement <4 x ...
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 ...
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...
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
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.
LLVM_ABI bool isGuaranteedNotToBePoison(const Value *V, AssumptionCache *AC=nullptr, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, unsigned Depth=0)
Returns true if V cannot be poison, but may be undef.
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.