LLVM 24.0.0git
SLPUtils.h
Go to the documentation of this file.
1//===- SLPUtils.h - SLP Vectorizer free utility helpers --------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Internal header used by SLPVectorizer.cpp. It declares free helper
10// functions that do not depend on BoUpSLP, InstructionsState, or any other
11// SLP-private type. Splitting them out keeps SLPVectorizer.cpp focused on
12// the build / legality / cost / codegen pipeline.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_LIB_TRANSFORMS_VECTORIZE_SLPVECTORIZER_SLPUTILS_H
17#define LLVM_LIB_TRANSFORMS_VECTORIZE_SLPVECTORIZER_SLPUTILS_H
18
19#include "llvm/ADT/APInt.h"
20#include "llvm/ADT/ArrayRef.h"
21#include "llvm/ADT/STLExtras.h"
27#include "llvm/IR/Intrinsics.h"
28
29#include <cstdint>
30#include <limits>
31#include <optional>
32#include <string>
33#include <tuple>
34
35namespace llvm {
36class AssumptionCache;
37class Constant;
38class DataLayout;
39class Instruction;
40class IRBuilderBase;
42class Type;
43class Value;
44} // namespace llvm
45
46namespace llvm::slpvectorizer {
47
48/// Limit of the number of uses for potentially transformed instructions/values,
49/// used in checks to avoid compile-time explode.
50inline constexpr int UsesLimit = 64;
51
52/// \returns True if the value is a constant (but not globals/constant
53/// expressions).
54bool isConstant(Value *V);
55
56/// \returns True if \p V is the integer identity constant for binary \p Opcode
57/// (e.g. 0 for add, 1 for mul, all-ones for and). Floating-point identities are
58/// excluded: a ConstantInt never matches the ConstantFP getBinOpIdentity()
59/// returns for FAdd/FMul, whose identity fast-math may break anyway.
60bool isBinOpIdentityConstant(const Value *V, unsigned Opcode);
61
62/// \returns the opcode of the combines emitted for a reassociated node:
63/// subtract chains regroup their positive and negative operand columns with
64/// plain adds.
65unsigned getReassocCombineOpcode(unsigned Opcode);
66
67/// \returns True if \p I can be a link of a flattenable binary chain:
68/// subtracts flatten as adds of a negated leaf, float subtracts need reassoc
69/// to allow the regrouping.
71
72/// Checks if \p V is one of vector-like instructions, i.e. undef,
73/// insertelement/extractelement with constant indices for fixed vector type
74/// or extractvalue instruction.
76
77/// \returns the number of elements for Ty.
78unsigned getNumElements(Type *Ty);
79
80/// Returns power-of-2 number of elements in a single register (part), given
81/// the total number of elements \p Size and number of registers (parts) \p
82/// NumParts.
83unsigned getPartNumElems(unsigned Size, unsigned NumParts);
84
85/// Returns correct remaining number of elements, considering total amount
86/// \p Size, (power-of-2 number) of elements in a single register
87/// \p PartNumElems and current register (part) \p Part.
88unsigned getNumElems(unsigned Size, unsigned PartNumElems, unsigned Part);
89
90#if !defined(NDEBUG)
91/// Print a short descriptor of the instruction bundle suitable for debug
92/// output.
93std::string shortBundleName(ArrayRef<Value *> VL, int Idx = -1);
94#endif
95
96/// \returns True if all of the instructions in \p VL are in the same block.
98
99/// \returns True if all of the values in \p VL are constants (but not
100/// globals/constant expressions).
102
103/// \returns True if all of the values in \p VL are identical or some of them
104/// are UndefValue.
106
107/// Checks if \p LHS and \p RHS are the same intrinsic, or one is llvm.fma
108/// and the other is llvm.fmuladd, since both lower to the same fused
109/// vector operation.
110/// \returns the intrinsic ID to use for the pair (\p RHS if the IDs match,
111/// otherwise Intrinsic::fma), or Intrinsic::not_intrinsic if they are not
112/// equivalent.
114
115/// \returns True if \p I is commutative, handles CmpInst and BinaryOperator.
116/// For BinaryOperator, it also checks if \p ValWithUses is used in specific
117/// patterns that make it effectively commutative (like equality comparisons
118/// with zero).
119/// In most cases, users should not call this function directly (since \p I and
120/// \p ValWithUses are the same). However, when analyzing interchangeable
121/// instructions, we need to use the converted opcode along with the original
122/// uses.
123/// \param I The instruction to check for commutativity
124/// \param ValWithUses The value whose uses are analyzed for special
125/// patterns
126bool isCommutative(const Instruction *I, const Value *ValWithUses,
127 bool IsCopyable = false);
128
129/// This is a helper function to check whether \p I is commutative.
130/// This is a convenience wrapper that calls the two-parameter version of
131/// isCommutative with the same instruction for both parameters. This is
132/// the common case where the instruction being checked for commutativity
133/// is the same as the instruction whose uses are analyzed for special
134/// patterns (see the two-parameter version above for details).
135/// \param I The instruction to check for commutativity
136/// \returns true if the instruction is commutative, false otherwise
137bool isCommutative(const Instruction *I);
138
139/// Checks if the operand is commutative. In commutative operations, not all
140/// operands might commutable, e.g. for fmuladd only 2 first operands are
141/// commutable.
142bool isCommutableOperand(const Instruction *I, Value *ValWithUses, unsigned Op,
143 bool IsCopyable = false);
144
145/// \returns number of operands of \p I, considering commutativity. Returns 2
146/// for commutative intrinsics.
147/// \param I The instruction to check for commutativity
149
150/// \returns inserting or extracting index of InsertElement, ExtractElement
151/// or InsertValue instruction, using \p Offset as base offset for index.
152/// \returns std::nullopt if the index is not an immediate.
153std::optional<unsigned> getElementIndex(const Value *Inst, unsigned Offset = 0);
154
155/// \returns True if all of the values in \p VL use the same opcode.
156/// For comparison instructions, also checks if predicates match.
157/// PoisonValues are considered matching. Interchangeable instructions are
158/// not considered.
160
161/// \returns Optional element Idx for Extract{Value,Element} instructions.
162std::optional<unsigned> getExtractIndex(const Instruction *E);
163
164/// Compute the inverse permutation \p Mask of \p Indices.
166
167/// Reorders the list of scalars in accordance with the given \p Mask.
169
170/// Reorders the given \p Reuses mask according to the given \p Mask. \p Reuses
171/// contains original mask for the scalars reused in the node. Procedure
172/// transform this mask in accordance with the given \p Mask.
174
175/// Reorders the given \p Order according to the given \p Mask. \p Order - is
176/// the original order of the scalars. Procedure transforms the provided order
177/// in accordance with the given \p Mask. If the resulting \p Order is just an
178/// identity order, \p Order is cleared.
180 bool BottomOrder = false);
181
182/// Check if \p Order represents reverse order.
184
185/// Checks if the given mask is a "clustered" mask with the same clusters of
186/// size \p Sz, which are not identity submasks.
188
189/// Fills unset elements of \p Order (marked with the sentinel value equal to
190/// the order size) with the corresponding elements of \p SecondaryOrder,
191/// skipping already used indices, or with the identity order if
192/// \p SecondaryOrder is empty.
194 ArrayRef<unsigned> SecondaryOrder);
195
196/// \returns True iff every value in \p VL has the same Type as the first.
198
199/// Checks if the provided value does not require scheduling. It does not
200/// require scheduling if this is not an instruction or it is an instruction
201/// that does not read/write memory and all operands are either not
202/// instructions or phi nodes or instructions from different blocks.
204
205/// Checks if the provided value does not require scheduling. It does not
206/// require scheduling if this is not an instruction or it is an instruction
207/// that does not read/write memory and all users are phi nodes or
208/// instructions from different blocks.
210
211/// Checks if the specified value does not require scheduling. It does not
212/// require scheduling if all operands and all users do not need to be
213/// scheduled in the current basic block.
215
216/// Checks if the specified array of instructions does not require scheduling.
217/// It is so if all either instructions have operands that do not require
218/// scheduling or their users do not require scheduling since they are phis or
219/// in other basic blocks.
221
222/// \returns inserting or extracting index of InsertElement / ExtractElement
223/// instruction, using \p Offset as base offset for index. Only instantiated
224/// for InsertElementInst and ExtractElementInst (see SLPUtils.cpp).
225template <typename T>
226std::optional<unsigned> getInsertExtractIndex(const Value *Inst,
227 unsigned Offset);
228
229void transformScalarShuffleIndiciesToVector(unsigned VecTyNumElements,
231
232/// \returns the number of groups of shufflevector
233/// A group has the following features
234/// 1. All of value in a group are shufflevector.
235/// 2. The mask of all shufflevector is isExtractSubvectorMask.
236/// 3. The mask of all shufflevector uses all of the elements of the source.
237/// e.g., it is 1 group (%0)
238/// %1 = shufflevector <16 x i8> %0, <16 x i8> poison,
239/// <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
240/// %2 = shufflevector <16 x i8> %0, <16 x i8> poison,
241/// <8 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
242/// it is 2 groups (%3 and %4)
243/// %5 = shufflevector <8 x i16> %3, <8 x i16> poison,
244/// <4 x i32> <i32 0, i32 1, i32 2, i32 3>
245/// %6 = shufflevector <8 x i16> %3, <8 x i16> poison,
246/// <4 x i32> <i32 4, i32 5, i32 6, i32 7>
247/// %7 = shufflevector <8 x i16> %4, <8 x i16> poison,
248/// <4 x i32> <i32 0, i32 1, i32 2, i32 3>
249/// %8 = shufflevector <8 x i16> %4, <8 x i16> poison,
250/// <4 x i32> <i32 4, i32 5, i32 6, i32 7>
251/// it is 0 group
252/// %12 = shufflevector <8 x i16> %10, <8 x i16> poison,
253/// <4 x i32> <i32 0, i32 1, i32 2, i32 3>
254/// %13 = shufflevector <8 x i16> %11, <8 x i16> poison,
255/// <4 x i32> <i32 0, i32 1, i32 2, i32 3>
257
258/// \returns a shufflevector mask which is used to vectorize shufflevectors
259/// e.g.,
260/// %5 = shufflevector <8 x i16> %3, <8 x i16> poison,
261/// <4 x i32> <i32 0, i32 1, i32 2, i32 3>
262/// %6 = shufflevector <8 x i16> %3, <8 x i16> poison,
263/// <4 x i32> <i32 4, i32 5, i32 6, i32 7>
264/// %7 = shufflevector <8 x i16> %4, <8 x i16> poison,
265/// <4 x i32> <i32 0, i32 1, i32 2, i32 3>
266/// %8 = shufflevector <8 x i16> %4, <8 x i16> poison,
267/// <4 x i32> <i32 4, i32 5, i32 6, i32 7>
268/// the result is
269/// <0, 1, 2, 3, 12, 13, 14, 15, 16, 17, 18, 19, 28, 29, 30, 31>
271
272/// Checks if the values in \p VL can be represented as a shuffle of at most
273/// two vector operands (extractelement lanes). On success, \p Mask is the
274/// equivalent shuffle mask.
275std::optional<TargetTransformInfo::ShuffleKind>
277 AssumptionCache *AC);
278
279/// Creates subvector insert. Generates shuffle using \p Generator or
280/// using default shuffle.
282 IRBuilderBase &Builder, Value *Vec, Value *V, unsigned Index,
283 function_ref<Value *(Value *, Value *, ArrayRef<int>)> Generator = {});
284
285/// Generates subvector extract.
287 unsigned SubVecVF, unsigned Index);
288
289/// Specifies the way the mask should be analyzed for undefs/poisonous elements
290/// in the shuffle mask.
291enum class UseMask {
292 FirstArg, ///< The mask is expected to be for permutation of 1-2 vectors,
293 ///< check for the mask elements for the first argument (mask
294 ///< indices are in range [0:VF)).
295 SecondArg, ///< The mask is expected to be for permutation of 2 vectors, check
296 ///< for the mask elements for the second argument (mask indices
297 ///< are in range [VF:2*VF))
298 UndefsAsMask ///< Consider undef mask elements (-1) as placeholders for
299 ///< future shuffle elements and mark them as ones as being used
300 ///< in future. Non-undef elements are considered as unused since
301 ///< they're already marked as used in the mask.
302};
303
304/// Prepares a use bitset for the given mask either for the first argument or
305/// for the second.
306SmallBitVector buildUseMask(int VF, ArrayRef<int> Mask, UseMask MaskArg);
307
308/// Checks if the given value is actually an undefined constant vector.
309/// Also, if the \p UseMask is not empty, tries to check if the non-masked
310/// elements actually mask the insertelement buildvector, if any.
311template <bool IsPoisonOnly = false>
313 const SmallBitVector &UseMask = {});
314
315/// \returns True if in-tree use also needs extract. This refers to
316/// possible scalar operand in vectorized instruction.
317bool doesInTreeUserNeedToExtract(Value *Scalar, Instruction *UserInst,
318 TargetLibraryInfo *TLI,
319 const TargetTransformInfo *TTI);
320
321/// \returns the AA location that is being access by the instruction.
322MemoryLocation getLocation(Instruction *I);
323
324/// \returns True if the instruction is not a volatile or atomic load/store.
325bool isSimple(Instruction *I);
326
327/// Checks if the loads with scalar type \p ScalarTy and pointer operands
328/// \p PointerOps are each (optionally via a constant-offset GEP) a
329/// `select Cond, A, B` picking between the same two base pointers A/B on
330/// every lane - the shape a fully unrolled `x = cond ? A[i] : B[i]` takes. On
331/// success \p TrueBase / \p FalseBase are the candidate bases and
332/// \p Conditions holds each lane's `select` condition, used to build the
333/// blend mask. Lane \p Idx must be at `Base + Idx * sizeof(ScalarTy)`; only
334/// dense, natural lane order starting at the base is recognized (reordered or
335/// partial groups fall back to Gather/Scatter).
336bool isSelectedBaseLoad(Type *ScalarTy, ArrayRef<Value *> PointerOps,
337 const DataLayout &DL, Value *&TrueBase,
338 Value *&FalseBase,
339 SmallVectorImpl<Value *> &Conditions);
340
341/// Shuffles \p Mask in accordance with the given \p SubMask.
342/// \param ExtendingManyInputs Supports reshuffling of the mask with not only
343/// one but two input vectors.
344void addMask(SmallVectorImpl<int> &Mask, ArrayRef<int> SubMask,
345 bool ExtendingManyInputs = false);
346
347/// Order may have elements assigned special value (size) which is out of
348/// bounds. Such indices only appear on places which correspond to undef values
349/// (see canReuseExtract for details) and used in order to avoid undef values
350/// have effect on operands ordering.
351/// The first loop below simply finds all unused indices and then the next loop
352/// nest assigns these indices for undef values positions.
353/// As an example below Order has two undef positions and they have assigned
354/// values 3 and 7 respectively:
355/// before: 6 9 5 4 9 2 1 0
356/// after: 6 3 5 4 7 2 1 0
358
359/// \returns a bitset for selecting opcodes. false for Opcode0 and true for
360/// Opcode1.
361SmallBitVector getAltInstrMask(ArrayRef<Value *> VL, Type *ScalarTy,
362 unsigned Opcode0, unsigned Opcode1);
363
364/// Replicates the given \p Val \p VF times.
366
367/// \returns the masked division/remainder intrinsic corresponding to \p
368/// Opcode. Disabled lanes of these intrinsics are poison rather than UB,
369/// unlike the plain opcode.
371
372/// Returns true if \p I forms a vectorizable bundle on its own and its single
373/// user does not tear the vector apart. Loads and addresses are excluded: the
374/// tree is built without the users, so it does not pay off the extracts. A
375/// cast, feeding a multi-used cast, is excluded for the same reason, such a
376/// user stays scalar. The fp-to-int conversions move the result to the other
377/// register domain, so the extracts are paid on top of the repacking. The
378/// values, feeding the inserts, are vectorized together with them by the
379/// dedicated attempt.
380bool isOnceUsedSeed(const Instruction *I);
381
382/// If \p V is a single-use fpext of a single-use fptrunc forming a round-trip
383/// back to the type of \p V, returns the fptrunc; the round-trip source is its
384/// operand, always an instruction of the same type as \p V. If
385/// \p MustBeElidable, matches only when the intermediate rounding may be
386/// removed: both casts must allow contraction and the widening cast cannot
387/// produce nan/inf.
388Instruction *lookThroughCastRoundTrip(Value *V, bool MustBeElidable);
389
390/// Narrow reduction leaf: the value, the shift applied after widening and
391/// the mask applied in the narrow type before widening, clearing the bits
392/// the absorbed narrow shls shift out and applying the absorbed narrow
393/// and-masks. Lossless narrow shls contribute their known-zero bits to the
394/// mask so matching lanes can form a splat. All-ones mask means nothing
395/// was absorbed and no 'and' is needed.
399
401 unsigned Shift;
403};
404
405/// Recursively collects the narrow leaves of the widened reduction value
406/// \p V. zext is looked through directly, same-kind binops per operand,
407/// shl of a zext - only if no bits are shifted out in the current type,
408/// shls in narrower types fold into the shift and ands with a constant into
409/// the mask applied in the narrow type. Also collects the looked-through
410/// instructions into \p ChainInsts.
411void collectNarrowedLeaves(Value *V, unsigned RdxOpcode, unsigned WideBW,
412 unsigned MaxDepth,
415
417
418/// Returns a saturating unsigned upper bound of the scalar V. The numeric
419/// bound keeps precision on arithmetic carries, where bit-wise analysis
420/// loses it.
421APInt getScalarMaxValue(const Value *V, unsigned Depth = 0);
422
423/// Checks if the values in \p VL are zero-extended sub-fields of the same
424/// wider integer scalar. Returns the source scalar, the field width and the
425/// field permutation mask. The extraction dual of the lane-packing layout.
426/// The field-to-lane mapping of the bitcast to the field vector is defined
427/// for little-endian targets only.
428std::optional<std::tuple<Value *, unsigned, SmallVector<int>>>
430
431/// Description of a bitfield packing of vector lanes into a scalar value:
432/// every lane contributes a disjoint contiguous byte field of the result.
434 static constexpr unsigned NoLane = std::numeric_limits<unsigned>::max();
435 unsigned FieldWidth = 0;
436 /// Lane covering each field, NoLane if the field is always zero.
438 /// Per-lane right-shift amounts bringing the field content to the low bits.
440
441 /// True if any lane needs a right shift to align its field content.
442 bool needsShift() const {
443 return any_of(LShrAmts, [](uint64_t A) { return A != 0; });
444 }
445};
446
447/// Computes the bitfield packing layout from the per-lane possibly set bits
448/// of the source values, the per-lane left-shift amounts and the per-lane
449/// masks (all-ones for unmasked lanes).
450std::optional<BitPackInfo> computeBitPackInfo(unsigned BitWidth,
451 ArrayRef<APInt> PossibleBits,
452 ArrayRef<uint64_t> ShlAmts,
453 ArrayRef<APInt> Masks);
454
455/// Returns the byte shuffle mask packing the per-lane fields of the shifted
456/// lanes (BytesPerLane bytes each) into the packed scalar of NumBytes bytes.
457SmallVector<int> getBitPackMask(const BitPackInfo &Info, unsigned NumBytes,
458 unsigned NumElts, unsigned BytesPerLane);
459
460/// Builds the bitfield packing of X per the layout and the shift width.
461/// \p NumInsts returns the number of emitted instructions.
462Value *buildBitPack(IRBuilderBase &Builder, Value *X, const BitPackInfo &Info,
463 unsigned ShiftWidth, unsigned &NumInsts);
464
465} // namespace llvm::slpvectorizer
466
467#endif // LLVM_LIB_TRANSFORMS_VECTORIZE_SLPVECTORIZER_SLPUTILS_H
unsigned uint64_t
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:857
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
This file provides utility analysis objects describing memory locations.
This file contains some templates that are useful if you are working with the STL at all.
This file implements the SmallBitVector class.
This file defines the SmallVector class.
This pass exposes codegen information to IR-level passes.
Value * RHS
Value * LHS
Class for arbitrary precision integers.
Definition APInt.h:78
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
A cache of @llvm.assume calls within a function.
This is an important base class in LLVM.
Definition Constant.h:43
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
This is a 'bitvector' (really, a variable-sized bit array), optimized for the case when the array is ...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Provides information about what library functions are available for the current target.
TargetCostKind
The kind of cost model.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM Value Representation.
Definition Value.h:75
An efficient, type-erasing, non-owning reference to a callable.
A private "module" namespace for types and utilities used by this pass.
std::optional< unsigned > getExtractIndex(const Instruction *E)
Definition SLPUtils.cpp:276
Value * createInsertVector(IRBuilderBase &Builder, Value *Vec, Value *V, unsigned Index, function_ref< Value *(Value *, Value *, ArrayRef< int >)> Generator)
Creates subvector insert.
Definition SLPUtils.cpp:676
bool areAllOperandsNonInsts(Value *V)
Checks if the provided value does not require scheduling.
Definition SLPUtils.cpp:456
std::optional< unsigned > getElementIndex(const Value *Inst, unsigned Offset)
Definition SLPUtils.cpp:230
bool doesInTreeUserNeedToExtract(Value *Scalar, Instruction *UserInst, TargetLibraryInfo *TLI, const TargetTransformInfo *TTI)
Definition SLPUtils.cpp:779
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)
Definition SLPUtils.cpp:807
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...
Definition SLPUtils.cpp:825
SmallBitVector getAltInstrMask(ArrayRef< Value * > VL, Type *ScalarTy, unsigned Opcode0, unsigned Opcode1)
Definition SLPUtils.cpp:914
SmallBitVector isUndefVector(const Value *V, const SmallBitVector &UseMask)
Checks if the given value is actually an undefined constant vector.
Definition SLPUtils.cpp:729
Intrinsic::ID getMaskedDivRemIntrinsic(unsigned Opcode)
Definition SLPUtils.cpp:937
bool isUsedOutsideBlock(Value *V)
Checks if the provided value does not require scheduling.
Definition SLPUtils.cpp:469
bool doesNotNeedToSchedule(ArrayRef< Value * > VL)
Checks if the specified array of instructions does not require scheduling.
Definition SLPUtils.cpp:487
std::optional< unsigned > getInsertExtractIndex(const Value *Inst, unsigned Offset)
Definition SLPUtils.cpp:423
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 reorderScalars(SmallVectorImpl< Value * > &Scalars, ArrayRef< int > Mask)
Reorders the list of scalars in accordance with the given Mask.
Definition SLPUtils.cpp:309
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...
bool allSameType(ArrayRef< Value * > VL)
Definition SLPUtils.cpp:416
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...
Definition SLPUtils.cpp:394
bool allSameOpcode(ArrayRef< Value * > VL)
Definition SLPUtils.cpp:258
bool isSplat(ArrayRef< Value * > VL)
Definition SLPUtils.cpp:141
unsigned getNumElements(Type *Ty)
Definition SLPUtils.cpp:86
std::string shortBundleName(ArrayRef< Value * > VL, int Idx)
Print a short descriptor of the instruction bundle suitable for debug output.
Definition SLPUtils.cpp:103
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...
Definition SLPUtils.cpp:979
unsigned getPartNumElems(unsigned Size, unsigned NumParts)
Returns power-of-2 number of elements in a single register (part), given the total number of elements...
Definition SLPUtils.cpp:94
bool isCommutableOperand(const Instruction *I, Value *ValWithUses, unsigned Op, bool IsCopyable)
Checks if the operand is commutative.
Definition SLPUtils.cpp:202
TargetTransformInfo::TargetCostKind getSLPCostKind(const Function *F)
bool isReverseOrder(ArrayRef< unsigned > Order)
Check if Order represents reverse order.
Definition SLPUtils.cpp:373
void transformScalarShuffleIndiciesToVector(unsigned VecTyNumElements, SmallVectorImpl< int > &Mask)
Definition SLPUtils.cpp:492
SmallVector< int > calculateShufflevectorMask(ArrayRef< Value * > VL)
Definition SLPUtils.cpp:547
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.
Definition SLPUtils.cpp:712
bool isCommutative(const Instruction *I, const Value *ValWithUses, bool IsCopyable)
Definition SLPUtils.cpp:165
unsigned getNumberOfPotentiallyCommutativeOps(Instruction *I)
Definition SLPUtils.cpp:220
bool allConstant(ArrayRef< Value * > VL)
Definition SLPUtils.cpp:135
void inversePermutation(ArrayRef< unsigned > Indices, SmallVectorImpl< int > &Mask)
Compute the inverse permutation Mask of Indices.
Definition SLPUtils.cpp:300
bool allSameBlock(ArrayRef< Value * > VL)
Definition SLPUtils.cpp:113
bool isReassocChainLink(const Instruction *I)
Definition SLPUtils.cpp:58
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....
Definition SLPUtils.cpp:156
UseMask
Specifies the way the mask should be analyzed for undefs/poisonous elements in the shuffle mask.
Definition SLPUtils.h:291
@ SecondArg
The mask is expected to be for permutation of 2 vectors, check for the mask elements for the second a...
Definition SLPUtils.h:295
@ UndefsAsMask
Consider undef mask elements (-1) as placeholders for future shuffle elements and mark them as ones a...
Definition SLPUtils.h:298
@ FirstArg
The mask is expected to be for permutation of 1-2 vectors, check for the mask elements for the first ...
Definition SLPUtils.h:292
void reorderOrder(SmallVectorImpl< unsigned > &Order, ArrayRef< int > Mask, bool BottomOrder)
Reorders the given Order according to the given Mask.
Definition SLPUtils.cpp:329
void reorderReuses(SmallVectorImpl< int > &Reuses, ArrayRef< int > Mask)
Reorders the given Reuses mask according to the given Mask.
Definition SLPUtils.cpp:319
void addMask(SmallVectorImpl< int > &Mask, ArrayRef< int > SubMask, bool ExtendingManyInputs)
Shuffles Mask in accordance with the given SubMask.
Definition SLPUtils.cpp:865
bool isSimple(Instruction *I)
Definition SLPUtils.cpp:815
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)
Definition SLPUtils.cpp:42
APInt getScalarMaxValue(const Value *V, unsigned Depth)
Returns a saturating unsigned upper bound of the scalar V.
unsigned getShufflevectorNumGroups(ArrayRef< Value * > VL)
Definition SLPUtils.cpp:507
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 ...
Definition SLPUtils.cpp:587
SmallVector< Constant * > replicateMask(ArrayRef< Constant * > Val, unsigned VF)
Replicates the given Val VF times.
Definition SLPUtils.cpp:928
unsigned getReassocCombineOpcode(unsigned Opcode)
Definition SLPUtils.cpp:47
bool isVectorLikeInstWithConstOps(Value *V)
Checks if V is one of vector-like instructions, i.e.
Definition SLPUtils.cpp:66
bool doesNotNeedToBeScheduled(Value *V)
Checks if the specified value does not require scheduling.
Definition SLPUtils.cpp:483
unsigned getNumElems(unsigned Size, unsigned PartNumElems, unsigned Part)
Returns correct remaining number of elements, considering total amount Size, (power-of-2 number) of e...
Definition SLPUtils.cpp:98
constexpr int UsesLimit
Limit of the number of uses for potentially transformed instructions/values, used in checks to avoid ...
Definition SLPUtils.h:50
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...
Definition SLPUtils.cpp:382
bool isConstant(Value *V)
Definition SLPUtils.cpp:38
Value * createExtractVector(IRBuilderBase &Builder, Value *Vec, unsigned SubVecVF, unsigned Index)
Generates subvector extract.
Definition SLPUtils.cpp:705
void fixupOrderingIndices(MutableArrayRef< unsigned > Order)
Order may have elements assigned special value (size) which is out of bounds.
Definition SLPUtils.cpp:890
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
TargetTransformInfo TTI
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1933
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
Description of a bitfield packing of vector lanes into a scalar value: every lane contributes a disjo...
Definition SLPUtils.h:433
SmallVector< unsigned, 8 > LaneOfField
Lane covering each field, NoLane if the field is always zero.
Definition SLPUtils.h:437
bool needsShift() const
True if any lane needs a right shift to align its field content.
Definition SLPUtils.h:442
static constexpr unsigned NoLane
Definition SLPUtils.h:434
SmallVector< uint64_t, 8 > LShrAmts
Per-lane right-shift amounts bringing the field content to the low bits.
Definition SLPUtils.h:439
NarrowedLeafInfo(Value *V, unsigned Shift, APInt Mask)
Definition SLPUtils.h:397