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
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.
58 const TargetTransformInfo *TTI;
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 VPI 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(VPInstruction *VPI, VFRange &Range);
100
101 /// Check if an induction recipe should be constructed for \p VPI. If so build
102 /// and return it. If not, return null.
103 VPHeaderPHIRecipe *tryToOptimizeInductionPHI(VPInstruction *VPI,
104 VFRange &Range);
105
106 /// Optimize the special case where the operand of \p VPI is a constant
107 /// integer induction variable.
109 tryToOptimizeInductionTruncate(VPInstruction *VPI, VFRange &Range);
110
111 /// Handle call instructions. If \p VPI can be widened for \p Range.Start,
112 /// return a new VPWidenCallRecipe or VPWidenIntrinsicRecipe. Range.End may be
113 /// decreased to ensure same decision from \p Range.Start to \p Range.End.
114 VPSingleDefRecipe *tryToWidenCall(VPInstruction *VPI, VFRange &Range);
115
116 /// Check if \p VPI has an opcode that can be widened and return a
117 /// VPWidenRecipe if it can. The function should only be called if the
118 /// cost-model indicates that widening should be performed.
119 VPWidenRecipe *tryToWiden(VPInstruction *VPI);
120
121 /// Makes Histogram count operations safe for vectorization, by emitting a
122 /// llvm.experimental.vector.histogram.add intrinsic in place of the
123 /// Load + Add|Sub + Store operations that perform the histogram in the
124 /// original scalar loop.
125 VPHistogramRecipe *tryToWidenHistogram(const HistogramInfo *HI,
126 VPInstruction *VPI);
127
128 /// Examines reduction operations to see if the target can use a cheaper
129 /// operation with a wider per-iteration input VF and narrower PHI VF.
130 /// Each element within Chains is a pair with a struct containing reduction
131 /// information and the scaling factor between the number of elements in
132 /// the input and output.
133 /// Recursively calls itself to identify chained scaled reductions.
134 /// Returns true if this invocation added an entry to Chains, otherwise false.
135 /// i.e. returns false in the case that a subcall adds an entry to Chains,
136 /// but the top-level call does not.
137 bool getScaledReductions(
138 Instruction *PHI, Instruction *RdxExitInstr, VFRange &Range,
139 SmallVectorImpl<std::pair<PartialReductionChain, unsigned>> &Chains);
140
141public:
142 VPRecipeBuilder(VPlan &Plan, Loop *OrigLoop, const TargetLibraryInfo *TLI,
143 const TargetTransformInfo *TTI,
148 LoopVersioning *LVer)
149 : Plan(Plan), OrigLoop(OrigLoop), TLI(TLI), TTI(TTI), Legal(Legal),
150 CM(CM), PSE(PSE), Builder(Builder), BlockMaskCache(BlockMaskCache),
151 LVer(LVer) {}
152
153 std::optional<unsigned> getScalingForReduction(const Instruction *ExitInst) {
154 auto It = ScaledReductionMap.find(ExitInst);
155 return It == ScaledReductionMap.end() ? std::nullopt
156 : std::make_optional(It->second);
157 }
158
159 /// Find all possible partial reductions in the loop and track all of those
160 /// that are valid so recipes can be formed later.
162
163 /// Create and return a widened recipe for \p R if one can be created within
164 /// the given VF \p Range.
166
167 /// Create and return a partial reduction recipe for a reduction instruction
168 /// along with binary operation and reduction phi operands.
170 unsigned ScaleFactor);
171
172 /// Set the recipe created for given ingredient.
174 assert(!Ingredient2Recipe.contains(I) &&
175 "Cannot reset recipe for instruction.");
176 Ingredient2Recipe[I] = R;
177 }
178
179 /// Returns the *entry* mask for block \p VPBB or null if the mask is
180 /// all-true.
182 return BlockMaskCache.lookup(VPBB);
183 }
184
185 /// Return the recipe created for given ingredient.
187 assert(Ingredient2Recipe.count(I) &&
188 "Recording this ingredients recipe was not requested");
189 assert(Ingredient2Recipe[I] != nullptr &&
190 "Ingredient doesn't have a recipe");
191 return Ingredient2Recipe[I];
192 }
193
194 /// Build a VPReplicationRecipe for \p VPI. If it is predicated, add the mask
195 /// as last operand. Range.End may be decreased to ensure same recipe behavior
196 /// from \p Range.Start to \p Range.End.
198
200 if (auto *I = dyn_cast<Instruction>(V)) {
201 if (auto *R = Ingredient2Recipe.lookup(I))
202 return R->getVPSingleValue();
203 }
204 return Plan.getOrAddLiveIn(V);
205 }
206
208 for (auto &[_, V] : BlockMaskCache) {
209 if (auto *New = Old2New.lookup(V)) {
210 V->replaceAllUsesWith(New);
211 V = New;
212 }
213 }
214 }
215};
216} // end namespace llvm
217
218#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
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
This file contains the declarations of the Vectorization Plan base classes:
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:205
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...
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.
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
Definition VPlan.h:3819
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:1982
A recipe representing a sequence of load -> update -> store as part of a histogram operation.
Definition VPlan.h:1689
This is a concrete Recipe that models a single VPlan-level instruction.
Definition VPlan.h:976
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Definition VPlan.h:386
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)
VPRecipeBase * tryToCreatePartialReduction(VPInstruction *Reduction, unsigned ScaleFactor)
Create and return a partial reduction recipe for a reduction instruction along with binary operation ...
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.
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)
VPReplicateRecipe * handleReplication(VPInstruction *VPI, VFRange &Range)
Build a VPReplicationRecipe for VPI.
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:2873
VPSingleDef is a base class for recipes for modeling a sequence of one or more output IR that define ...
Definition VPlan.h:517
This is the base class of the VPlan Def/Use graph, used for modeling the data flow into,...
Definition VPlanValue.h:48
A recipe for handling phi nodes of integer and floating-point inductions, producing their vector valu...
Definition VPlan.h:2122
A common base class for widening memory operations.
Definition VPlan.h:3179
VPWidenRecipe is a recipe for producing a widened instruction using the opcode and operands of the re...
Definition VPlan.h:1446
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition VPlan.h:4137
LLVM Value Representation.
Definition Value.h:75
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.
Definition Casting.h:643
This holds details about a histogram operation – a load -> update -> store sequence where each lane i...
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.