37 switch (
II->getIntrinsicID()) {
40 case Intrinsic::vector_reduce_fadd:
41 case Intrinsic::vector_reduce_fmul:
42 case Intrinsic::vector_reduce_add:
43 case Intrinsic::vector_reduce_mul:
44 case Intrinsic::vector_reduce_and:
45 case Intrinsic::vector_reduce_or:
46 case Intrinsic::vector_reduce_xor:
47 case Intrinsic::vector_reduce_smax:
48 case Intrinsic::vector_reduce_smin:
49 case Intrinsic::vector_reduce_umax:
50 case Intrinsic::vector_reduce_umin:
51 case Intrinsic::vector_reduce_fmax:
52 case Intrinsic::vector_reduce_fmin:
53 case Intrinsic::vector_reduce_fmaximum:
54 case Intrinsic::vector_reduce_fminimum: {
56 if (
TTI->shouldExpandReduction(
II))
64 for (
auto *
II : Worklist) {
69 TTI->getPreferredExpandedReductionShuffle(
II);
74 Builder.setFastMathFlags(FMF);
78 case Intrinsic::vector_reduce_fadd:
79 case Intrinsic::vector_reduce_fmul: {
82 Value *Acc =
II->getArgOperand(0);
83 Value *Vec =
II->getArgOperand(1);
101 case Intrinsic::vector_reduce_and:
102 case Intrinsic::vector_reduce_or: {
110 Value *Vec =
II->getArgOperand(0);
112 unsigned NumElts = FTy->getNumElements();
116 if (FTy->getElementType() == Builder.getInt1Ty()) {
117 Rdx = Builder.CreateBitCast(Vec, Builder.getIntNTy(NumElts));
118 if (
ID == Intrinsic::vector_reduce_and) {
119 Rdx = Builder.CreateICmpEQ(
122 assert(
ID == Intrinsic::vector_reduce_or &&
"Expected or reduction.");
123 Rdx = Builder.CreateIsNotNull(Rdx);
131 case Intrinsic::vector_reduce_add:
132 case Intrinsic::vector_reduce_mul:
133 case Intrinsic::vector_reduce_xor:
134 case Intrinsic::vector_reduce_smax:
135 case Intrinsic::vector_reduce_smin:
136 case Intrinsic::vector_reduce_umax:
137 case Intrinsic::vector_reduce_umin: {
138 Value *Vec =
II->getArgOperand(0);
152 case Intrinsic::vector_reduce_fmax:
153 case Intrinsic::vector_reduce_fmin: {
156 Value *Vec =
II->getArgOperand(0);
165 case Intrinsic::vector_reduce_fmaximum:
166 case Intrinsic::vector_reduce_fminimum: {
167 Value *Vec =
II->getArgOperand(0);
176 II->replaceAllUsesWith(Rdx);
177 II->eraseFromParent();
186 ExpandReductions() : FunctionPass(ID) {}
189 const auto *
TTI =&getAnalysis<TargetTransformInfoWrapperPass>().getTTI(
F);
190 auto *DTWP = getAnalysisIfAvailable<DominatorTreeWrapperPass>();
191 auto *LIWP = getAnalysisIfAvailable<LoopInfoWrapperPass>();
192 auto *DT = DTWP ? &DTWP->getDomTree() :
nullptr;
193 auto *LI = LIWP ? &LIWP->getLoopInfo() :
nullptr;
194 return expandReductions(
F,
TTI, DT, LI);
197 void getAnalysisUsage(AnalysisUsage &AU)
const override {
205char ExpandReductions::ID;
207 "Expand reduction intrinsics",
false,
false)
213 return new ExpandReductions();
221 if (!expandReductions(
F, &
TTI, DT, LI))
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Expand Atomic instructions
static bool runOnFunction(Function &F, bool PostInlining)
uint64_t IntrinsicInst * II
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
PassT::Result * getCachedResult(IRUnitT &IR) const
Get the cached result of an analysis pass for a given IR unit.
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
AnalysisUsage & addRequired()
AnalysisUsage & addPreserved()
Add the specified Pass class to the set of analyses preserved by this pass.
static LLVM_ABI Constant * getAllOnesValue(Type *Ty)
Analysis pass which computes a DominatorTree.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
Convenience struct for specifying and reasoning about fast-math flags.
bool allowReassoc() const
Flag queries.
FunctionPass class - This class is used to implement most global optimizations.
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Analysis pass that exposes the LoopInfo for a function.
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalyses & preserve()
Mark an analysis as preserved.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Analysis pass providing the TargetTransformInfo.
The instances of the Type class are immutable: once they are created, they are never changed.
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI Value * getReductionIdentity(Intrinsic::ID RdxID, Type *Ty, FastMathFlags FMF)
Given information about an @llvm.vector.reduce.
LLVM_ABI unsigned getArithmeticReductionInstruction(Intrinsic::ID RdxID)
Returns the arithmetic instruction opcode used when expanding a reduction.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
LLVM_ABI Value * getShuffleReduction(IRBuilderBase &Builder, Value *Src, unsigned Op, TargetTransformInfo::ReductionShuffle RS, RecurKind MinMaxKind=RecurKind::None)
Generates a vector reduction using shufflevectors to reduce the value.
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...
RecurKind
These are the kinds of recurrences that we support.
LLVM_ABI FunctionPass * createExpandReductionsPass()
This pass expands the reduction intrinsics into sequences of shuffles.
LLVM_ABI Value * expandReductionViaLoop(IRBuilderBase &Builder, Value *Vec, unsigned RdxOpcode, Value *Acc, DominatorTree *DT=nullptr, LoopInfo *LI=nullptr)
Expand a scalable vector reduction into a runtime loop that applies RdxOpcode element by element,...
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI RecurKind getMinMaxReductionRecurKind(Intrinsic::ID RdxID)
Returns the recurence kind used when expanding a min/max reduction.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
LLVM_ABI Value * getOrderedReduction(IRBuilderBase &Builder, Value *Acc, Value *Src, unsigned Op, RecurKind MinMaxKind=RecurKind::None)
Generates an ordered vector reduction using extracts to reduce the value.