LLVM 24.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 CallInst;
34class DominatorTree;
36class IRBuilderBase;
37class LoopInfo;
38class SCEV;
39class Type;
41class VPBasicBlock;
42class VPRegionBlock;
43class VPlan;
44class Value;
45
46namespace Intrinsic {
47typedef unsigned ID;
48}
49
50/// Returns a calculation for the total number of elements for a given \p VF.
51/// For fixed width vectors this value is a constant, whereas for scalable
52/// vectors it is an expression determined at runtime.
54
55/// A range of powers-of-2 vectorization factors with fixed start and
56/// adjustable end. The range includes start and excludes end, e.g.,:
57/// [1, 16) = {1, 2, 4, 8}
58struct VFRange {
59 // A power of 2.
61
62 // A power of 2. If End <= Start range is empty.
64
65 bool isEmpty() const {
66 return End.getKnownMinValue() <= Start.getKnownMinValue();
67 }
68
70 : Start(Start), End(End) {
71 assert(Start.isScalable() == End.isScalable() &&
72 "Both Start and End should have the same scalable flag");
73 assert(isPowerOf2_32(Start.getKnownMinValue()) &&
74 "Expected Start to be a power of 2");
75 assert(isPowerOf2_32(End.getKnownMinValue()) &&
76 "Expected End to be a power of 2");
77 }
78
79 /// Iterator to iterate over vectorization factors in a VFRange.
81 : public iterator_facade_base<iterator, std::forward_iterator_tag,
82 ElementCount> {
83 ElementCount VF;
84
85 public:
86 iterator(ElementCount VF) : VF(VF) {}
87
88 bool operator==(const iterator &Other) const { return VF == Other.VF; }
89
90 ElementCount operator*() const { return VF; }
91
93 VF *= 2;
94 return *this;
95 }
96 };
97
100 assert(isPowerOf2_32(End.getKnownMinValue()));
101 return iterator(End);
102 }
103};
104
105/// In what follows, the term "input IR" refers to code that is fed into the
106/// vectorizer whereas the term "output IR" refers to code that is generated by
107/// the vectorizer.
108
109/// VPLane provides a way to access lanes in both fixed width and scalable
110/// vectors, where for the latter the lane index sometimes needs calculating
111/// as a runtime expression.
112class VPLane {
113public:
114 /// Kind describes how to interpret Lane.
115 enum class Kind : uint8_t {
116 /// For First, Lane is the index into the first N elements of a
117 /// fixed-vector <N x <ElTy>> or a scalable vector <vscale x N x <ElTy>>.
119 /// For ScalableLast, Lane is the offset from the start of the last
120 /// N-element subvector in a scalable vector <vscale x N x <ElTy>>. For
121 /// example, a Lane of 0 corresponds to lane `(vscale - 1) * N`, a Lane of
122 /// 1 corresponds to `((vscale - 1) * N) + 1`, etc.
124 };
125
126private:
127 /// in [0..VF)
128 unsigned Lane;
129
130 /// Indicates how the Lane should be interpreted, as described above.
131 Kind LaneKind = Kind::First;
132
133public:
134 VPLane(unsigned Lane) : Lane(Lane) {}
135 VPLane(unsigned Lane, Kind LaneKind) : Lane(Lane), LaneKind(LaneKind) {}
136
138
139 static VPLane getLaneFromEnd(const ElementCount &VF, unsigned Offset) {
140 assert(Offset > 0 && Offset <= VF.getKnownMinValue() &&
141 "trying to extract with invalid offset");
142 unsigned LaneOffset = VF.getKnownMinValue() - Offset;
143 Kind LaneKind;
144 if (VF.isScalable())
145 // In this case 'LaneOffset' refers to the offset from the start of the
146 // last subvector with VF.getKnownMinValue() elements.
148 else
149 LaneKind = VPLane::Kind::First;
150 return VPLane(LaneOffset, LaneKind);
151 }
152
154 return getLaneFromEnd(VF, 1);
155 }
156
157 /// Returns a compile-time known value for the lane index and asserts if the
158 /// lane can only be calculated at runtime.
159 unsigned getKnownLane() const {
160 assert(LaneKind == Kind::First &&
161 "can only get known lane from the beginning");
162 return Lane;
163 }
164
165 /// Returns an expression describing the lane index that can be used at
166 /// runtime.
167 Value *getAsRuntimeExpr(IRBuilderBase &Builder, const ElementCount &VF) const;
168
169 /// Returns the Kind of lane offset.
170 Kind getKind() const { return LaneKind; }
171
172 /// Returns true if this is the first lane of the whole vector.
173 bool isFirstLane() const { return Lane == 0 && LaneKind == Kind::First; }
174
175 /// Maps the lane to a cache index based on \p VF.
176 unsigned mapToCacheIndex(const ElementCount &VF) const {
177 switch (LaneKind) {
179 assert(VF.isScalable() && Lane < VF.getKnownMinValue() &&
180 "ScalableLast can only be used with scalable VFs");
181 return VF.getKnownMinValue() + Lane;
182 default:
183 assert(Lane < VF.getKnownMinValue() &&
184 "Cannot extract lane larger than VF");
185 return Lane;
186 }
187 }
188};
189
190/// VPTransformState holds information passed down when "executing" a VPlan,
191/// needed for generating the output IR.
197 /// Target Transform Info.
199
200 /// The chosen Vectorization Factor of the loop being vectorized.
202
203 struct DataState {
204 // Each value from the original loop, when vectorized, is represented by a
205 // vector value in the map.
207
210
211 /// Get the generated vector Value for a given VPValue \p Def if \p IsScalar
212 /// is false, otherwise return the generated scalar. \See set.
213 Value *get(const VPValue *Def, bool IsScalar = false);
214
215 /// Get the generated Value for a given VPValue and given Part and Lane.
216 Value *get(const VPValue *Def, const VPLane &Lane);
217
218 bool hasVectorValue(const VPValue *Def) {
219 return Data.VPV2Vector.contains(Def);
220 }
221
222 bool hasScalarValue(const VPValue *Def, VPLane Lane) {
223 auto I = Data.VPV2Scalars.find(Def);
224 if (I == Data.VPV2Scalars.end())
225 return false;
226 unsigned CacheIdx = Lane.mapToCacheIndex(VF);
227 return CacheIdx < I->second.size() && I->second[CacheIdx];
228 }
229
230 /// Set the generated vector Value for a given VPValue, if \p
231 /// IsScalar is false. If \p IsScalar is true, set the scalar in lane 0.
232 void set(const VPValue *Def, Value *V, bool IsScalar = false) {
233 if (IsScalar) {
234 set(Def, V, VPLane(0));
235 return;
236 }
237 assert((VF.isScalar() || isVectorizedTy(V->getType())) &&
238 "scalar values must be stored as (0, 0)");
239 Data.VPV2Vector[Def] = V;
240 }
241
242 /// Reset an existing vector value for \p Def and a given \p Part.
243 void reset(const VPValue *Def, Value *V) {
244 assert(Data.VPV2Vector.contains(Def) && "need to overwrite existing value");
245 Data.VPV2Vector[Def] = V;
246 }
247
248 /// Set the generated scalar \p V for \p Def and the given \p Lane.
249 void set(const VPValue *Def, Value *V, const VPLane &Lane) {
250 auto &Scalars = Data.VPV2Scalars[Def];
251 unsigned CacheIdx = Lane.mapToCacheIndex(VF);
252 if (Scalars.size() <= CacheIdx)
253 Scalars.resize(CacheIdx + 1);
254 assert(!Scalars[CacheIdx] && "should overwrite existing value");
255 Scalars[CacheIdx] = V;
256 }
257
258 /// Reset an existing scalar value for \p Def and a given \p Lane.
259 void reset(const VPValue *Def, Value *V, const VPLane &Lane) {
260 auto Iter = Data.VPV2Scalars.find(Def);
261 assert(Iter != Data.VPV2Scalars.end() &&
262 "need to overwrite existing value");
263 unsigned CacheIdx = Lane.mapToCacheIndex(VF);
264 assert(CacheIdx < Iter->second.size() &&
265 "need to overwrite existing value");
266 Iter->second[CacheIdx] = V;
267 }
268
269 /// Set the debug location in the builder using the debug location \p DL.
271
272 /// Insert the scalar value of \p Def at \p Lane into \p Lane of \p WideValue
273 /// and return the resulting value.
274 Value *packScalarIntoVectorizedValue(const VPValue *Def, Value *WideValue,
275 const VPLane &Lane);
276
277 /// Add the backedge (latch) incoming value to the canonical, reduction and
278 /// first-order recurrence phis in all loop headers state's plan, after
279 /// the loop body has been generated.
280 void fixupHeaderPhis();
281
282 /// Hold state information used when constructing the CFG of the output IR,
283 /// traversing the VPBasicBlocks and generating corresponding IR BasicBlocks.
284 struct CFGState {
285 /// The previous VPBasicBlock visited. Initially set to null.
287
288 /// The previous IR BasicBlock created or used. Initially set to the new
289 /// header BasicBlock.
290 BasicBlock *PrevBB = nullptr;
291
292 /// The last IR BasicBlock in the output IR. Set to the exit block of the
293 /// vector loop.
294 BasicBlock *ExitBB = nullptr;
295
296 /// A mapping of each VPBasicBlock to the corresponding BasicBlock. In case
297 /// of replication, maps the BasicBlock of the last replica created.
299
300 /// Updater for the DominatorTree.
302
304 : DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy) {}
306
307 /// Hold a pointer to LoopInfo to register new basic blocks in the loop.
309
310 /// Hold a pointer to AssumptionCache to register new assumptions after
311 /// replicating assume calls.
313
314 /// Hold a reference to the IRBuilder used to generate output IR code.
316
317 /// Pointer to the VPlan code is generated for.
319
320 /// The parent loop object for the current scope, or nullptr.
322
323 /// VPlan-based dominator tree.
325};
326
327/// Struct to hold various analysis needed for cost computations.
337 const Loop *L;
338
339 /// Number of predicated stores in the VPlan, computed on demand.
340 std::optional<unsigned> NumPredStores;
341
342 VPCostContext(const TargetLibraryInfo &TLI, const VPlan &Plan,
344
345 /// Return the cost for \p UI with \p VF using the legacy cost model as
346 /// fallback until computing the cost of all recipes migrates to VPlan.
348
349 /// Return true if the cost for \p UI shouldn't be computed, e.g. because it
350 /// has already been pre-computed.
351 bool skipCostComputation(Instruction *UI, bool IsVector) const;
352
353 /// Mark the widening decision for \p I at \p VF as invalidated since a VPlan
354 /// transform replaced the original recipe.
356
357 /// \returns how much the cost of a predicated block should be divided by.
358 /// Forwards to LoopVectorizationCostModel::getPredBlockCostDivisor.
360
361 /// Returns true if \p I is known to be scalarized at \p VF.
363
364 /// Forwards to LoopVectorizationCostModel::isMaskRequired.
365 bool isMaskRequired(Instruction *I) const;
366
367 /// Returns the OperandInfo for \p V, if it is a live-in.
369
370 /// Estimate the overhead of scalarizing a recipe with result type \p ResultTy
371 /// and \p Operands with \p VF. This is a convenience wrapper for the
372 /// type-based getScalarizationOverhead API. \p VIC provides context about
373 /// whether the scalarization is for a load/store operation. If \p
374 /// AlwaysIncludeReplicatingR is true, always compute the cost of scalarizing
375 /// replicating operands.
377 Type *ResultTy, ArrayRef<const VPValue *> Operands, ElementCount VF,
379 bool AlwaysIncludeReplicatingR = false);
380
381 /// Returns true if an artificially high cost for emulated masked memrefs
382 /// should be used.
384
385 /// Returns true if \p ID is a pseudo intrinsic that is dropped via
386 /// scalarization rather than widened.
388};
389
390/// This class can be used to assign names to VPValues. For VPValues without
391/// underlying value, assign consecutive numbers and use those as names (wrapped
392/// in vp<>). Otherwise, use the name from the underlying value (wrapped in
393/// ir<>), appending a .V version number if there are multiple uses of the same
394/// name. Allows querying names for VPValues for printing, similar to the
395/// ModuleSlotTracker for IR values.
397 /// Keep track of versioned names assigned to VPValues with underlying IR
398 /// values.
400 /// Keep track of the next number to use to version the base name.
401 StringMap<unsigned> BaseName2Version;
402
403 /// Number to assign to the next VPValue without underlying value.
404 unsigned NextSlot = 0;
405
406 /// Lazily created ModuleSlotTracker, used only when unnamed IR instructions
407 /// require slot tracking.
408 std::unique_ptr<ModuleSlotTracker> MST;
409
410 /// Cached metadata kind names from the Module's LLVMContext.
412
413 /// Cached Module pointer for printing metadata.
414 const Module *M = nullptr;
415
416 void assignName(const VPValue *V);
417 LLVM_ABI_FOR_TEST void assignNames(const VPlan &Plan);
418 void assignNames(const VPBasicBlock *VPBB);
419 std::string getName(const Value *V);
420
421public:
422 VPSlotTracker(const VPlan *Plan = nullptr) {
423 if (Plan) {
424 assignNames(*Plan);
425 if (auto *ScalarHeader = Plan->getScalarHeader())
426 M = ScalarHeader->getIRBasicBlock()->getModule();
427 }
428 }
429
430 /// Returns the name assigned to \p V, if there is one, otherwise try to
431 /// construct one from the underlying value, if there's one; else return
432 /// <badref>.
433 std::string getOrCreateName(const VPValue *V) const;
434
435 /// Returns the cached metadata kind names.
437 if (MDNames.empty() && M)
438 M->getContext().getMDKindNames(MDNames);
439 return MDNames;
440 }
441
442 /// Returns the cached Module pointer.
443 const Module *getModule() const { return M; }
444};
445
446#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
447/// VPlanPrinter prints a given VPlan to a given output stream. The printing is
448/// indented and follows the dot format.
450 raw_ostream &OS;
451 const VPlan &Plan;
452 unsigned Depth = 0;
453 unsigned TabWidth = 2;
454 std::string Indent;
455 unsigned BID = 0;
457
458 VPSlotTracker SlotTracker;
459
460 /// Handle indentation.
461 void bumpIndent(int b) { Indent = std::string((Depth += b) * TabWidth, ' '); }
462
463 /// Print a given \p Block of the Plan.
464 void dumpBlock(const VPBlockBase *Block);
465
466 /// Print the information related to the CFG edges going out of a given
467 /// \p Block, followed by printing the successor blocks themselves.
468 void dumpEdges(const VPBlockBase *Block);
469
470 /// Print a given \p BasicBlock, including its VPRecipes, followed by printing
471 /// its successor blocks.
472 void dumpBasicBlock(const VPBasicBlock *BasicBlock);
473
474 /// Print a given \p Region of the Plan.
475 void dumpRegion(const VPRegionBlock *Region);
476
477 unsigned getOrCreateBID(const VPBlockBase *Block) {
478 return BlockID.count(Block) ? BlockID[Block] : BlockID[Block] = BID++;
479 }
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:672
#define LLVM_ABI_FOR_TEST
Definition Compiler.h:220
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.
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
This class represents a function call, abstracting a target machine's calling convention.
A debug info location.
Definition DebugLoc.h:126
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:151
Common base class shared among various IRBuilders.
Definition IRBuilder.h:114
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:128
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.
TargetCostKind
The kind of cost model.
llvm::VectorInstrContext VectorInstrContext
@ None
The cast is not used with a load/store of any kind.
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:46
Iterator to iterate over vectorization factors in a VFRange.
ElementCount operator*() const
iterator(ElementCount VF)
bool operator==(const iterator &Other) const
Holds state needed to make cost decisions before computing costs per-VF, including the maximum VFs.
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
Definition VPlan.h:4376
VPBlockBase is the building block of the Hierarchical Control-Flow Graph.
Definition VPlan.h:94
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:88
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:4601
VPReplicateRecipe replicates a given instruction producing multiple scalar copies of the original sca...
Definition VPlan.h:3384
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:1633
const Module * getModule() const
Returns the cached Module pointer.
VPSlotTracker(const VPlan *Plan=nullptr)
This is the base class of the VPlan Def/Use graph, used for modeling the data flow into,...
Definition VPlanValue.h:50
VPlanPrinter(raw_ostream &O, const VPlan &P)
LLVM_DUMP_METHOD void dump()
Definition VPlan.cpp:1347
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition VPlan.h:4788
VPIRBasicBlock * getScalarHeader() const
Return the VPIRBasicBlock wrapping the header of the scalar loop.
Definition VPlan.h:4939
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
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
This namespace contains an enum with a value for every intrinsic/builtin function known by LLVM.
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:578
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:280
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:1879
@ Other
Any other memory.
Definition ModRef.h:68
iterator end()
const ElementCount Start
ElementCount End
iterator begin()
bool isEmpty() const
VFRange(const ElementCount &Start, const ElementCount &End)
LLVMContext & LLVMCtx
const VFSelectionContext & Config
VPCostContext(const TargetLibraryInfo &TLI, const VPlan &Plan, LoopVectorizationCostModel &CM, VFSelectionContext &Config)
LoopVectorizationCostModel & CM
TargetTransformInfo::OperandValueInfo getOperandInfo(VPValue *V) const
Returns the OperandInfo for V, if it is a live-in.
Definition VPlan.cpp:1890
static bool isFreeScalarIntrinsic(Intrinsic::ID ID)
Returns true if ID is a pseudo intrinsic that is dropped via scalarization rather than widened.
Definition VPlan.cpp:1975
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...
bool isMaskRequired(Instruction *I) const
Forwards to LoopVectorizationCostModel::isMaskRequired.
void invalidateWideningDecision(Instruction *I, ElementCount VF)
Mark the widening decision for I at VF as invalidated since a VPlan transform replaced the original r...
PredicatedScalarEvolution & PSE
bool willBeScalarized(Instruction *I, ElementCount VF) const
Returns true if I is known to be scalarized at VF.
uint64_t getPredBlockCostDivisor(BasicBlock *BB) const
std::optional< unsigned > NumPredStores
Number of predicated stores in the VPlan, computed on demand.
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:1897
TargetTransformInfo::TargetCostKind CostKind
const TargetLibraryInfo & TLI
const TargetTransformInfo & TTI
SmallPtrSet< Instruction *, 8 > SkipCostComputation
bool useEmulatedMaskMemRefHack(const VPReplicateRecipe *R, ElementCount VF)
Returns true if an artificially high cost for emulated masked memrefs should be used.
Definition VPlan.cpp:1935
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 fixupHeaderPhis()
Add the backedge (latch) incoming value to the canonical, reduction and first-order recurrence phis i...
Definition VPlan.cpp:396
void reset(const VPValue *Def, Value *V)
Reset an existing vector value for Def and a given Part.
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:315
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.
VPTransformState(const TargetTransformInfo *TTI, ElementCount VF, LoopInfo *LI, DominatorTree *DT, AssumptionCache *AC, IRBuilderBase &Builder, VPlan *Plan, Loop *CurrentParentLoop)
Definition VPlan.cpp:273
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:376
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:354
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.