LLVM 22.0.0git
VPRecipeBuilder.h
Go to the documentation of this file.
1//===- VPRecipeBuilder.h - Helper class to build recipes --------*- 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#ifndef LLVM_TRANSFORMS_VECTORIZE_VPRECIPEBUILDER_H
10#define LLVM_TRANSFORMS_VECTORIZE_VPRECIPEBUILDER_H
11
13#include "VPlan.h"
14#include "llvm/ADT/DenseMap.h"
16
17namespace llvm {
18
19class LoopVectorizationLegality;
20class LoopVectorizationCostModel;
21class TargetLibraryInfo;
22class TargetTransformInfo;
23struct HistogramInfo;
24struct VFRange;
25
26/// A chain of instructions that form a partial reduction.
27/// Designed to match either:
28/// reduction_bin_op (extend (A), accumulator), or
29/// reduction_bin_op (bin_op (extend (A), (extend (B))), accumulator).
35 /// The top-level binary operation that forms the reduction to a scalar
36 /// after the loop body.
38 /// The extension of each of the inner binary operation's operands.
41
42 /// The user of the extends that is then reduced.
44};
45
46/// Helper class to create VPRecipies from IR instructions.
48 /// The VPlan new recipes are added to.
49 VPlan &Plan;
50
51 /// The loop that we evaluate.
52 Loop *OrigLoop;
53
54 /// Target Library Info.
55 const TargetLibraryInfo *TLI;
56
57 // Target Transform Info.
59
60 /// The legality analysis.
62
63 /// The profitablity analysis.
65
67
68 VPBuilder &Builder;
69
70 /// The mask of each VPBB, generated earlier and used for predicating recipes
71 /// in VPBB.
72 /// TODO: remove by applying predication when generating the masks.
74
75 // VPlan construction support: Hold a mapping from ingredients to
76 // their recipe.
78
79 /// Cross-iteration reduction & first-order recurrence phis for which we need
80 /// to add the incoming value from the backedge after all recipes have been
81 /// created.
83
84 /// A mapping of partial reduction exit instructions to their scaling factor.
86
87 /// Loop versioning instance for getting noalias metadata guaranteed by
88 /// runtime checks.
89 LoopVersioning *LVer;
90
91 /// Check if \p I can be widened at the start of \p Range and possibly
92 /// decrease the range such that the returned value holds for the entire \p
93 /// Range. The function should not be called for memory instructions or calls.
94 bool shouldWiden(Instruction *I, VFRange &Range) const;
95
96 /// Check if the load or store instruction \p I should widened for \p
97 /// Range.Start and potentially masked. Such instructions are handled by a
98 /// recipe that takes an additional VPInstruction for the mask.
99 VPWidenMemoryRecipe *tryToWidenMemory(Instruction *I,
101 VFRange &Range);
102
103 /// Check if an induction recipe should be constructed for \p Phi. If so build
104 /// and return it. If not, return null.
105 VPHeaderPHIRecipe *tryToOptimizeInductionPHI(PHINode *Phi,
107 VFRange &Range);
108
109 /// Optimize the special case where the operand of \p I is a constant integer
110 /// induction variable.
112 tryToOptimizeInductionTruncate(TruncInst *I, ArrayRef<VPValue *> Operands,
113 VFRange &Range);
114
115 /// Handle call instructions. If \p CI can be widened for \p Range.Start,
116 /// return a new VPWidenCallRecipe or VPWidenIntrinsicRecipe. Range.End may be
117 /// decreased to ensure same decision from \p Range.Start to \p Range.End.
119 VFRange &Range);
120
121 /// Check if \p I has an opcode that can be widened and return a VPWidenRecipe
122 /// if it can. The function should only be called if the cost-model indicates
123 /// that widening should be performed.
125
126 /// Makes Histogram count operations safe for vectorization, by emitting a
127 /// llvm.experimental.vector.histogram.add intrinsic in place of the
128 /// Load + Add|Sub + Store operations that perform the histogram in the
129 /// original scalar loop.
130 VPHistogramRecipe *tryToWidenHistogram(const HistogramInfo *HI,
132
133 /// Examines reduction operations to see if the target can use a cheaper
134 /// operation with a wider per-iteration input VF and narrower PHI VF.
135 /// Each element within Chains is a pair with a struct containing reduction
136 /// information and the scaling factor between the number of elements in
137 /// the input and output.
138 /// Recursively calls itself to identify chained scaled reductions.
139 /// Returns true if this invocation added an entry to Chains, otherwise false.
140 /// i.e. returns false in the case that a subcall adds an entry to Chains,
141 /// but the top-level call does not.
142 bool getScaledReductions(
143 Instruction *PHI, Instruction *RdxExitInstr, VFRange &Range,
144 SmallVectorImpl<std::pair<PartialReductionChain, unsigned>> &Chains);
145
146public:
147 VPRecipeBuilder(VPlan &Plan, Loop *OrigLoop, const TargetLibraryInfo *TLI,
153 LoopVersioning *LVer)
154 : Plan(Plan), OrigLoop(OrigLoop), TLI(TLI), TTI(TTI), Legal(Legal),
155 CM(CM), PSE(PSE), Builder(Builder), BlockMaskCache(BlockMaskCache),
156 LVer(LVer) {}
157
158 std::optional<unsigned> getScalingForReduction(const Instruction *ExitInst) {
159 auto It = ScaledReductionMap.find(ExitInst);
160 return It == ScaledReductionMap.end() ? std::nullopt
161 : std::make_optional(It->second);
162 }
163
164 /// Find all possible partial reductions in the loop and track all of those
165 /// that are valid so recipes can be formed later.
167
168 /// Create and return a widened recipe for \p R if one can be created within
169 /// the given VF \p Range.
171
172 /// Create and return a partial reduction recipe for a reduction instruction
173 /// along with binary operation and reduction phi operands.
176 unsigned ScaleFactor);
177
178 /// Set the recipe created for given ingredient.
180 assert(!Ingredient2Recipe.contains(I) &&
181 "Cannot reset recipe for instruction.");
182 Ingredient2Recipe[I] = R;
183 }
184
185 /// Returns the *entry* mask for block \p VPBB or null if the mask is
186 /// all-true.
188 return BlockMaskCache.lookup(VPBB);
189 }
190
191 /// Return the recipe created for given ingredient.
193 assert(Ingredient2Recipe.count(I) &&
194 "Recording this ingredients recipe was not requested");
195 assert(Ingredient2Recipe[I] != nullptr &&
196 "Ingredient doesn't have a recipe");
197 return Ingredient2Recipe[I];
198 }
199
200 /// Build a VPReplicationRecipe for \p I using \p Operands. If it is
201 /// predicated, add the mask as last operand. Range.End may be decreased to
202 /// ensure same recipe behavior from \p Range.Start to \p Range.End.
205 VFRange &Range);
206
208 if (auto *I = dyn_cast<Instruction>(V)) {
209 if (auto *R = Ingredient2Recipe.lookup(I))
210 return R->getVPSingleValue();
211 }
212 return Plan.getOrAddLiveIn(V);
213 }
214
216 for (auto &[_, V] : BlockMaskCache) {
217 if (auto *New = Old2New.lookup(V)) {
218 V->replaceAllUsesWith(New);
219 V = New;
220 }
221 }
222 }
223};
224} // end namespace llvm
225
226#endif // LLVM_TRANSFORMS_VECTORIZE_VPRECIPEBUILDER_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Rewrite undef for PHI
This file defines the DenseMap class.
#define _
This file provides a LoopVectorizationPlanner class.
#define I(x, y, z)
Definition: MD5.cpp:58
mir Rename Register Operands
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
This file contains the declarations of the Vectorization Plan base classes:
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
This class represents a function call, abstracting a target machine's calling convention.
ValueT lookup(const_arg_type_t< KeyT > Val) const
lookup - Return the entry for the specified key, or a default constructed value if no such entry exis...
Definition: DenseMap.h:203
iterator find(const_arg_type_t< KeyT > Val)
Definition: DenseMap.h:177
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition: DenseMap.h:173
iterator end()
Definition: DenseMap.h:87
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition: DenseMap.h:168
LoopVectorizationCostModel - estimates the expected speedups due to vectorization.
LoopVectorizationLegality checks if it is legal to vectorize a loop, and to what vectorization factor...
This class emits a version of the loop where run-time checks ensure that may-alias pointers can't ove...
Represents a single loop in the control flow graph.
Definition: LoopInfo.h:40
An interface layer with SCEV used to manage how we see SCEV expressions for values in the context of ...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
Provides information about what library functions are available for the current target.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
This class represents a truncation of integer types.
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
Definition: VPlan.h:3639
VPlan-based builder utility analogous to IRBuilder.
A pure virtual base class for all recipes modeling header phis, including phis for first order recurr...
Definition: VPlan.h:1951
A recipe representing a sequence of load -> update -> store as part of a histogram operation.
Definition: VPlan.h:1666
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Definition: VPlan.h:391
Helper class to create VPRecipies from IR instructions.
VPRecipeBase * tryToCreateWidenRecipe(VPSingleDefRecipe *R, VFRange &Range)
Create and return a widened recipe for R if one can be created within the given VF Range.
VPValue * getBlockInMask(VPBasicBlock *VPBB) const
Returns the entry mask for block VPBB or null if the mask is all-true.
VPValue * getVPValueOrAddLiveIn(Value *V)
std::optional< unsigned > getScalingForReduction(const Instruction *ExitInst)
void collectScaledReductions(VFRange &Range)
Find all possible partial reductions in the loop and track all of those that are valid so recipes can...
void setRecipe(Instruction *I, VPRecipeBase *R)
Set the recipe created for given ingredient.
VPReplicateRecipe * handleReplication(Instruction *I, ArrayRef< VPValue * > Operands, VFRange &Range)
Build a VPReplicationRecipe for I using Operands.
VPRecipeBase * tryToCreatePartialReduction(Instruction *Reduction, ArrayRef< VPValue * > Operands, unsigned ScaleFactor)
Create and return a partial reduction recipe for a reduction instruction along with binary operation ...
VPRecipeBuilder(VPlan &Plan, Loop *OrigLoop, const TargetLibraryInfo *TLI, const TargetTransformInfo *TTI, LoopVectorizationLegality *Legal, LoopVectorizationCostModel &CM, PredicatedScalarEvolution &PSE, VPBuilder &Builder, DenseMap< VPBasicBlock *, VPValue * > &BlockMaskCache, LoopVersioning *LVer)
VPRecipeBase * getRecipe(Instruction *I)
Return the recipe created for given ingredient.
void updateBlockMaskCache(DenseMap< VPValue *, VPValue * > &Old2New)
VPReplicateRecipe replicates a given instruction producing multiple scalar copies of the original sca...
Definition: VPlan.h:2731
VPSingleDef is a base class for recipes for modeling a sequence of one or more output IR that define ...
Definition: VPlan.h:518
A recipe for handling phi nodes of integer and floating-point inductions, producing their vector valu...
Definition: VPlan.h:2088
A common base class for widening memory operations.
Definition: VPlan.h:3008
VPWidenRecipe is a recipe for producing a widened instruction using the opcode and operands of the re...
Definition: VPlan.h:1424
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition: VPlan.h:3930
VPValue * getOrAddLiveIn(Value *V)
Gets the live-in VPValue for V or adds a new live-in (if none exists yet) for V.
Definition: VPlan.h:4181
LLVM Value Representation.
Definition: Value.h:75
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
This holds details about a histogram operation – a load -> update -> store sequence where each lane i...
A chain of instructions that form a partial reduction.
PartialReductionChain(Instruction *Reduction, Instruction *ExtendA, Instruction *ExtendB, Instruction *ExtendUser)
Instruction * ExtendUser
The user of the extends that is then reduced.
Instruction * Reduction
The top-level binary operation that forms the reduction to a scalar after the loop body.
Instruction * ExtendA
The extension of each of the inner binary operation's operands.
A range of powers-of-2 vectorization factors with fixed start and adjustable end.
Definition: VPlanHelpers.h:71