51 case Instruction::Sub:
52 return Instruction::Add;
53 case Instruction::FSub:
54 return Instruction::FAdd;
61 if (
I->getOpcode() == Instruction::Sub)
63 if (
I->getOpcode() == Instruction::FSub)
64 return I->hasAllowReassoc();
65 return I->isAssociative();
73 switch (
I->getOpcode()) {
74 case Instruction::ExtractValue:
75 case Instruction::InsertValue:
77 case Instruction::ExtractElement:
80 case Instruction::InsertElement:
90 "ScalableVectorType is not supported.");
101 return std::min<unsigned>(PartNumElems,
Size - Part * PartNumElems);
109 OS <<
"Idx: " << Idx <<
", ";
110 OS <<
"n=" << VL.
size() <<
" [" << *VL.
front() <<
", ..]";
125 return !isa<PoisonValue>(V);
131 if (BB !=
II->getParent())
144 Value *FirstNonUndef =
nullptr;
147 if (!FirstNonUndef) {
151 if (V != FirstNonUndef)
154 return FirstNonUndef !=
nullptr;
160 if ((LHS == Intrinsic::fma || LHS == Intrinsic::fmuladd) &&
161 (RHS == Intrinsic::fma || RHS == Intrinsic::fmuladd))
162 return Intrinsic::fma;
169 return Cmp->isCommutative();
171 return BO->isCommutative() ||
172 (BO->getOpcode() == Instruction::Sub && ValWithUses->
hasUseList() &&
179 if (match(U.getUser(),
180 m_ICmp(Pred, m_Specific(U.get()), m_Zero())) &&
181 (Pred == ICmpInst::ICMP_EQ || Pred == ICmpInst::ICMP_NE))
185 auto *I = dyn_cast<BinaryOperator>(U.get());
186 return match(U.getUser(),
187 m_Intrinsic<Intrinsic::abs>(
188 m_Specific(U.get()), m_ConstantInt(Flag))) &&
189 ((!IsCopyable && I && !I->hasNoSignedWrap()) ||
192 (BO->getOpcode() == Instruction::FSub && ValWithUses->
hasUseList() &&
195 return match(U.getUser(),
196 m_Intrinsic<Intrinsic::fabs>(m_Specific(U.get())));
198 return I->isCommutative();
206 "The instruction is not commutative.");
210 switch (BO->getOpcode()) {
211 case Instruction::Sub:
212 case Instruction::FSub:
218 return I->isCommutableOperand(
Op);
225 constexpr unsigned IntrinsicNumOperands = 2;
226 return IntrinsicNumOperands;
228 return I->getNumOperands();
243 Type *CurrentType =
IV->getType();
244 for (
unsigned I :
IV->indices()) {
246 Index *= ST->getNumElements();
247 CurrentType = ST->getElementType(
I);
249 Index *= AT->getNumElements();
250 CurrentType = AT->getElementType();
269 if (auto *CI = dyn_cast<CmpInst>(V))
270 return BasePred == CI->getPredicate();
271 if (auto *I = dyn_cast<Instruction>(V))
272 return I->getOpcode() == Opcode;
273 return isa<PoisonValue>(V);
278 unsigned Opcode = E->getOpcode();
279 assert((Opcode == Instruction::ExtractElement ||
280 Opcode == Instruction::ExtractValue) &&
281 "Expected extractelement or extractvalue instruction.");
282 if (Opcode == Instruction::ExtractElement) {
288 unsigned Idx = CI->getZExtValue();
296 if (EI->getNumIndices() != 1)
298 return *EI->idx_begin();
304 const unsigned E = Indices.
size();
306 for (
unsigned I = 0;
I < E; ++
I)
307 Mask[Indices[
I]] =
I;
311 assert(!Mask.empty() &&
"Expected non-empty mask.");
315 for (
unsigned I = 0, E = Prev.
size();
I < E; ++
I)
317 Scalars[Mask[
I]] = Prev[
I];
321 assert(!Mask.empty() && Reuses.
size() == Mask.size() &&
322 "Expected non-empty mask.");
325 for (
unsigned I = 0, E = Prev.
size();
I < E; ++
I)
327 Reuses[Mask[
I]] = Prev[
I];
332 assert(!Mask.empty() &&
"Expected non-empty mask.");
333 unsigned Sz = Mask.size();
338 std::iota(PrevOrder.
begin(), PrevOrder.
end(), 0);
340 PrevOrder.
swap(Order);
343 for (
unsigned I = 0;
I < Sz; ++
I)
345 Order[
I] = PrevOrder[Mask[
I]];
347 return Data.value() == Sz ||
Data.index() ==
Data.value();
358 std::iota(MaskOrder.
begin(), MaskOrder.
end(), 0);
368 for (
unsigned I = 0;
I < Sz; ++
I)
370 Order[MaskOrder[
I]] =
I;
376 "Order is empty. Please check it before using isReverseOrder.");
377 unsigned Sz = Order.
size();
379 return Pair.value() == Sz || Sz - Pair.index() - 1 == Pair.value();
387 for (
unsigned I = Sz, E = Mask.size();
I < E;
I += Sz) {
398 "Expected same size of orders");
399 size_t Sz = Order.
size();
402 if (Order[Idx] != Sz)
403 UsedIndices.
set(Order[Idx]);
405 if (SecondaryOrder.
empty()) {
407 if (Order[Idx] == Sz && !UsedIndices.
test(Idx))
411 if (SecondaryOrder[Idx] != Sz && Order[Idx] == Sz &&
412 !UsedIndices.
test(SecondaryOrder[Idx]))
413 Order[Idx] = SecondaryOrder[Idx];
418 assert(!VL.
empty() &&
"Expected non-empty list of values.");
420 return all_of(VL, [&](
Value *V) {
return V->getType() == Ty; });
426 static_assert(std::is_same_v<T, InsertElementInst> ||
427 std::is_same_v<T, ExtractElementInst>,
434 constexpr bool IsInsert = std::is_same_v<T, InsertElementInst>;
435 Type *VecTy = IsInsert ? IE->getType() : IE->getOperand(0)->getType();
442 if (CI->getValue().uge(VT->getNumElements()))
445 Index *= VT->getNumElements();
446 Index += CI->getZExtValue();
452template std::optional<unsigned>
454template std::optional<unsigned>
464 return isa<PHINode>(IO) || IO->getParent() != I->getParent();
473 return !
I->mayReadOrWriteMemory() && !
I->hasNUsesOrMore(
UsesLimit) &&
475 auto *IU = dyn_cast<Instruction>(U);
478 return IU->getParent() != I->getParent() || isa<PHINode>(IU);
487 return !VL.
empty() &&
500 I * VecTyNumElements, VecTyNumElements)))
502 : Mask[
I] * VecTyNumElements + J;
512 unsigned SVNumElements =
514 unsigned ShuffleMaskSize = SV->getShuffleMask().size();
515 if (SVNumElements % ShuffleMaskSize != 0)
517 unsigned GroupSize = SVNumElements / ShuffleMaskSize;
518 if (GroupSize == 0 || (VL.
size() % GroupSize) != 0)
520 unsigned NumGroup = 0;
521 for (
size_t I = 0, E = VL.
size();
I != E;
I += GroupSize) {
523 Value *Src = SV->getOperand(0);
529 if (SV->getOperand(0) != Src)
532 if (!SV->isExtractSubvectorMask(Index))
534 ExpectedIndex.
set(Index / ShuffleMaskSize);
538 if (!ExpectedIndex.
all())
542 assert(NumGroup == (VL.
size() / GroupSize) &&
"Unexpected number of groups");
549 unsigned SVNumElements =
552 unsigned AccumulateLength = 0;
553 for (
Value *V : VL) {
555 for (
int M : SV->getShuffleMask())
557 : AccumulateLength + M);
558 AccumulateLength += SVNumElements;
585std::optional<TargetTransformInfo::ShuffleKind>
598 return std::max(S, VTy->getNumElements());
601 Value *Vec1 =
nullptr;
602 Value *Vec2 =
nullptr;
611 ShuffleMode CommonShuffleMode =
Unknown;
613 for (
unsigned I = 0, E = VL.
size();
I < E; ++
I) {
623 auto *Vec = EI->getVectorOperand();
637 if (Idx->getValue().uge(
Size))
639 unsigned IntIdx = Idx->getValue().getZExtValue();
646 if (!Vec1 || Vec1 == Vec) {
648 }
else if (!Vec2 || Vec2 == Vec) {
654 if (CommonShuffleMode == Permute)
658 if (Mask[
I] %
Size !=
I) {
659 CommonShuffleMode = Permute;
662 CommonShuffleMode =
Select;
665 if (CommonShuffleMode ==
Select && Vec2)
684 auto *Begin = std::next(Mask.begin(), Index);
685 std::iota(Begin, std::next(Begin, SubVecVF), 0);
686 Vec = Builder.CreateShuffleVector(V, Mask);
689 std::iota(Mask.begin(), Mask.end(), 0);
690 std::iota(std::next(Mask.begin(), Index),
691 std::next(Mask.begin(), Index + SubVecVF), VecVF);
693 return Generator(Vec, V, Mask);
696 std::iota(ResizeMask.
begin(), std::next(ResizeMask.
begin(), SubVecVF), 0);
697 V = Builder.CreateShuffleVector(V, ResizeMask);
699 return Builder.CreateShuffleVector(Vec, V, Mask);
703 unsigned SubVecVF,
unsigned Index) {
705 std::iota(Mask.begin(), Mask.end(), Index);
706 return Builder.CreateShuffleVector(Vec, Mask);
725template <
bool IsPoisonOnly>
728 using T = std::conditional_t<IsPoisonOnly, PoisonValue, UndefValue>;
762 for (
unsigned I = 0, E = VecTy->getNumElements();
I != E; ++
I) {
763 if (
Constant *Elem =
C->getAggregateElement(
I))
783 case Instruction::Load: {
787 case Instruction::Store: {
789 return (
SI->getPointerOperand() == Scalar);
791 case Instruction::Call: {
795 return isVectorIntrinsicWithScalarOpAtArg(ID, Arg.index(), TTI) &&
796 Arg.value().get() == Scalar;
814 return LI->isSimple();
816 return SI->isSimple();
818 return !
MI->isVolatile();
828 uint64_t ScalarSize =
DL.getTypeStoreSize(ScalarTy);
829 Conditions.
assign(PointerOps.
size(),
nullptr);
834 APInt OffsetAP(
DL.getIndexTypeSizeInBits(
GEP->getType()), 0);
835 if (!
GEP->accumulateConstantOffset(
DL, OffsetAP) || OffsetAP.
isNegative())
838 Base =
GEP->getPointerOperand();
843 Value *
T = Sel->getTrueValue();
844 Value *
F = Sel->getFalseValue();
850 }
else if (TrueBase !=
T || FalseBase !=
F) {
855 if (
Offset !=
static_cast<uint64_t
>(Idx) * ScalarSize)
857 Conditions[Idx] = Sel->getCondition();
859 return TrueBase !=
nullptr;
865 constexpr unsigned IndexIdx = 1;
869 bool AllSameTy =
true;
870 bool HasNonConstIdx =
false;
871 bool ConstsFitVL0Ty =
true;
874 if (
Op->getType() != VL0Ty)
879 if (
Op->getType() != VL0Ty)
881 HasNonConstIdx =
true;
885 ConstsFitVL0Ty =
false;
889 if (!HasNonConstIdx || VL0Ty == PtrIdxTy)
891 return ConstsFitVL0Ty ? VL0Ty :
nullptr;
896 if (UniquePtrs.
size() != PointerOps.
size())
898 auto IsConstantOffsetPtr = [](
Value *
P) {
903 auto *RefIt =
find_if_not(PointerOps, IsConstantOffsetPtr);
904 if (RefIt == PointerOps.
end())
907 if (!RefGEP || RefGEP->getNumOperands() != 2)
909 Value *
Base = RefGEP->getPointerOperand();
910 Type *PtrTy = RefGEP->getType();
911 Type *SrcElemTy = RefGEP->getSourceElementType();
913 Value *Stride =
nullptr;
914 unsigned CastOpcode = 0;
915 for (
Value *
P : PointerOps) {
916 if (
P->getType() != PtrTy)
921 if (!
GEP ||
GEP->getNumOperands() != 2 ||
922 GEP->getPointerOperand() !=
Base ||
923 GEP->getSourceElementType() != SrcElemTy)
928 unsigned LaneCastOpcode = 0;
930 LaneCastOpcode = Cast->getOpcode();
931 Idx = Cast->getOperand(0);
933 Value *LaneStride = Idx;
936 LaneStride = BO->getOperand(0);
938 LaneStride = BO->getOperand(1);
942 CastOpcode = LaneCastOpcode;
945 if (LaneStride != Stride || LaneCastOpcode != CastOpcode)
948 return Stride !=
nullptr;
952 bool ExtendingManyInputs) {
956 (!ExtendingManyInputs || SubMask.
size() > Mask.size() ||
959 "SubMask with many inputs support must be larger than the mask.");
961 Mask.append(SubMask.
begin(), SubMask.
end());
965 int TermValue = std::min(Mask.size(), SubMask.
size());
966 for (
int I = 0, E = SubMask.
size();
I < E; ++
I) {
968 (!ExtendingManyInputs &&
969 (SubMask[
I] >= TermValue || Mask[SubMask[
I]] >= TermValue)))
971 NewMask[
I] = Mask[SubMask[
I]];
977 const size_t Sz = Order.
size();
980 for (
unsigned I = 0;
I < Sz; ++
I) {
982 UnusedIndices.
reset(Order[
I]);
984 MaskedIndices.
set(
I);
986 if (MaskedIndices.
none())
989 "Non-synced masked/available indices.");
993 assert(Idx >= 0 &&
"Indices must be synced.");
1001 unsigned Opcode0,
unsigned Opcode1) {
1008 OpcodeMask.
set(Lane * ScalarTyNumElements,
1009 Lane * ScalarTyNumElements + ScalarTyNumElements);
1016 "Expected scalar constants.");
1019 std::fill_n(NewVal.begin() +
I * VF, VF, V);
1025 case Instruction::UDiv:
1026 return Intrinsic::masked_udiv;
1027 case Instruction::SDiv:
1028 return Intrinsic::masked_sdiv;
1029 case Instruction::URem:
1030 return Intrinsic::masked_urem;
1031 case Instruction::SRem:
1032 return Intrinsic::masked_srem;
1043 constexpr unsigned MaxIndexChainLength = 3;
1046 auto IsProfitableOperand = [](
const Value *V) {
1050 V = Cast->getOperand(0);
1053 const User *U =
I->user_back();
1054 for ([[maybe_unused]]
unsigned _ :
seq<unsigned>(MaxIndexChainLength)) {
1057 none_of(
I->operand_values(), IsProfitableOperand);
1071 unsigned Opcode = BO->getOpcode();
1072 Type *Ty = BO->getType();
1076 Opcode, Ty, Idx == 1) ||
1078 Opcode, Ty, Idx == 0)))
1082 const User *U =
I->user_back();
1094 if (!Wide || !Wide->hasOneUse())
1097 if (!Narrow || !Narrow->hasOneUse())
1099 Value *Src = Narrow->getOperand(0);
1102 if (MustBeElidable && !(Wide->hasAllowContract() && Wide->hasNoNaNs() &&
1103 Wide->hasNoInfs() && Narrow->hasAllowContract()))
1113struct NarrowedChainState {
1115 unsigned NarrowShift = 0;
1116 unsigned NarrowBW = 0;
1134 NarrowedChainState S,
unsigned Depth,
1138 if (
Depth < MaxDepth) {
1140 Z && Z->getSrcTy()->isIntegerTy() && !Z->getSrcTy()->isIntegerTy(1)) {
1143 Depth + 1, MaxDepth, Leaves, ChainInsts);
1146 if (BO->getOpcode() == RdxOpcode) {
1149 Depth + 1, MaxDepth, Leaves, ChainInsts);
1151 Depth + 1, MaxDepth, Leaves, ChainInsts);
1155 unsigned BW = V->getType()->getScalarSizeInBits();
1157 if (BO->getOpcode() == Instruction::Shl && Z && S.NarrowBW == 0 &&
1159 Z->getSrcTy()->isIntegerTy() && !Z->getSrcTy()->isIntegerTy(1) &&
1161 Z->getSrcTy()->getIntegerBitWidth() + Amt->
getZExtValue() <= BW) &&
1167 Depth + 1, MaxDepth, Leaves,
1174 if (BW < WideBW && (S.NarrowBW == 0 || BW == S.NarrowBW)) {
1175 if (BO->getOpcode() == Instruction::Shl &&
1178 S.Shift + S.NarrowShift + Amt->
getZExtValue() < WideBW) {
1180 if (BO->hasNoUnsignedWrap() && S.NarrowBW == 0) {
1187 if (S.NarrowBW == 0) {
1194 S,
Depth + 1, MaxDepth, Leaves,
1200 if (S.NarrowBW == 0) {
1204 S.NarrowMask &= *Amt << S.NarrowShift;
1206 MaxDepth, Leaves, ChainInsts);
1212 S.getMask(V->getType()->getScalarSizeInBits()));
1220 0, MaxDepth, Leaves, ChainInsts);
1224 assert(
F &&
"Expected function.");
1230static std::optional<std::tuple<Value *, unsigned, unsigned>>
1232 if (!V->getType()->isIntegerTy())
1233 return std::nullopt;
1236 auto GetFieldOffset = [](
const APInt *Amt,
unsigned BitWidth,
1237 unsigned FieldWidth) -> std::optional<unsigned> {
1239 if (ShAmt % FieldWidth != 0 || ShAmt + FieldWidth >
BitWidth)
1240 return std::nullopt;
1241 return ShAmt / FieldWidth;
1246 auto MatchLowField =
1248 unsigned FieldWidth) -> std::optional<std::pair<Value *, unsigned>> {
1254 if (std::optional<unsigned>
Offset = GetFieldOffset(
1255 Amt, Src->getType()->getIntegerBitWidth(), FieldWidth)) {
1258 return std::make_pair(Src, *
Offset);
1260 return std::nullopt;
1263 Src->getType()->getIntegerBitWidth() >= FieldWidth)
1264 return std::make_pair(Src, 0u);
1267 return std::make_pair(Val, 0u);
1268 return std::nullopt;
1274 unsigned FieldWidth = 0;
1276 FieldWidth = Mask->popcount();
1279 if (FieldWidth != 0) {
1280 if (std::optional<std::pair<Value *, unsigned>>
Field =
1281 MatchLowField(Val, FieldWidth))
1282 return std::make_tuple(
Field->first, FieldWidth,
Field->second);
1283 return std::nullopt;
1285 unsigned LaneWidth = V->getType()->getIntegerBitWidth();
1289 unsigned SrcWidth = Src->getType()->getIntegerBitWidth();
1292 if (std::optional<unsigned>
Offset =
1293 GetFieldOffset(Amt, SrcWidth, LaneWidth))
1294 return std::make_tuple(Src, LaneWidth, *
Offset);
1296 unsigned FieldWidth = SrcWidth - ShAmt;
1297 if (FieldWidth > 0 && FieldWidth < LaneWidth && ShAmt % FieldWidth == 0)
1298 return std::make_tuple(Src, FieldWidth, ShAmt / FieldWidth);
1299 return std::nullopt;
1304 unsigned ShfWidth = Src->getType()->getIntegerBitWidth();
1306 unsigned FieldWidth = ShfWidth - ShAmt;
1307 if (FieldWidth > 0 && ShAmt % FieldWidth == 0) {
1309 return std::make_tuple(Src, FieldWidth, ShAmt / FieldWidth);
1311 return std::nullopt;
1314 return std::make_tuple(Src, LaneWidth, 0u);
1315 return std::nullopt;
1318std::optional<std::tuple<Value *, unsigned, SmallVector<int>>>
1323 if (VL.
size() < 2 || !VL.
front()->getType()->isIntegerTy() ||
isSplat(VL) ||
1325 return std::nullopt;
1326 Value *Src =
nullptr;
1327 unsigned FieldWidth = 0;
1332 if (V->getType() != VL.
front()->getType())
1333 return std::nullopt;
1334 std::optional<std::tuple<Value *, unsigned, unsigned>>
Field =
1336 if (!
Field || (Src && (Src != std::get<0>(*
Field) ||
1337 FieldWidth != std::get<1>(*
Field))))
1338 return std::nullopt;
1339 Src = std::get<0>(*
Field);
1340 FieldWidth = std::get<1>(*
Field);
1341 Mask[Idx] = std::get<2>(*
Field);
1347 Src->getType()->getIntegerBitWidth() % FieldWidth != 0)
1348 return std::nullopt;
1354 return std::nullopt;
1355 return std::make_tuple(Src, FieldWidth, std::move(Mask));
1363 unsigned BitWidth = V->getType()->getScalarSizeInBits();
1413 unsigned NumElts = PossibleBits.
size();
1416 for (
unsigned Idx :
seq(NumElts)) {
1417 APInt Possible = PossibleBits[Idx].shl(ShlAmts[Idx]) & Masks[Idx];
1422 return std::nullopt;
1423 if (Info.FieldWidth == 0) {
1424 if (W % 8 != 0 ||
BitWidth % W != 0)
1425 return std::nullopt;
1426 Info.FieldWidth = W;
1429 if (W != Info.FieldWidth ||
Lo % W != 0)
1430 return std::nullopt;
1433 return std::nullopt;
1434 Info.LaneOfField[
Field] = Idx;
1435 Info.LShrAmts[Idx] =
Lo - ShlAmts[Idx];
1437 if (Info.FieldWidth == 0)
1438 return std::nullopt;
1443 unsigned NumElts,
unsigned BytesPerLane) {
1444 unsigned BytesPerField = Info.FieldWidth / 8;
1446 for (
unsigned J :
seq(NumBytes)) {
1447 unsigned Lane = Info.LaneOfField[J / BytesPerField];
1449 ? (
int)(NumElts * BytesPerLane)
1450 : (
int)(Lane * BytesPerLane + J % BytesPerField));
1456 unsigned ShiftWidth,
unsigned &NumInsts) {
1459 unsigned BitWidth = VecTy->getScalarSizeInBits();
1461 "The byte-multiple field width divides the result bit width.");
1462 unsigned NumElts = VecTy->getNumElements();
1468 Y = Z->getOperand(0);
1470 Y = Builder.CreateTrunc(
1476 if (Info.needsShift()) {
1478 for (uint64_t
A : Info.LShrAmts)
1484 unsigned InBytes = NumElts * (ShiftWidth / 8);
1492 return Builder.CreateUnaryIntrinsic(Intrinsic::bswap,
1493 Builder.CreateBitCast(
Y, IntTy));
1498 return Builder.CreateBitCast(
Y, IntTy);
1500 Value *Packed = Builder.CreateShuffleVector(
1501 Builder.CreateBitCast(
Y, ByteTy),
1507 return Builder.CreateBitCast(Packed, IntTy);
1515 if (!DVR->isDbgValue())
1518 if (ExI && MarkedI->
getParent() != ExI->getParent())
1520 if (!ExI || ExI->comesBefore(MarkedI)) {
1521 DVR->replaceVariableLocationOp(&From, &To);
1525 auto HasSameVar = [&](
auto Records) {
1531 if (HasSameVar(
make_range(std::next(DVR->getIterator()),
1534 std::next(ExI->getIterator())),
1536 return HasSameVar(I.getDbgRecordRange());
1541 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 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
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_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.
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,...
bool isBinOpIdentityConstant(const Value *V, unsigned Opcode)
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.
auto accumulate(R &&Range, E &&Init)
Wrapper for std::accumulate.
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.
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.
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.