LLVM 23.0.0git
VPlanHelpers.h
Go to the documentation of this file.
1//===- VPlanHelpers.h - VPlan-related auxiliary helpers -------------------===//
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/// \file
10/// This file contains the declarations of different VPlan-related auxiliary
11/// helpers.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_TRANSFORMS_VECTORIZE_VPLANHELPERS_H
16#define LLVM_TRANSFORMS_VECTORIZE_VPLANHELPERS_H
17
18#include "VPlanAnalysis.h"
19#include "VPlanDominatorTree.h"
20#include "llvm/ADT/DenseMap.h"
25#include "llvm/IR/DebugLoc.h"
28
29namespace llvm {
30
31class AssumptionCache;
32class BasicBlock;
33class DominatorTree;
35class IRBuilderBase;
36class LoopInfo;
37class SCEV;
38class Type;
39class VPBasicBlock;
40class VPRegionBlock;
41class VPlan;
42class Value;
43
44/// Returns a calculation for the total number of elements for a given \p VF.
45/// For fixed width vectors this value is a constant, whereas for scalable
46/// vectors it is an expression determined at runtime.
48
49/// Return a value for Step multiplied by VF.
51 int64_t Step);
52
53/// Compute the transformed value of Index at offset StartValue using step
54/// StepValue.
55/// For integer induction, returns StartValue + Index * StepValue.
56/// For pointer induction, returns StartValue[Index * StepValue].
58 Value *Step,
60 const BinaryOperator *InductionBinOp);
61
62/// A range of powers-of-2 vectorization factors with fixed start and
63/// adjustable end. The range includes start and excludes end, e.g.,:
64/// [1, 16) = {1, 2, 4, 8}
65struct VFRange {
66 // A power of 2.
68
69 // A power of 2. If End <= Start range is empty.
71
72 bool isEmpty() const {
73 return End.getKnownMinValue() <= Start.getKnownMinValue();
74 }
75
77 : Start(Start), End(End) {
78 assert(Start.isScalable() == End.isScalable() &&
79 "Both Start and End should have the same scalable flag");
80 assert(isPowerOf2_32(Start.getKnownMinValue()) &&
81 "Expected Start to be a power of 2");
82 assert(isPowerOf2_32(End.getKnownMinValue()) &&
83 "Expected End to be a power of 2");
84 }
85
86 /// Iterator to iterate over vectorization factors in a VFRange.
88 : public iterator_facade_base<iterator, std::forward_iterator_tag,
89 ElementCount> {
90 ElementCount VF;
91
92 public:
93 iterator(ElementCount VF) : VF(VF) {}
94
95 bool operator==(const iterator &Other) const { return VF == Other.VF; }
96
97 ElementCount operator*() const { return VF; }
98
100 VF *= 2;
101 return *this;
102 }
103 };
104
107 assert(isPowerOf2_32(End.getKnownMinValue()));
108 return iterator(End);
109 }
110};
111
112/// In what follows, the term "input IR" refers to code that is fed into the
113/// vectorizer whereas the term "output IR" refers to code that is generated by
114/// the vectorizer.
115
116/// VPLane provides a way to access lanes in both fixed width and scalable
117/// vectors, where for the latter the lane index sometimes needs calculating
118/// as a runtime expression.
119class VPLane {
120public:
121 /// Kind describes how to interpret Lane.
122 enum class Kind : uint8_t {
123 /// For First, Lane is the index into the first N elements of a
124 /// fixed-vector <N x <ElTy>> or a scalable vector <vscale x N x <ElTy>>.
126 /// For ScalableLast, Lane is the offset from the start of the last
127 /// N-element subvector in a scalable vector <vscale x N x <ElTy>>. For
128 /// example, a Lane of 0 corresponds to lane `(vscale - 1) * N`, a Lane of
129 /// 1 corresponds to `((vscale - 1) * N) + 1`, etc.
131 };
132
133private:
134 /// in [0..VF)
135 unsigned Lane;
136
137 /// Indicates how the Lane should be interpreted, as described above.
138 Kind LaneKind = Kind::First;
139
140public:
141 VPLane(unsigned Lane) : Lane(Lane) {}
142 VPLane(unsigned Lane, Kind LaneKind) : Lane(Lane), LaneKind(LaneKind) {}
143
145
146 static VPLane getLaneFromEnd(const ElementCount &VF, unsigned Offset) {
147 assert(Offset > 0 && Offset <= VF.getKnownMinValue() &&
148 "trying to extract with invalid offset");
149 unsigned LaneOffset = VF.getKnownMinValue() - Offset;
150 Kind LaneKind;
151 if (VF.isScalable())
152 // In this case 'LaneOffset' refers to the offset from the start of the
153 // last subvector with VF.getKnownMinValue() elements.
155 else
156 LaneKind = VPLane::Kind::First;
157 return VPLane(LaneOffset, LaneKind);
158 }
159
161 return getLaneFromEnd(VF, 1);
162 }
163
164 /// Returns a compile-time known value for the lane index and asserts if the
165 /// lane can only be calculated at runtime.
166 unsigned getKnownLane() const {
167 assert(LaneKind == Kind::First &&
168 "can only get known lane from the beginning");
169 return Lane;
170 }
171
172 /// Returns an expression describing the lane index that can be used at
173 /// runtime.
174 Value *getAsRuntimeExpr(IRBuilderBase &Builder, const ElementCount &VF) const;
175
176 /// Returns the Kind of lane offset.
177 Kind getKind() const { return LaneKind; }
178
179 /// Returns true if this is the first lane of the whole vector.
180 bool isFirstLane() const { return Lane == 0 && LaneKind == Kind::First; }
181
182 /// Maps the lane to a cache index based on \p VF.
183 unsigned mapToCacheIndex(const ElementCount &VF) const {
184 switch (LaneKind) {
186 assert(VF.isScalable() && Lane < VF.getKnownMinValue() &&
187 "ScalableLast can only be used with scalable VFs");
188 return VF.getKnownMinValue() + Lane;
189 default:
190 assert(Lane < VF.getKnownMinValue() &&
191 "Cannot extract lane larger than VF");
192 return Lane;
193 }
194 }
195};
196
197/// VPTransformState holds information passed down when "executing" a VPlan,
198/// needed for generating the output IR.
203 Type *CanonicalIVTy);
204 /// Target Transform Info.
206
207 /// The chosen Vectorization Factor of the loop being vectorized.
209
210 /// Hold the index to generate specific scalar instructions. Null indicates
211 /// that all instances are to be generated, using either scalar or vector
212 /// instructions.
213 std::optional<VPLane> Lane;
214
215 struct DataState {
216 // Each value from the original loop, when vectorized, is represented by a
217 // vector value in the map.
219
222
223 /// Get the generated vector Value for a given VPValue \p Def if \p IsScalar
224 /// is false, otherwise return the generated scalar. \See set.
225 Value *get(const VPValue *Def, bool IsScalar = false);
226
227 /// Get the generated Value for a given VPValue and given Part and Lane.
228 Value *get(const VPValue *Def, const VPLane &Lane);
229
230 bool hasVectorValue(const VPValue *Def) {
231 return Data.VPV2Vector.contains(Def);
232 }
233
234 bool hasScalarValue(const VPValue *Def, VPLane Lane) {
235 auto I = Data.VPV2Scalars.find(Def);
236 if (I == Data.VPV2Scalars.end())
237 return false;
238 unsigned CacheIdx = Lane.mapToCacheIndex(VF);
239 return CacheIdx < I->second.size() && I->second[CacheIdx];
240 }
241
242 /// Set the generated vector Value for a given VPValue, if \p
243 /// IsScalar is false. If \p IsScalar is true, set the scalar in lane 0.
244 void set(const VPValue *Def, Value *V, bool IsScalar = false) {
245 if (IsScalar) {
246 set(Def, V, VPLane(0));
247 return;
248 }
249 assert((VF.isScalar() || isVectorizedTy(V->getType())) &&
250 "scalar values must be stored as (0, 0)");
251 Data.VPV2Vector[Def] = V;
252 }
253
254 /// Reset an existing vector value for \p Def and a given \p Part.
255 void reset(const VPValue *Def, Value *V) {
256 assert(Data.VPV2Vector.contains(Def) && "need to overwrite existing value");
257 Data.VPV2Vector[Def] = V;
258 }
259
260 /// Set the generated scalar \p V for \p Def and the given \p Lane.
261 void set(const VPValue *Def, Value *V, const VPLane &Lane) {
262 auto &Scalars = Data.VPV2Scalars[Def];
263 unsigned CacheIdx = Lane.mapToCacheIndex(VF);
264 if (Scalars.size() <= CacheIdx)
265 Scalars.resize(CacheIdx + 1);
266 assert(!Scalars[CacheIdx] && "should overwrite existing value");
267 Scalars[CacheIdx] = V;
268 }
269
270 /// Reset an existing scalar value for \p Def and a given \p Lane.
271 void reset(const VPValue *Def, Value *V, const VPLane &Lane) {
272 auto Iter = Data.VPV2Scalars.find(Def);
273 assert(Iter != Data.VPV2Scalars.end() &&
274 "need to overwrite existing value");
275 unsigned CacheIdx = Lane.mapToCacheIndex(VF);
276 assert(CacheIdx < Iter->second.size() &&
277 "need to overwrite existing value");
278 Iter->second[CacheIdx] = V;
279 }
280
281 /// Set the debug location in the builder using the debug location \p DL.
283
284 /// Insert the scalar value of \p Def at \p Lane into \p Lane of \p WideValue
285 /// and return the resulting value.
286 Value *packScalarIntoVectorizedValue(const VPValue *Def, Value *WideValue,
287 const VPLane &Lane);
288
289 /// Hold state information used when constructing the CFG of the output IR,
290 /// traversing the VPBasicBlocks and generating corresponding IR BasicBlocks.
291 struct CFGState {
292 /// The previous VPBasicBlock visited. Initially set to null.
294
295 /// The previous IR BasicBlock created or used. Initially set to the new
296 /// header BasicBlock.
297 BasicBlock *PrevBB = nullptr;
298
299 /// The last IR BasicBlock in the output IR. Set to the exit block of the
300 /// vector loop.
301 BasicBlock *ExitBB = nullptr;
302
303 /// A mapping of each VPBasicBlock to the corresponding BasicBlock. In case
304 /// of replication, maps the BasicBlock of the last replica created.
306
307 /// Updater for the DominatorTree.
309
311 : DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy) {}
313
314 /// Hold a pointer to LoopInfo to register new basic blocks in the loop.
316
317 /// Hold a pointer to AssumptionCache to register new assumptions after
318 /// replicating assume calls.
320
321 /// Hold a reference to the IRBuilder used to generate output IR code.
323
324 /// Pointer to the VPlan code is generated for.
326
327 /// The parent loop object for the current scope, or nullptr.
329
330 /// VPlan-based type analysis.
332
333 /// VPlan-based dominator tree.
335};
336
337/// Struct to hold various analysis needed for cost computations.
347 const Loop *L;
348
355
356 /// Return the cost for \p UI with \p VF using the legacy cost model as
357 /// fallback until computing the cost of all recipes migrates to VPlan.
359
360 /// Return true if the cost for \p UI shouldn't be computed, e.g. because it
361 /// has already been pre-computed.
362 bool skipCostComputation(Instruction *UI, bool IsVector) const;
363
364 /// \returns how much the cost of a predicated block should be divided by.
365 /// Forwards to LoopVectorizationCostModel::getPredBlockCostDivisor.
366 unsigned getPredBlockCostDivisor(BasicBlock *BB) const;
367
368 /// Returns the OperandInfo for \p V, if it is a live-in.
370
371 /// Return true if \p I is considered uniform-after-vectorization in the
372 /// legacy cost model for \p VF. Only used to check for additional VPlan
373 /// simplifications.
375
376 /// Estimate the overhead of scalarizing a recipe with result type \p ResultTy
377 /// and \p Operands with \p VF. This is a convenience wrapper for the
378 /// type-based getScalarizationOverhead API. \p VIC provides context about
379 /// whether the scalarization is for a load/store operation. If \p
380 /// AlwaysIncludeReplicatingR is true, always compute the cost of scalarizing
381 /// replicating operands.
383 Type *ResultTy, ArrayRef<const VPValue *> Operands, ElementCount VF,
385 bool AlwaysIncludeReplicatingR = false);
386};
387
388/// This class can be used to assign names to VPValues. For VPValues without
389/// underlying value, assign consecutive numbers and use those as names (wrapped
390/// in vp<>). Otherwise, use the name from the underlying value (wrapped in
391/// ir<>), appending a .V version number if there are multiple uses of the same
392/// name. Allows querying names for VPValues for printing, similar to the
393/// ModuleSlotTracker for IR values.
395 /// Keep track of versioned names assigned to VPValues with underlying IR
396 /// values.
398 /// Keep track of the next number to use to version the base name.
399 StringMap<unsigned> BaseName2Version;
400
401 /// Number to assign to the next VPValue without underlying value.
402 unsigned NextSlot = 0;
403
404 /// Lazily created ModuleSlotTracker, used only when unnamed IR instructions
405 /// require slot tracking.
406 std::unique_ptr<ModuleSlotTracker> MST;
407
408 /// Cached metadata kind names from the Module's LLVMContext.
410
411 /// Cached Module pointer for printing metadata.
412 const Module *M = nullptr;
413
414 void assignName(const VPValue *V);
415 LLVM_ABI_FOR_TEST void assignNames(const VPlan &Plan);
416 void assignNames(const VPBasicBlock *VPBB);
417 std::string getName(const Value *V);
418
419public:
420 VPSlotTracker(const VPlan *Plan = nullptr) {
421 if (Plan) {
422 assignNames(*Plan);
423 if (auto *ScalarHeader = Plan->getScalarHeader())
424 M = ScalarHeader->getIRBasicBlock()->getModule();
425 }
426 }
427
428 /// Returns the name assigned to \p V, if there is one, otherwise try to
429 /// construct one from the underlying value, if there's one; else return
430 /// <badref>.
431 std::string getOrCreateName(const VPValue *V) const;
432
433 /// Returns the cached metadata kind names.
435 if (MDNames.empty() && M)
436 M->getContext().getMDKindNames(MDNames);
437 return MDNames;
438 }
439
440 /// Returns the cached Module pointer.
441 const Module *getModule() const { return M; }
442};
443
444#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
445/// VPlanPrinter prints a given VPlan to a given output stream. The printing is
446/// indented and follows the dot format.
448 raw_ostream &OS;
449 const VPlan &Plan;
450 unsigned Depth = 0;
451 unsigned TabWidth = 2;
452 std::string Indent;
453 unsigned BID = 0;
455
456 VPSlotTracker SlotTracker;
457
458 /// Handle indentation.
459 void bumpIndent(int b) { Indent = std::string((Depth += b) * TabWidth, ' '); }
460
461 /// Print a given \p Block of the Plan.
462 void dumpBlock(const VPBlockBase *Block);
463
464 /// Print the information related to the CFG edges going out of a given
465 /// \p Block, followed by printing the successor blocks themselves.
466 void dumpEdges(const VPBlockBase *Block);
467
468 /// Print a given \p BasicBlock, including its VPRecipes, followed by printing
469 /// its successor blocks.
470 void dumpBasicBlock(const VPBasicBlock *BasicBlock);
471
472 /// Print a given \p Region of the Plan.
473 void dumpRegion(const VPRegionBlock *Region);
474
475 unsigned getOrCreateBID(const VPBlockBase *Block) {
476 return BlockID.count(Block) ? BlockID[Block] : BlockID[Block] = BID++;
477 }
478
479 Twine getOrCreateName(const VPBlockBase *Block);
480
481 Twine getUID(const VPBlockBase *Block);
482
483 /// Print the information related to a CFG edge between two VPBlockBases.
484 void drawEdge(const VPBlockBase *From, const VPBlockBase *To, bool Hidden,
485 const Twine &Label);
486
487public:
489 : OS(O), Plan(P), SlotTracker(&P) {}
490
491 LLVM_DUMP_METHOD void dump();
492};
493#endif
494
495/// Check if a constant \p CI can be safely treated as having been extended
496/// from a narrower type with the given extension kind.
497bool canConstantBeExtended(const APInt *C, Type *NarrowType,
499} // end namespace llvm
500
501#endif // LLVM_TRANSFORMS_VECTORIZE_VPLAN_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
Definition Compiler.h:661
#define LLVM_ABI_FOR_TEST
Definition Compiler.h:218
This file defines the DenseMap class.
Flatten the CFG
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
#define I(x, y, z)
Definition MD5.cpp:57
#define P(N)
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
This pass exposes codegen information to IR-level passes.
This file implements dominator tree analysis for a single level of a VPlan's H-CFG.
ArrayRef - 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.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
A debug info location.
Definition DebugLoc.h:123
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:164
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
InductionKind
This enum represents the kinds of inductions that we support.
InnerLoopVectorizer vectorizes loops which contain only one basic block to a specified vectorization ...
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LoopVectorizationCostModel - estimates the expected speedups due to vectorization.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
An interface layer with SCEV used to manage how we see SCEV expressions for values in the context of ...
This class represents an analyzed expression in the program.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Definition StringMap.h:133
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.
VectorInstrContext
Represents a hint about the context in which an insert/extract is used.
@ None
The insert/extract is not used with a load/store.
TargetCostKind
The kind of cost model.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
Iterator to iterate over vectorization factors in a VFRange.
ElementCount operator*() const
iterator(ElementCount VF)
bool operator==(const iterator &Other) const
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
Definition VPlan.h:4081
VPBlockBase is the building block of the Hierarchical Control-Flow Graph.
Definition VPlan.h:81
Template specialization of the standard LLVM dominator tree utility for VPBlockBases.
In what follows, the term "input IR" refers to code that is fed into the vectorizer whereas the term ...
static VPLane getLastLaneForVF(const ElementCount &VF)
Value * getAsRuntimeExpr(IRBuilderBase &Builder, const ElementCount &VF) const
Returns an expression describing the lane index that can be used at runtime.
Definition VPlan.cpp:85
VPLane(unsigned Lane, Kind LaneKind)
Kind getKind() const
Returns the Kind of lane offset.
static VPLane getLaneFromEnd(const ElementCount &VF, unsigned Offset)
bool isFirstLane() const
Returns true if this is the first lane of the whole vector.
VPLane(unsigned Lane)
unsigned getKnownLane() const
Returns a compile-time known value for the lane index and asserts if the lane can only be calculated ...
static VPLane getFirstLane()
Kind
Kind describes how to interpret Lane.
@ ScalableLast
For ScalableLast, Lane is the offset from the start of the last N-element subvector in a scalable vec...
@ First
For First, Lane is the index into the first N elements of a fixed-vector <N x <ElTy>> or a scalable v...
unsigned mapToCacheIndex(const ElementCount &VF) const
Maps the lane to a cache index based on VF.
VPRegionBlock represents a collection of VPBasicBlocks and VPRegionBlocks which form a Single-Entry-S...
Definition VPlan.h:4269
This class can be used to assign names to VPValues.
ArrayRef< StringRef > getMDNames()
Returns the cached metadata kind names.
std::string getOrCreateName(const VPValue *V) const
Returns the name assigned to V, if there is one, otherwise try to construct one from the underlying v...
Definition VPlan.cpp:1523
const Module * getModule() const
Returns the cached Module pointer.
VPSlotTracker(const VPlan *Plan=nullptr)
An analysis for type-inference for VPValues.
This is the base class of the VPlan Def/Use graph, used for modeling the data flow into,...
Definition VPlanValue.h:46
VPlanPrinter(raw_ostream &O, const VPlan &P)
LLVM_DUMP_METHOD void dump()
Definition VPlan.cpp:1258
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition VPlan.h:4399
VPIRBasicBlock * getScalarHeader() const
Return the VPIRBasicBlock wrapping the header of the scalar loop.
Definition VPlan.h:4532
LLVM Value Representation.
Definition Value.h:75
constexpr bool isScalable() const
Returns whether the quantity is scaled by a runtime quantity (vscale).
Definition TypeSize.h:168
constexpr ScalarTy getKnownMinValue() const
Returns the minimum value this quantity can represent.
Definition TypeSize.h:165
CRTP base class which implements the entire standard iterator facade in terms of a minimal subset of ...
Definition iterator.h:80
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
Value * getRuntimeVF(IRBuilderBase &B, Type *Ty, ElementCount VF)
Return the runtime value for VF.
bool isVectorizedTy(Type *Ty)
Returns true if Ty is a vector type or a struct of vector types where all vector types share the same...
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
Definition MathExtras.h:279
bool canConstantBeExtended(const APInt *C, Type *NarrowType, TTI::PartialReductionExtendKind ExtKind)
Check if a constant CI can be safely treated as having been extended from a narrower type with the gi...
Definition VPlan.cpp:1744
@ Other
Any other memory.
Definition ModRef.h:68
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
Value * createStepForVF(IRBuilderBase &B, Type *Ty, ElementCount VF, int64_t Step)
Return a value for Step multiplied by VF.
Value * emitTransformedIndex(IRBuilderBase &B, Value *Index, Value *StartValue, Value *Step, InductionDescriptor::InductionKind InductionKind, const BinaryOperator *InductionBinOp)
Compute the transformed value of Index at offset StartValue using step StepValue.
iterator end()
const ElementCount Start
ElementCount End
iterator begin()
bool isEmpty() const
VFRange(const ElementCount &Start, const ElementCount &End)
unsigned getPredBlockCostDivisor(BasicBlock *BB) const
LLVMContext & LLVMCtx
LoopVectorizationCostModel & CM
TargetTransformInfo::OperandValueInfo getOperandInfo(VPValue *V) const
Returns the OperandInfo for V, if it is a live-in.
Definition VPlan.cpp:1755
bool isLegacyUniformAfterVectorization(Instruction *I, ElementCount VF) const
Return true if I is considered uniform-after-vectorization in the legacy cost model for VF.
bool skipCostComputation(Instruction *UI, bool IsVector) const
Return true if the cost for UI shouldn't be computed, e.g.
InstructionCost getLegacyCost(Instruction *UI, ElementCount VF) const
Return the cost for UI with VF using the legacy cost model as fallback until computing the cost of al...
PredicatedScalarEvolution & PSE
InstructionCost getScalarizationOverhead(Type *ResultTy, ArrayRef< const VPValue * > Operands, ElementCount VF, TTI::VectorInstrContext VIC=TTI::VectorInstrContext::None, bool AlwaysIncludeReplicatingR=false)
Estimate the overhead of scalarizing a recipe with result type ResultTy and Operands with VF.
Definition VPlan.cpp:1762
TargetTransformInfo::TargetCostKind CostKind
VPTypeAnalysis Types
const TargetLibraryInfo & TLI
const TargetTransformInfo & TTI
SmallPtrSet< Instruction *, 8 > SkipCostComputation
VPCostContext(const TargetTransformInfo &TTI, const TargetLibraryInfo &TLI, const VPlan &Plan, LoopVectorizationCostModel &CM, TargetTransformInfo::TargetCostKind CostKind, PredicatedScalarEvolution &PSE, const Loop *L)
BasicBlock * PrevBB
The previous IR BasicBlock created or used.
VPBasicBlock * PrevVPBB
The previous VPBasicBlock visited. Initially set to null.
BasicBlock * ExitBB
The last IR BasicBlock in the output IR.
SmallDenseMap< const VPBasicBlock *, BasicBlock * > VPBB2IRBB
A mapping of each VPBasicBlock to the corresponding BasicBlock.
DomTreeUpdater DTU
Updater for the DominatorTree.
DenseMap< const VPValue *, SmallVector< Value *, 4 > > VPV2Scalars
DenseMap< const VPValue *, Value * > VPV2Vector
LoopInfo * LI
Hold a pointer to LoopInfo to register new basic blocks in the loop.
void reset(const VPValue *Def, Value *V)
Reset an existing vector value for Def and a given Part.
VPTypeAnalysis TypeAnalysis
VPlan-based type analysis.
struct llvm::VPTransformState::DataState Data
Value * get(const VPValue *Def, bool IsScalar=false)
Get the generated vector Value for a given VPValue Def if IsScalar is false, otherwise return the gen...
Definition VPlan.cpp:277
VPTransformState(const TargetTransformInfo *TTI, ElementCount VF, LoopInfo *LI, DominatorTree *DT, AssumptionCache *AC, IRBuilderBase &Builder, VPlan *Plan, Loop *CurrentParentLoop, Type *CanonicalIVTy)
Definition VPlan.cpp:237
std::optional< VPLane > Lane
Hold the index to generate specific scalar instructions.
void set(const VPValue *Def, Value *V, const VPLane &Lane)
Set the generated scalar V for Def and the given Lane.
IRBuilderBase & Builder
Hold a reference to the IRBuilder used to generate output IR code.
bool hasScalarValue(const VPValue *Def, VPLane Lane)
const TargetTransformInfo * TTI
Target Transform Info.
VPlan * Plan
Pointer to the VPlan code is generated for.
void set(const VPValue *Def, Value *V, bool IsScalar=false)
Set the generated vector Value for a given VPValue, if IsScalar is false.
bool hasVectorValue(const VPValue *Def)
VPDominatorTree VPDT
VPlan-based dominator tree.
ElementCount VF
The chosen Vectorization Factor of the loop being vectorized.
Value * packScalarIntoVectorizedValue(const VPValue *Def, Value *WideValue, const VPLane &Lane)
Insert the scalar value of Def at Lane into Lane of WideValue and return the resulting value.
Definition VPlan.cpp:359
AssumptionCache * AC
Hold a pointer to AssumptionCache to register new assumptions after replicating assume calls.
void setDebugLocFrom(DebugLoc DL)
Set the debug location in the builder using the debug location DL.
Definition VPlan.cpp:337
Loop * CurrentParentLoop
The parent loop object for the current scope, or nullptr.
void reset(const VPValue *Def, Value *V, const VPLane &Lane)
Reset an existing scalar value for Def and a given Lane.