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;
42class VPPhiAccessors;
43
44/// This is the base class of the VPlan Def/Use graph, used for modeling the
45/// data 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 VPInterleaveBase;
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.
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.
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(); }
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 bool hasOneUse() const { return getNumUsers() == 1; }
152
153 /// Return the single user of this value, or nullptr if there is not exactly
154 /// one user.
155 VPUser *getSingleUser() { return hasOneUse() ? *user_begin() : nullptr; }
156 const VPUser *getSingleUser() const {
157 return hasOneUse() ? *user_begin() : nullptr;
158 }
159
160 void replaceAllUsesWith(VPValue *New);
161
162 /// Go through the uses list for this VPValue and make each use point to \p
163 /// New if the callback ShouldReplace returns true for the given use specified
164 /// by a pair of (VPUser, the use index).
165 void replaceUsesWithIf(
166 VPValue *New,
167 llvm::function_ref<bool(VPUser &U, unsigned Idx)> ShouldReplace);
168
169 /// Returns the recipe defining this VPValue or nullptr if it is not defined
170 /// by a recipe, i.e. is a live-in.
171 VPRecipeBase *getDefiningRecipe();
172 const VPRecipeBase *getDefiningRecipe() const;
173
174 /// Returns true if this VPValue is defined by a recipe.
175 bool hasDefiningRecipe() const { return getDefiningRecipe(); }
176
177 /// Returns true if this VPValue is a live-in, i.e. defined outside the VPlan.
178 bool isLiveIn() const { return !hasDefiningRecipe(); }
179
180 /// Returns the underlying IR value, if this VPValue is defined outside the
181 /// scope of VPlan. Returns nullptr if the VPValue is defined by a VPDef
182 /// inside a VPlan.
184 assert(isLiveIn() &&
185 "VPValue is not a live-in; it is defined by a VPDef inside a VPlan");
186 return getUnderlyingValue();
187 }
188
189 /// Returns true if the VPValue is defined outside any loop.
190 bool isDefinedOutsideLoopRegions() const;
191
192 // Set \p Val as the underlying Value of this VPValue.
194 assert(!UnderlyingVal && "Underlying Value is already set.");
195 UnderlyingVal = Val;
196 }
197};
198
201
203 const VPRecipeBase &R);
204
205/// This class augments VPValue with operands which provide the inverse def-use
206/// edges from VPValue's users to their defs.
207class VPUser {
208 /// Grant access to removeOperand for VPPhiAccessors, the only supported user.
209 friend class VPPhiAccessors;
210
212
213 /// Removes the operand at index \p Idx. This also removes the VPUser from the
214 /// use-list of the operand.
215 void removeOperand(unsigned Idx) {
216 getOperand(Idx)->removeUser(*this);
217 Operands.erase(Operands.begin() + Idx);
218 }
219
220protected:
221#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
222 /// Print the operands to \p O.
224#endif
225
227 for (VPValue *Operand : Operands)
228 addOperand(Operand);
229 }
230
231public:
232 VPUser() = delete;
233 VPUser(const VPUser &) = delete;
234 VPUser &operator=(const VPUser &) = delete;
235 virtual ~VPUser() {
236 for (VPValue *Op : operands())
237 Op->removeUser(*this);
238 }
239
240 void addOperand(VPValue *Operand) {
241 Operands.push_back(Operand);
242 Operand->addUser(*this);
243 }
244
245 unsigned getNumOperands() const { return Operands.size(); }
246 inline VPValue *getOperand(unsigned N) const {
247 assert(N < Operands.size() && "Operand index out of bounds");
248 return Operands[N];
249 }
250
251 void setOperand(unsigned I, VPValue *New) {
252 Operands[I]->removeUser(*this);
253 Operands[I] = New;
254 New->addUser(*this);
255 }
256
257 /// Swap operands of the VPUser. It must have exactly 2 operands.
259 assert(Operands.size() == 2 && "must have 2 operands to swap");
260 std::swap(Operands[0], Operands[1]);
261 }
262
263 /// Replaces all uses of \p From in the VPUser with \p To.
264 void replaceUsesOfWith(VPValue *From, VPValue *To);
265
270
271 operand_iterator op_begin() { return Operands.begin(); }
272 const_operand_iterator op_begin() const { return Operands.begin(); }
273 operand_iterator op_end() { return Operands.end(); }
274 const_operand_iterator op_end() const { return Operands.end(); }
279
280 /// Returns true if the VPUser uses scalars of operand \p Op. Conservatively
281 /// returns if only first (scalar) lane is used, as default.
282 virtual bool usesScalars(const VPValue *Op) const {
284 "Op must be an operand of the recipe");
285 return usesFirstLaneOnly(Op);
286 }
287
288 /// Returns true if the VPUser only uses the first lane of operand \p Op.
289 /// Conservatively returns false.
290 virtual bool usesFirstLaneOnly(const VPValue *Op) const {
292 "Op must be an operand of the recipe");
293 return false;
294 }
295
296 /// Returns true if the VPUser only uses the first part of operand \p Op.
297 /// Conservatively returns false.
298 virtual bool usesFirstPartOnly(const VPValue *Op) const {
300 "Op must be an operand of the recipe");
301 return false;
302 }
303};
304
305/// This class augments a recipe with a set of VPValues defined by the recipe.
306/// It allows recipes to define zero, one or multiple VPValues. A VPDef owns
307/// the VPValues it defines and is responsible for deleting its defined values.
308/// Single-value VPDefs that also inherit from VPValue must make sure to inherit
309/// from VPDef before VPValue.
310class VPDef {
311 friend class VPValue;
312
313 /// Subclass identifier (for isa/dyn_cast).
314 const unsigned char SubclassID;
315
316 /// The VPValues defined by this VPDef.
317 TinyPtrVector<VPValue *> DefinedValues;
318
319 /// Add \p V as a defined value by this VPDef.
320 void addDefinedValue(VPValue *V) {
321 assert(V->Def == this &&
322 "can only add VPValue already linked with this VPDef");
323 DefinedValues.push_back(V);
324 }
325
326 /// Remove \p V from the values defined by this VPDef. \p V must be a defined
327 /// value of this VPDef.
328 void removeDefinedValue(VPValue *V) {
329 assert(V->Def == this && "can only remove VPValue linked with this VPDef");
330 assert(is_contained(DefinedValues, V) &&
331 "VPValue to remove must be in DefinedValues");
332 llvm::erase(DefinedValues, V);
333 V->Def = nullptr;
334 }
335
336public:
337 /// An enumeration for keeping track of the concrete subclass of VPRecipeBase
338 /// that is actually instantiated. Values of this enumeration are kept in the
339 /// SubclassID field of the VPRecipeBase objects. They are used for concrete
340 /// type identification.
341 using VPRecipeTy = enum {
342 VPBranchOnMaskSC,
343 VPDerivedIVSC,
344 VPExpandSCEVSC,
345 VPExpressionSC,
346 VPIRInstructionSC,
347 VPInstructionSC,
348 VPInterleaveEVLSC,
349 VPInterleaveSC,
350 VPReductionEVLSC,
351 VPReductionSC,
352 VPPartialReductionSC,
353 VPReplicateSC,
354 VPScalarIVStepsSC,
355 VPVectorPointerSC,
356 VPVectorEndPointerSC,
357 VPWidenCallSC,
358 VPWidenCanonicalIVSC,
359 VPWidenCastSC,
360 VPWidenGEPSC,
361 VPWidenIntrinsicSC,
362 VPWidenLoadEVLSC,
363 VPWidenLoadSC,
364 VPWidenStoreEVLSC,
365 VPWidenStoreSC,
366 VPWidenSC,
367 VPWidenSelectSC,
368 VPBlendSC,
369 VPHistogramSC,
370 // START: Phi-like recipes. Need to be kept together.
371 VPWidenPHISC,
372 VPPredInstPHISC,
373 // START: SubclassID for recipes that inherit VPHeaderPHIRecipe.
374 // VPHeaderPHIRecipe need to be kept together.
375 VPCanonicalIVPHISC,
376 VPActiveLaneMaskPHISC,
377 VPEVLBasedIVPHISC,
378 VPFirstOrderRecurrencePHISC,
379 VPWidenIntOrFpInductionSC,
380 VPWidenPointerInductionSC,
381 VPReductionPHISC,
382 // END: SubclassID for recipes that inherit VPHeaderPHIRecipe
383 // END: Phi-like recipes
384 VPFirstPHISC = VPWidenPHISC,
385 VPFirstHeaderPHISC = VPCanonicalIVPHISC,
386 VPLastHeaderPHISC = VPReductionPHISC,
387 VPLastPHISC = VPReductionPHISC,
388 };
389
390 VPDef(const unsigned char SC) : SubclassID(SC) {}
391
392 virtual ~VPDef() {
393 for (VPValue *D : make_early_inc_range(DefinedValues)) {
394 assert(D->Def == this &&
395 "all defined VPValues should point to the containing VPDef");
396 assert(D->getNumUsers() == 0 &&
397 "all defined VPValues should have no more users");
398 D->Def = nullptr;
399 delete D;
400 }
401 }
402
403 /// Returns the only VPValue defined by the VPDef. Can only be called for
404 /// VPDefs with a single defined value.
406 assert(DefinedValues.size() == 1 && "must have exactly one defined value");
407 assert(DefinedValues[0] && "defined value must be non-null");
408 return DefinedValues[0];
409 }
410 const VPValue *getVPSingleValue() const {
411 assert(DefinedValues.size() == 1 && "must have exactly one defined value");
412 assert(DefinedValues[0] && "defined value must be non-null");
413 return DefinedValues[0];
414 }
415
416 /// Returns the VPValue with index \p I defined by the VPDef.
417 VPValue *getVPValue(unsigned I) {
418 assert(DefinedValues[I] && "defined value must be non-null");
419 return DefinedValues[I];
420 }
421 const VPValue *getVPValue(unsigned I) const {
422 assert(DefinedValues[I] && "defined value must be non-null");
423 return DefinedValues[I];
424 }
425
426 /// Returns an ArrayRef of the values defined by the VPDef.
427 ArrayRef<VPValue *> definedValues() { return DefinedValues; }
428 /// Returns an ArrayRef of the values defined by the VPDef.
429 ArrayRef<VPValue *> definedValues() const { return DefinedValues; }
430
431 /// Returns the number of values defined by the VPDef.
432 unsigned getNumDefinedValues() const { return DefinedValues.size(); }
433
434 /// \return an ID for the concrete type of this object.
435 /// This is used to implement the classof checks. This should not be used
436 /// for any other purpose, as the values may change as LLVM evolves.
437 unsigned getVPDefID() const { return SubclassID; }
438
439#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
440 /// Dump the VPDef to stderr (for debugging).
441 LLVM_ABI_FOR_TEST void dump() const;
442
443 /// Each concrete VPDef prints itself.
444 virtual void print(raw_ostream &O, const Twine &Indent,
445 VPSlotTracker &SlotTracker) const = 0;
446#endif
447};
448
449} // namespace llvm
450
451#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)
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
This file defines the DenseMap class.
#define I(x, y, z)
Definition MD5.cpp:57
This file contains some templates that are useful if you are working with the STL at all.
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:40
This class provides computation of slot numbers for LLVM Assembly writing.
typename SuperClass::const_iterator const_iterator
typename SuperClass::iterator iterator
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
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:310
LLVM_ABI_FOR_TEST void dump() const
Dump the VPDef to stderr (for debugging).
Definition VPlan.cpp:122
unsigned getNumDefinedValues() const
Returns the number of values defined by the VPDef.
Definition VPlanValue.h:432
virtual ~VPDef()
Definition VPlanValue.h:392
ArrayRef< VPValue * > definedValues()
Returns an ArrayRef of the values defined by the VPDef.
Definition VPlanValue.h:427
VPValue * getVPSingleValue()
Returns the only VPValue defined by the VPDef.
Definition VPlanValue.h:405
const VPValue * getVPSingleValue() const
Definition VPlanValue.h:410
ArrayRef< VPValue * > definedValues() const
Returns an ArrayRef of the values defined by the VPDef.
Definition VPlanValue.h:429
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:417
friend class VPValue
Definition VPlanValue.h:311
unsigned getVPDefID() const
Definition VPlanValue.h:437
VPDef(const unsigned char SC)
Definition VPlanValue.h:390
enum { VPBranchOnMaskSC, VPDerivedIVSC, VPExpandSCEVSC, VPExpressionSC, VPIRInstructionSC, VPInstructionSC, VPInterleaveEVLSC, 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:341
const VPValue * getVPValue(unsigned I) const
Definition VPlanValue.h:421
A common base class for interleaved memory operations.
Definition VPlan.h:2560
Helper type to provide functions to access incoming values and blocks for phi-like recipes.
Definition VPlan.h:1308
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
Definition VPlan.h:386
This class can be used to assign names to VPValues.
This class augments VPValue with operands which provide the inverse def-use edges from VPValue's user...
Definition VPlanValue.h:207
void replaceUsesOfWith(VPValue *From, VPValue *To)
Replaces all uses of From in the VPUser with To.
Definition VPlan.cpp:1408
void printOperands(raw_ostream &O, VPSlotTracker &SlotTracker) const
Print the operands to O.
Definition VPlan.cpp:1420
operand_range operands()
Definition VPlanValue.h:275
void setOperand(unsigned I, VPValue *New)
Definition VPlanValue.h:251
VPUser & operator=(const VPUser &)=delete
friend class VPPhiAccessors
Grant access to removeOperand for VPPhiAccessors, the only supported user.
Definition VPlanValue.h:209
unsigned getNumOperands() const
Definition VPlanValue.h:245
SmallVectorImpl< VPValue * >::const_iterator const_operand_iterator
Definition VPlanValue.h:267
const_operand_iterator op_begin() const
Definition VPlanValue.h:272
operand_iterator op_end()
Definition VPlanValue.h:273
const_operand_range operands() const
Definition VPlanValue.h:276
operand_iterator op_begin()
Definition VPlanValue.h:271
VPValue * getOperand(unsigned N) const
Definition VPlanValue.h:246
VPUser(ArrayRef< VPValue * > Operands)
Definition VPlanValue.h:226
VPUser(const VPUser &)=delete
VPUser()=delete
iterator_range< const_operand_iterator > const_operand_range
Definition VPlanValue.h:269
virtual bool usesFirstPartOnly(const VPValue *Op) const
Returns true if the VPUser only uses the first part of operand Op.
Definition VPlanValue.h:298
void swapOperands()
Swap operands of the VPUser. It must have exactly 2 operands.
Definition VPlanValue.h:258
SmallVectorImpl< VPValue * >::iterator operand_iterator
Definition VPlanValue.h:266
virtual ~VPUser()
Definition VPlanValue.h:235
virtual bool usesFirstLaneOnly(const VPValue *Op) const
Returns true if the VPUser only uses the first lane of operand Op.
Definition VPlanValue.h:290
const_operand_iterator op_end() const
Definition VPlanValue.h:274
virtual bool usesScalars(const VPValue *Op) const
Returns true if the VPUser uses scalars of operand Op.
Definition VPlanValue.h:282
iterator_range< operand_iterator > operand_range
Definition VPlanValue.h:268
void addOperand(VPValue *Operand)
Definition VPlanValue.h:240
This is the base class of the VPlan Def/Use graph, used for modeling the data flow into,...
Definition VPlanValue.h:48
bool hasDefiningRecipe() const
Returns true if this VPValue is defined by a recipe.
Definition VPlanValue.h:175
VPValue(Value *UV=nullptr)
Create a live-in VPValue.
Definition VPlanValue.h:70
unsigned getVPValueID() const
Definition VPlanValue.h:103
VPRecipeBase * getDefiningRecipe()
Returns the recipe defining this VPValue or nullptr if it is not defined by a recipe,...
Definition VPlan.cpp:131
friend class VPExpressionRecipe
Definition VPlanValue.h:53
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:183
friend class VPDef
Definition VPlanValue.h:49
Value * getUnderlyingValue() const
Return the underlying Value attached to this VPValue.
Definition VPlanValue.h:85
Value * UnderlyingVal
Hold the underlying Value, if any, attached to this VPValue.
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
@ VPVRecipeSC
A generic VPValue, like live-in values or defined by a recipe that defines multiple values.
Definition VPlanValue.h:92
bool hasOneUse() const
Definition VPlanValue.h:151
const VPUser * getSingleUser() const
Definition VPlanValue.h:156
VPValue(const unsigned char SC, Value *UV=nullptr, VPDef *Def=nullptr)
Definition VPlan.cpp:94
void setUnderlyingValue(Value *Val)
Definition VPlanValue.h:193
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
VPUser * getSingleUser()
Return the single user of this value, or nullptr if there is not exactly one user.
Definition VPlanValue.h:155
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
friend class VPInterleaveBase
Definition VPlanValue.h:51
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:178
friend struct VPDoubleValueDef
Definition VPlanValue.h:50
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
friend class VPlan
Definition VPlanValue.h:52
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.
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:632
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
Definition STLExtras.h:2128
DenseMap< VPValue *, Value * > VPValue2ValueTy
Definition VPlanValue.h:200
DWARFExpression::Operation Op
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1897
DenseMap< Value *, VPValue * > Value2VPValueTy
Definition VPlanValue.h:199
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:869
#define N