|
LLVM 24.0.0git
|
#include "llvm/ADT/MapVector.h"#include "llvm/ADT/STLExtras.h"#include "llvm/ADT/Sequence.h"#include "llvm/ADT/SmallVector.h"#include "llvm/Analysis/LoopAccessAnalysis.h"#include "llvm/IR/Module.h"#include "llvm/IR/VFABIDemangler.h"#include "llvm/IR/VectorTypeUtils.h"#include "llvm/Support/CheckedArithmetic.h"#include "llvm/Support/Compiler.h"Go to the source code of this file.
Classes | |
| class | llvm::VFDatabase |
| The Vector Function Database. More... | |
| class | llvm::InterleaveGroup< InstTy > |
| The group of interleaved loads/stores sharing the same stride and close to each other. More... | |
| class | llvm::InterleavedAccessInfo |
| Drive the analysis of interleaved memory accesses in the loop. More... | |
Namespaces | |
| namespace | llvm |
| This is an optimization pass for GlobalISel generic memory operations. | |
| namespace | llvm::Intrinsic |
| This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM. | |
Enumerations | |
| enum class | llvm::HistogramUpdateKind { llvm::Add , llvm::Sub , llvm::UAddSat , llvm::UMax , llvm::UMin } |
| The kind of update operation performed on the buckets of a histogram, i.e. More... | |
Functions | |
| LLVM_ABI bool | llvm::isTriviallyVectorizable (Intrinsic::ID ID) |
| Identify if the intrinsic is trivially vectorizable. | |
| LLVM_ABI bool | llvm::isTriviallyScalarizable (Intrinsic::ID ID) |
| Identify if the intrinsic is trivially scalarizable. | |
| LLVM_ABI bool | llvm::isVectorIntrinsicWithScalarOpAtArg (Intrinsic::ID ID, unsigned ScalarOpdIdx, const TargetTransformInfo *TTI) |
| Identifies if the vector form of the intrinsic has a scalar operand. | |
| LLVM_ABI bool | llvm::isVectorIntrinsicWithOverloadTypeAtArg (Intrinsic::ID ID, int OpdIdx, const TargetTransformInfo *TTI) |
Identifies if the vector form of the intrinsic is overloaded on the type of the operand at index OpdIdx, or on the return type if OpdIdx is -1. | |
| LLVM_ABI std::optional< unsigned > | llvm::getVectorMemoryIntrinsicPointerArgIdx (Intrinsic::ID ID) |
Returns the argument index of the pointer parameter for the vector memory intrinsic ID, or std::nullopt if the intrinsic does not have a pointer operand. | |
| LLVM_ABI std::optional< unsigned > | llvm::getVectorStoreIntrinsicDataArgIdx (Intrinsic::ID ID) |
Returns the argument index of the data value of the vector store intrinsic ID, or std::nullopt if the intrinsic does not have a data operand. | |
| LLVM_ABI std::optional< unsigned > | llvm::getVectorIntrinsicMaskArgIdx (Intrinsic::ID ID) |
Returns the argument index of the mask for the vector intrinsic ID, or std::nullopt if the intrinsic does not have a mask operand. | |
| LLVM_ABI bool | llvm::isVectorIntrinsicWithStructReturnOverloadAtField (Intrinsic::ID ID, int RetIdx, const TargetTransformInfo *TTI) |
Identifies if the vector form of the intrinsic that returns a struct is overloaded at the struct element index RetIdx. | |
| LLVM_ABI Intrinsic::ID | llvm::getVectorIntrinsicIDForCall (const CallInst *CI, const TargetLibraryInfo *TLI) |
| Returns intrinsic ID for call. | |
| LLVM_ABI bool | llvm::shouldSplitVectorSinCos (const TargetLibraryInfo &TLI, Type *ScalarTy, ElementCount EC, Module *M) |
Returns true if the vector llvm.sincos with ScalarTy elements and EC element count has no vector library mapping, but both llvm.sin and llvm.cos have, so it is split into the separate vector sin and cos library calls. | |
| LLVM_ABI unsigned | llvm::getInterleaveIntrinsicFactor (Intrinsic::ID ID) |
| Returns the corresponding factor of llvm.vector.interleaveN intrinsics. | |
| LLVM_ABI unsigned | llvm::getDeinterleaveIntrinsicFactor (Intrinsic::ID ID) |
| Returns the corresponding factor of llvm.vector.deinterleaveN intrinsics. | |
| LLVM_ABI VectorType * | llvm::getDeinterleavedVectorType (IntrinsicInst *DI) |
| Given a deinterleaveN intrinsic, return the (narrow) vector type of each factor. | |
| LLVM_ABI Value * | llvm::findScalarElement (Value *V, unsigned EltNo) |
| Given a vector and an element number, see if the scalar value is already around as a register, for example if it were inserted then extracted from the vector. | |
| LLVM_ABI int | llvm::getSplatIndex (ArrayRef< int > Mask) |
If all non-negative Mask elements are the same value, return that value. | |
| LLVM_ABI Value * | llvm::getSplatValue (const Value *V) |
| Get splat value if the input is a splat vector or return nullptr. | |
| LLVM_ABI bool | llvm::isSplatValue (const Value *V, int Index=-1, unsigned Depth=0) |
Return true if each element of the vector value V is poisoned or equal to every other non-poisoned element. | |
| LLVM_ABI bool | llvm::getShuffleDemandedElts (int SrcWidth, ArrayRef< int > Mask, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS, bool AllowUndefElts=false) |
| Transform a shuffle mask's output demanded element mask into demanded element masks for the 2 operands, returns false if the mask isn't valid. | |
| LLVM_ABI bool | llvm::isMaskedSlidePair (ArrayRef< int > Mask, int NumElts, std::array< std::pair< int, int >, 2 > &SrcInfo) |
| Does this shuffle mask represent either one slide shuffle or a pair of two slide shuffles, combined with a select on some constant vector mask? | |
| LLVM_ABI void | llvm::narrowShuffleMaskElts (int Scale, ArrayRef< int > Mask, SmallVectorImpl< int > &ScaledMask) |
| Replace each shuffle mask index with the scaled sequential indices for an equivalent mask of narrowed elements. | |
| LLVM_ABI bool | llvm::widenShuffleMaskElts (int Scale, ArrayRef< int > Mask, SmallVectorImpl< int > &ScaledMask) |
| Try to transform a shuffle mask by replacing elements with the scaled index for an equivalent mask of widened elements. | |
| LLVM_ABI bool | llvm::widenShuffleMaskElts (ArrayRef< int > M, SmallVectorImpl< int > &NewMask) |
| A variant of the previous method which is specialized for Scale=2, and treats -1 as undef and allows widening when a wider element is partially undef in the narrow form of the mask. | |
| LLVM_ABI bool | llvm::scaleShuffleMaskElts (unsigned NumDstElts, ArrayRef< int > Mask, SmallVectorImpl< int > &ScaledMask) |
Attempt to narrow/widen the Mask shuffle mask to the NumDstElts target width. | |
| LLVM_ABI void | llvm::getShuffleMaskWithWidestElts (ArrayRef< int > Mask, SmallVectorImpl< int > &ScaledMask) |
| Repetitively apply widenShuffleMaskElts() for as long as it succeeds, to get the shuffle mask with widest possible elements. | |
| LLVM_ABI void | llvm::processShuffleMasks (ArrayRef< int > Mask, unsigned NumOfSrcRegs, unsigned NumOfDestRegs, unsigned NumOfUsedRegs, function_ref< void()> NoInputAction, function_ref< void(ArrayRef< int >, unsigned, unsigned)> SingleInputAction, function_ref< void(ArrayRef< int >, unsigned, unsigned, bool)> ManyInputsAction) |
| Splits and processes shuffle mask depending on the number of input and output registers. | |
| LLVM_ABI void | llvm::getHorizDemandedEltsForFirstOperand (unsigned VectorBitWidth, const APInt &DemandedElts, APInt &DemandedLHS, APInt &DemandedRHS) |
| Compute the demanded elements mask of horizontal binary operations. | |
| LLVM_ABI MapVector< Instruction *, uint64_t > | llvm::computeMinimumValueSizes (ArrayRef< BasicBlock * > Blocks, DemandedBits &DB, const TargetTransformInfo *TTI=nullptr) |
| Compute a map of integer instructions to their minimum legal type size. | |
| LLVM_ABI MDNode * | llvm::uniteAccessGroups (MDNode *AccGroups1, MDNode *AccGroups2) |
| Compute the union of two access-group lists. | |
| LLVM_ABI MDNode * | llvm::intersectAccessGroups (const Instruction *Inst1, const Instruction *Inst2) |
Compute the access-group list of access groups that Inst1 and Inst2 are both in. | |
| LLVM_ABI void | llvm::getMetadataToPropagate (Instruction *Inst, SmallVectorImpl< std::pair< unsigned, MDNode * > > &Metadata) |
Add metadata from Inst to Metadata, if it can be preserved after vectorization. | |
| LLVM_ABI Instruction * | llvm::propagateMetadata (Instruction *I, ArrayRef< Value * > VL) |
| Specifically, let Kinds = [MD_tbaa, MD_alias_scope, MD_noalias, MD_fpmath, MD_nontemporal, MD_access_group, MD_mmra]. | |
| LLVM_ABI Constant * | llvm::createBitMaskForGaps (IRBuilderBase &Builder, unsigned VF, const InterleaveGroup< Instruction > &Group) |
| Create a mask that filters the members of an interleave group where there are gaps. | |
| LLVM_ABI llvm::SmallVector< int, 16 > | llvm::createReplicatedMask (unsigned ReplicationFactor, unsigned VF) |
| Create a mask with replicated elements. | |
| LLVM_ABI llvm::SmallVector< int, 16 > | llvm::createInterleaveMask (unsigned VF, unsigned NumVecs) |
| Create an interleave shuffle mask. | |
| LLVM_ABI llvm::SmallVector< int, 16 > | llvm::createStrideMask (unsigned Start, unsigned Stride, unsigned VF) |
| Create a stride shuffle mask. | |
| LLVM_ABI llvm::SmallVector< int, 16 > | llvm::createSequentialMask (unsigned Start, unsigned NumInts, unsigned NumUndefs) |
| Create a sequential shuffle mask. | |
| LLVM_ABI llvm::SmallVector< int, 16 > | llvm::createUnaryMask (ArrayRef< int > Mask, unsigned NumElts) |
| Given a shuffle mask for a binary shuffle, create the equivalent shuffle mask assuming both operands are identical. | |
| LLVM_ABI Value * | llvm::concatenateVectors (IRBuilderBase &Builder, ArrayRef< Value * > Vecs) |
| Concatenate a list of vectors. | |
| LLVM_ABI bool | llvm::maskContainsAllOneOrUndef (Value *Mask) |
| Given a mask vector of i1, Return true if any of the elements of this predicate mask are known to be true or undef. | |
| LLVM_ABI APInt | llvm::possiblyDemandedEltsInMask (Value *Mask) |
| Given a mask vector of the form <Y x i1>, return an APInt (of bitwidth Y) for each lane which may be active. | |