LLVM 22.0.0git
VPlanValue.h
Go to the documentation of this file.
1//===- VPlanValue.h - Represent Values in Vectorizer Plan -----------------===//
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 the entities induced by Vectorization
11/// Plans, e.g. the instructions the VPlan intends to generate if executed.
12/// VPlan models the following entities:
13/// VPValue VPUser VPDef
14/// | |
15/// VPInstruction
16/// These are documented in docs/VectorizationPlan.rst.
17///
18//===----------------------------------------------------------------------===//
19
20#ifndef LLVM_TRANSFORMS_VECTORIZE_VPLAN_VALUE_H
21#define LLVM_TRANSFORMS_VECTORIZE_VPLAN_VALUE_H
22
23#include "llvm/ADT/DenseMap.h"
24#include "llvm/ADT/STLExtras.h"
26#include "llvm/ADT/StringMap.h"
30
31namespace llvm {
32
33// Forward declarations.
34class raw_ostream;
35class Value;
36class VPDef;
37struct VPDoubleValueDef;
38class VPSlotTracker;
39class VPUser;
40class VPRecipeBase;
41class VPInterleaveRecipe;
42class VPPhiAccessors;
43
44// This is the base class of the VPlan Def/Use graph, used for modeling the data
45// flow into, within and out of the VPlan. VPValues can stand for live-ins
46// coming from the input IR and instructions which VPlan will generate if
47// executed.
49 friend class VPDef;
50 friend struct VPDoubleValueDef;
51 friend class VPInterleaveRecipe;
52 friend class VPlan;
53 friend class VPExpressionRecipe;
54
55 const unsigned char SubclassID; ///< Subclass identifier (for isa/dyn_cast).
56
58
59protected:
60 // Hold the underlying Value, if any, attached to this VPValue.
62
63 /// Pointer to the VPDef that defines this VPValue. If it is nullptr, the
64 /// VPValue is not defined by any recipe modeled in VPlan.
66
67 VPValue(const unsigned char SC, Value *UV = nullptr, VPDef *Def = nullptr);
68
69 /// Create a live-in VPValue.
70 VPValue(Value *UV = nullptr) : VPValue(VPValueSC, UV, nullptr) {}
71 /// Create a VPValue for a \p Def which is a subclass of VPValue.
72 VPValue(VPDef *Def, Value *UV = nullptr) : VPValue(VPVRecipeSC, UV, Def) {}
73 /// Create a VPValue for a \p Def which defines multiple values.
74 VPValue(Value *UV, VPDef *Def) : VPValue(VPValueSC, UV, Def) {}
75
76 // DESIGN PRINCIPLE: Access to the underlying IR must be strictly limited to
77 // the front-end and back-end of VPlan so that the middle-end is as
78 // independent as possible of the underlying IR. We grant access to the
79 // underlying IR using friendship. In that way, we should be able to use VPlan
80 // for multiple underlying IRs (Polly?) by providing a new VPlan front-end,
81 // back-end and analysis information for the new IR.
82
83public:
84 /// Return the underlying Value attached to this VPValue.
85 Value *getUnderlyingValue() const { return UnderlyingVal; }
86
87 /// An enumeration for keeping track of the concrete subclass of VPValue that
88 /// are actually instantiated.
89 enum {
90 VPValueSC, /// A generic VPValue, like live-in values or defined by a recipe
91 /// that defines multiple values.
92 VPVRecipeSC /// A VPValue sub-class that is a VPRecipeBase.
93 };
94
95 VPValue(const VPValue &) = delete;
96 VPValue &operator=(const VPValue &) = delete;
97
98 virtual ~VPValue();
99
100 /// \return an ID for the concrete type of this object.
101 /// This is used to implement the classof checks. This should not be used
102 /// for any other purpose, as the values may change as LLVM evolves.
103 unsigned getVPValueID() const { return SubclassID; }
104
105#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
106 void printAsOperand(raw_ostream &OS, VPSlotTracker &Tracker) const;
107 void print(raw_ostream &OS, VPSlotTracker &Tracker) const;
108
109 /// Dump the value to stderr (for debugging).
110 void dump() const;
111#endif
112
113 unsigned getNumUsers() const { return Users.size(); }
114 void addUser(VPUser &User) { Users.push_back(&User); }
115
116 /// Remove a single \p User from the list of users.
118 // The same user can be added multiple times, e.g. because the same VPValue
119 // is used twice by the same VPUser. Remove a single one.
120 auto *I = find(Users, &User);
121 if (I != Users.end())
122 Users.erase(I);
123 }
124
129
130 user_iterator user_begin() { return Users.begin(); }
131 const_user_iterator user_begin() const { return Users.begin(); }
132 user_iterator user_end() { return Users.end(); }
133 const_user_iterator user_end() const { return Users.end(); }
134 user_range users() { return user_range(user_begin(), user_end()); }
136 return const_user_range(user_begin(), user_end());
137 }
138
139 /// Returns true if the value has more than one unique user.
141 if (getNumUsers() == 0)
142 return false;
143
144 // Check if all users match the first user.
145 auto Current = std::next(user_begin());
146 while (Current != user_end() && *user_begin() == *Current)
147 Current++;
148 return Current != user_end();
149 }
150
151 void replaceAllUsesWith(VPValue *New);
152
153 /// Go through the uses list for this VPValue and make each use point to \p
154 /// New if the callback ShouldReplace returns true for the given use specified
155 /// by a pair of (VPUser, the use index).
156 void replaceUsesWithIf(
157 VPValue *New,
158 llvm::function_ref<bool(VPUser &U, unsigned Idx)> ShouldReplace);
159
160 /// Returns the recipe defining this VPValue or nullptr if it is not defined
161 /// by a recipe, i.e. is a live-in.
162 VPRecipeBase *getDefiningRecipe();
163 const VPRecipeBase *getDefiningRecipe() const;
164
165 /// Returns true if this VPValue is defined by a recipe.
166 bool hasDefiningRecipe() const { return getDefiningRecipe(); }
167
168 /// Returns true if this VPValue is a live-in, i.e. defined outside the VPlan.
169 bool isLiveIn() const { return !hasDefiningRecipe(); }
170
171 /// Returns the underlying IR value, if this VPValue is defined outside the
172 /// scope of VPlan. Returns nullptr if the VPValue is defined by a VPDef
173 /// inside a VPlan.
175 assert(isLiveIn() &&
176 "VPValue is not a live-in; it is defined by a VPDef inside a VPlan");
177 return getUnderlyingValue();
178 }
179
180 /// Returns true if the VPValue is defined outside any loop.
181 bool isDefinedOutsideLoopRegions() const;
182
183 // Set \p Val as the underlying Value of this VPValue.
185 assert(!UnderlyingVal && "Underlying Value is already set.");
186 UnderlyingVal = Val;
187 }
188};
189
192
194
195/// This class augments VPValue with operands which provide the inverse def-use
196/// edges from VPValue's users to their defs.
197class VPUser {
198 /// Grant access to removeOperand for VPPhiAccessors, the only supported user.
199 friend class VPPhiAccessors;
200
202
203 /// Removes the operand at index \p Idx. This also removes the VPUser from the
204 /// use-list of the operand.
205 void removeOperand(unsigned Idx) {
206 getOperand(Idx)->removeUser(*this);
207 Operands.erase(Operands.begin() + Idx);
208 }
209
210protected:
211#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
212 /// Print the operands to \p O.
214#endif
215
217 for (VPValue *Operand : Operands)
218 addOperand(Operand);
219 }
220
221public:
222 VPUser() = delete;
223 VPUser(const VPUser &) = delete;
224 VPUser &operator=(const VPUser &) = delete;
225 virtual ~VPUser() {
226 for (VPValue *Op : operands())
227 Op->removeUser(*this);
228 }
229
230 void addOperand(VPValue *Operand) {
231 Operands.push_back(Operand);
232 Operand->addUser(*this);
233 }
234
235 unsigned getNumOperands() const { return Operands.size(); }
236 inline VPValue *getOperand(unsigned N) const {
237 assert(N < Operands.size() && "Operand index out of bounds");
238 return Operands[N];
239 }
240
241 void setOperand(unsigned I, VPValue *New) {
242 Operands[I]->removeUser(*this);
243 Operands[I] = New;
244 New->addUser(*this);
245 }
246
247 /// Swap operands of the VPUser. It must have exactly 2 operands.
249 assert(Operands.size() == 2 && "must have 2 operands to swap");
251 }
252
253 /// Replaces all uses of \p From in the VPUser with \p To.
255
260
261 operand_iterator op_begin() { return Operands.begin(); }
262 const_operand_iterator op_begin() const { return Operands.begin(); }
263 operand_iterator op_end() { return Operands.end(); }
264 const_operand_iterator op_end() const { return Operands.end(); }
268 }
269
270 /// Returns true if the VPUser uses scalars of operand \p Op. Conservatively
271 /// returns if only first (scalar) lane is used, as default.
272 virtual bool usesScalars(const VPValue *Op) const {
274 "Op must be an operand of the recipe");
275 return onlyFirstLaneUsed(Op);
276 }
277
278 /// Returns true if the VPUser only uses the first lane of operand \p Op.
279 /// Conservatively returns false.
280 virtual bool onlyFirstLaneUsed(const VPValue *Op) const {
282 "Op must be an operand of the recipe");
283 return false;
284 }
285
286 /// Returns true if the VPUser only uses the first part of operand \p Op.
287 /// Conservatively returns false.
288 virtual bool onlyFirstPartUsed(const VPValue *Op) const {
290 "Op must be an operand of the recipe");
291 return false;
292 }
293};
294
295/// This class augments a recipe with a set of VPValues defined by the recipe.
296/// It allows recipes to define zero, one or multiple VPValues. A VPDef owns
297/// the VPValues it defines and is responsible for deleting its defined values.
298/// Single-value VPDefs that also inherit from VPValue must make sure to inherit
299/// from VPDef before VPValue.
300class VPDef {
301 friend class VPValue;
302
303 /// Subclass identifier (for isa/dyn_cast).
304 const unsigned char SubclassID;
305
306 /// The VPValues defined by this VPDef.
307 TinyPtrVector<VPValue *> DefinedValues;
308
309 /// Add \p V as a defined value by this VPDef.
310 void addDefinedValue(VPValue *V) {
311 assert(V->Def == this &&
312 "can only add VPValue already linked with this VPDef");
313 DefinedValues.push_back(V);
314 }
315
316 /// Remove \p V from the values defined by this VPDef. \p V must be a defined
317 /// value of this VPDef.
318 void removeDefinedValue(VPValue *V) {
319 assert(V->Def == this && "can only remove VPValue linked with this VPDef");
320 assert(is_contained(DefinedValues, V) &&
321 "VPValue to remove must be in DefinedValues");
322 llvm::erase(DefinedValues, V);
323 V->Def = nullptr;
324 }
325
326public:
327 /// An enumeration for keeping track of the concrete subclass of VPRecipeBase
328 /// that is actually instantiated. Values of this enumeration are kept in the
329 /// SubclassID field of the VPRecipeBase objects. They are used for concrete
330 /// type identification.
331 using VPRecipeTy = enum {
332 VPBranchOnMaskSC,
333 VPDerivedIVSC,
334 VPExpandSCEVSC,
335 VPExpressionSC,
336 VPIRInstructionSC,
337 VPInstructionSC,
338 VPInterleaveSC,
339 VPReductionEVLSC,
340 VPReductionSC,
341 VPPartialReductionSC,
342 VPReplicateSC,
343 VPScalarIVStepsSC,
344 VPVectorPointerSC,
345 VPVectorEndPointerSC,
346 VPWidenCallSC,
347 VPWidenCanonicalIVSC,
348 VPWidenCastSC,
349 VPWidenGEPSC,
350 VPWidenIntrinsicSC,
351 VPWidenLoadEVLSC,
352 VPWidenLoadSC,
353 VPWidenStoreEVLSC,
354 VPWidenStoreSC,
355 VPWidenSC,
356 VPWidenSelectSC,
357 VPBlendSC,
358 VPHistogramSC,
359 // START: Phi-like recipes. Need to be kept together.
360 VPWidenPHISC,
361 VPPredInstPHISC,
362 // START: SubclassID for recipes that inherit VPHeaderPHIRecipe.
363 // VPHeaderPHIRecipe need to be kept together.
364 VPCanonicalIVPHISC,
365 VPActiveLaneMaskPHISC,
366 VPEVLBasedIVPHISC,
367 VPFirstOrderRecurrencePHISC,
368 VPWidenIntOrFpInductionSC,
369 VPWidenPointerInductionSC,
370 VPReductionPHISC,
371 // END: SubclassID for recipes that inherit VPHeaderPHIRecipe
372 // END: Phi-like recipes
373 VPFirstPHISC = VPWidenPHISC,
374 VPFirstHeaderPHISC = VPCanonicalIVPHISC,
375 VPLastHeaderPHISC = VPReductionPHISC,
376 VPLastPHISC = VPReductionPHISC,
377 };
378
379 VPDef(const unsigned char SC) : SubclassID(SC) {}
380
381 virtual ~VPDef() {
382 for (VPValue *D : make_early_inc_range(DefinedValues)) {
383 assert(D->Def == this &&
384 "all defined VPValues should point to the containing VPDef");
385 assert(D->getNumUsers() == 0 &&
386 "all defined VPValues should have no more users");
387 D->Def = nullptr;
388 delete D;
389 }
390 }
391
392 /// Returns the only VPValue defined by the VPDef. Can only be called for
393 /// VPDefs with a single defined value.
395 assert(DefinedValues.size() == 1 && "must have exactly one defined value");
396 assert(DefinedValues[0] && "defined value must be non-null");
397 return DefinedValues[0];
398 }
399 const VPValue *getVPSingleValue() const {
400 assert(DefinedValues.size() == 1 && "must have exactly one defined value");
401 assert(DefinedValues[0] && "defined value must be non-null");
402 return DefinedValues[0];
403 }
404
405 /// Returns the VPValue with index \p I defined by the VPDef.
406 VPValue *getVPValue(unsigned I) {
407 assert(DefinedValues[I] && "defined value must be non-null");
408 return DefinedValues[I];
409 }
410 const VPValue *getVPValue(unsigned I) const {
411 assert(DefinedValues[I] && "defined value must be non-null");
412 return DefinedValues[I];
413 }
414
415 /// Returns an ArrayRef of the values defined by the VPDef.
416 ArrayRef<VPValue *> definedValues() { return DefinedValues; }
417 /// Returns an ArrayRef of the values defined by the VPDef.
418 ArrayRef<VPValue *> definedValues() const { return DefinedValues; }
419
420 /// Returns the number of values defined by the VPDef.
421 unsigned getNumDefinedValues() const { return DefinedValues.size(); }
422
423 /// \return an ID for the concrete type of this object.
424 /// This is used to implement the classof checks. This should not be used
425 /// for any other purpose, as the values may change as LLVM evolves.
426 unsigned getVPDefID() const { return SubclassID; }
427
428#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
429 /// Dump the VPDef to stderr (for debugging).
430 void dump() const;
431
432 /// Each concrete VPDef prints itself.
433 virtual void print(raw_ostream &O, const Twine &Indent,
434 VPSlotTracker &SlotTracker) const = 0;
435#endif
436};
437
438} // namespace llvm
439
440#endif // LLVM_TRANSFORMS_VECTORIZE_VPLAN_VALUE_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
static void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
BlockVerifier::State From
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static void replaceAllUsesWith(Value *Old, Value *New, SmallPtrSet< BasicBlock *, 32 > &FreshBBs, bool IsHuge)
Replace all old uses with new ones, and push the updated BBs into FreshBBs.
#define LLVM_ABI_FOR_TEST
Definition: Compiler.h:218
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
iv Induction Variable Users
Definition: IVUsers.cpp:48
#define I(x, y, z)
Definition: MD5.cpp:58
mir Rename Register Operands
This file contains some templates that are useful if you are working with the STL at all.
raw_pwrite_stream & OS
This file defines the SmallVector class.
static const BasicSubtargetSubTypeKV * find(StringRef S, ArrayRef< BasicSubtargetSubTypeKV > A)
Find KV in array using binary search.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
This class represents an Operation in the Expression.
This class provides computation of slot numbers for LLVM Assembly writing.
Definition: AsmWriter.cpp:757
typename SuperClass::const_iterator const_iterator
Definition: SmallVector.h:579
typename SuperClass::iterator iterator
Definition: SmallVector.h:578
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
Definition: TinyPtrVector.h:29
void push_back(EltTy NewVal)
unsigned size() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:82
This class augments a recipe with a set of VPValues defined by the recipe.
Definition: VPlanValue.h:300
enum { VPBranchOnMaskSC, VPDerivedIVSC, VPExpandSCEVSC, VPExpressionSC, VPIRInstructionSC, VPInstructionSC, VPInterleaveSC, VPReductionEVLSC, VPReductionSC, VPPartialReductionSC, VPReplicateSC, VPScalarIVStepsSC, VPVectorPointerSC, VPVectorEndPointerSC, VPWidenCallSC, VPWidenCanonicalIVSC, VPWidenCastSC, VPWidenGEPSC, VPWidenIntrinsicSC, VPWidenLoadEVLSC, VPWidenLoadSC, VPWidenStoreEVLSC, VPWidenStoreSC, VPWidenSC, VPWidenSelectSC, VPBlendSC, VPHistogramSC, VPWidenPHISC, VPPredInstPHISC, VPCanonicalIVPHISC, VPActiveLaneMaskPHISC, VPEVLBasedIVPHISC, VPFirstOrderRecurrencePHISC, VPWidenIntOrFpInductionSC, VPWidenPointerInductionSC, VPReductionPHISC, VPFirstPHISC=VPWidenPHISC, VPFirstHeaderPHISC=VPCanonicalIVPHISC, VPLastHeaderPHISC=VPReductionPHISC, VPLastPHISC=VPReductionPHISC, } VPRecipeTy
An enumeration for keeping track of the concrete subclass of VPRecipeBase that is actually instantiat...
Definition: VPlanValue.h:377
void dump() const
Dump the VPDef to stderr (for debugging).
Definition: VPlan.cpp:116
unsigned getNumDefinedValues() const
Returns the number of values defined by the VPDef.
Definition: VPlanValue.h:421
virtual ~VPDef()
Definition: VPlanValue.h:381
ArrayRef< VPValue * > definedValues()
Returns an ArrayRef of the values defined by the VPDef.
Definition: VPlanValue.h:416
VPValue * getVPSingleValue()
Returns the only VPValue defined by the VPDef.
Definition: VPlanValue.h:394
const VPValue * getVPSingleValue() const
Definition: VPlanValue.h:399
ArrayRef< VPValue * > definedValues() const
Returns an ArrayRef of the values defined by the VPDef.
Definition: VPlanValue.h:418
virtual void print(raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const =0
Each concrete VPDef prints itself.
VPValue * getVPValue(unsigned I)
Returns the VPValue with index I defined by the VPDef.
Definition: VPlanValue.h:406
unsigned getVPDefID() const
Definition: VPlanValue.h:426
VPDef(const unsigned char SC)
Definition: VPlanValue.h:379
const VPValue * getVPValue(unsigned I) const
Definition: VPlanValue.h:410
A recipe to combine multiple recipes into a single 'expression' recipe, which should be considered a ...
Definition: VPlan.h:2854
VPInterleaveRecipe is a recipe for transforming an interleave group of load or stores into one wide l...
Definition: VPlan.h:2443
Helper type to provide functions to access incoming values and blocks for phi-like recipes.
Definition: VPlan.h:1233
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Definition: VPlan.h:391
This class can be used to assign names to VPValues.
Definition: VPlanHelpers.h:382
This class augments VPValue with operands which provide the inverse def-use edges from VPValue's user...
Definition: VPlanValue.h:197
void replaceUsesOfWith(VPValue *From, VPValue *To)
Replaces all uses of From in the VPUser with To.
Definition: VPlan.cpp:1434
void printOperands(raw_ostream &O, VPSlotTracker &SlotTracker) const
Print the operands to O.
Definition: VPlan.cpp:1446
operand_range operands()
Definition: VPlanValue.h:265
void setOperand(unsigned I, VPValue *New)
Definition: VPlanValue.h:241
VPUser & operator=(const VPUser &)=delete
unsigned getNumOperands() const
Definition: VPlanValue.h:235
SmallVectorImpl< VPValue * >::const_iterator const_operand_iterator
Definition: VPlanValue.h:257
const_operand_iterator op_begin() const
Definition: VPlanValue.h:262
operand_iterator op_end()
Definition: VPlanValue.h:263
const_operand_range operands() const
Definition: VPlanValue.h:266
operand_iterator op_begin()
Definition: VPlanValue.h:261
VPValue * getOperand(unsigned N) const
Definition: VPlanValue.h:236
VPUser(ArrayRef< VPValue * > Operands)
Definition: VPlanValue.h:216
VPUser(const VPUser &)=delete
VPUser()=delete
virtual bool onlyFirstLaneUsed(const VPValue *Op) const
Returns true if the VPUser only uses the first lane of operand Op.
Definition: VPlanValue.h:280
iterator_range< const_operand_iterator > const_operand_range
Definition: VPlanValue.h:259
void swapOperands()
Swap operands of the VPUser. It must have exactly 2 operands.
Definition: VPlanValue.h:248
SmallVectorImpl< VPValue * >::iterator operand_iterator
Definition: VPlanValue.h:256
virtual ~VPUser()
Definition: VPlanValue.h:225
virtual bool onlyFirstPartUsed(const VPValue *Op) const
Returns true if the VPUser only uses the first part of operand Op.
Definition: VPlanValue.h:288
const_operand_iterator op_end() const
Definition: VPlanValue.h:264
virtual bool usesScalars(const VPValue *Op) const
Returns true if the VPUser uses scalars of operand Op.
Definition: VPlanValue.h:272
iterator_range< operand_iterator > operand_range
Definition: VPlanValue.h:258
void addOperand(VPValue *Operand)
Definition: VPlanValue.h:230
bool hasDefiningRecipe() const
Returns true if this VPValue is defined by a recipe.
Definition: VPlanValue.h:166
VPValue(Value *UV=nullptr)
Create a live-in VPValue.
Definition: VPlanValue.h:70
unsigned getVPValueID() const
Definition: VPlanValue.h:103
void removeUser(VPUser &User)
Remove a single User from the list of users.
Definition: VPlanValue.h:117
SmallVectorImpl< VPUser * >::const_iterator const_user_iterator
Definition: VPlanValue.h:126
const_user_iterator user_begin() const
Definition: VPlanValue.h:131
void addUser(VPUser &User)
Definition: VPlanValue.h:114
bool hasMoreThanOneUniqueUser() const
Returns true if the value has more than one unique user.
Definition: VPlanValue.h:140
Value * getLiveInIRValue() const
Returns the underlying IR value, if this VPValue is defined outside the scope of VPlan.
Definition: VPlanValue.h:174
Value * getUnderlyingValue() const
Return the underlying Value attached to this VPValue.
Definition: VPlanValue.h:85
Value * UnderlyingVal
Definition: VPlanValue.h:61
VPValue(Value *UV, VPDef *Def)
Create a VPValue for a Def which defines multiple values.
Definition: VPlanValue.h:74
const_user_range users() const
Definition: VPlanValue.h:135
VPValue(const VPValue &)=delete
VPValue & operator=(const VPValue &)=delete
void setUnderlyingValue(Value *Val)
Definition: VPlanValue.h:184
SmallVectorImpl< VPUser * >::iterator user_iterator
Definition: VPlanValue.h:125
iterator_range< user_iterator > user_range
Definition: VPlanValue.h:127
const_user_iterator user_end() const
Definition: VPlanValue.h:133
VPValue(VPDef *Def, Value *UV=nullptr)
Create a VPValue for a Def which is a subclass of VPValue.
Definition: VPlanValue.h:72
user_iterator user_begin()
Definition: VPlanValue.h:130
unsigned getNumUsers() const
Definition: VPlanValue.h:113
user_iterator user_end()
Definition: VPlanValue.h:132
bool isLiveIn() const
Returns true if this VPValue is a live-in, i.e. defined outside the VPlan.
Definition: VPlanValue.h:169
user_range users()
Definition: VPlanValue.h:134
VPDef * Def
Pointer to the VPDef that defines this VPValue.
Definition: VPlanValue.h:65
iterator_range< const_user_iterator > const_user_range
Definition: VPlanValue.h:128
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
Definition: VPlan.h:3930
LLVM Value Representation.
Definition: Value.h:75
An efficient, type-erasing, non-owning reference to a callable.
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
iterator_range< early_inc_iterator_impl< detail::IterOfRange< RangeT > > > make_early_inc_range(RangeT &&Range)
Make a range that does early increment to allow mutation of the underlying range without disrupting i...
Definition: STLExtras.h:663
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
Definition: STLExtras.h:2147
DenseMap< VPValue *, Value * > VPValue2ValueTy
Definition: VPlanValue.h:191
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
Definition: APFixedPoint.h:312
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition: STLExtras.h:1916
DenseMap< Value *, VPValue * > Value2VPValueTy
Definition: VPlanValue.h:190
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:858
#define N