20#ifndef LLVM_TRANSFORMS_VECTORIZE_VPLAN_VALUE_H
21#define LLVM_TRANSFORMS_VECTORIZE_VPLAN_VALUE_H
54 const unsigned char SubclassID;
103#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
174 "VPValue is not a live-in; it is defined by a VPDef inside a VPlan");
179 "VPValue is not a live-in; it is defined by a VPDef inside a VPlan");
204#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
214 VPUser(std::initializer_list<VPValue *> Operands)
228 Op->removeUser(*
this);
266 "Op must be an operand of the recipe");
274 "Op must be an operand of the recipe");
282 "Op must be an operand of the recipe");
296 const unsigned char SubclassID;
302 void addDefinedValue(
VPValue *V) {
304 "can only add VPValue already linked with this VPDef");
310 void removeDefinedValue(
VPValue *V) {
311 assert(V->Def ==
this &&
"can only remove VPValue linked with this VPDef");
313 "VPValue to remove must be in DefinedValues");
336 VPReverseVectorPointerSC,
338 VPWidenCanonicalIVSC,
357 VPActiveLaneMaskPHISC,
359 VPFirstOrderRecurrencePHISC,
360 VPWidenIntOrFpInductionSC,
361 VPWidenPointerInductionSC,
366 VPFirstPHISC = VPWidenPHISC,
367 VPFirstHeaderPHISC = VPCanonicalIVPHISC,
368 VPLastHeaderPHISC = VPReductionPHISC,
369 VPLastPHISC = VPReductionPHISC,
372 VPDef(
const unsigned char SC) : SubclassID(SC) {}
377 "all defined VPValues should point to the containing VPDef");
378 assert(
D->getNumUsers() == 0 &&
379 "all defined VPValues should have no more users");
388 assert(DefinedValues.
size() == 1 &&
"must have exactly one defined value");
389 assert(DefinedValues[0] &&
"defined value must be non-null");
390 return DefinedValues[0];
393 assert(DefinedValues.
size() == 1 &&
"must have exactly one defined value");
394 assert(DefinedValues[0] &&
"defined value must be non-null");
395 return DefinedValues[0];
400 assert(DefinedValues[
I] &&
"defined value must be non-null");
401 return DefinedValues[
I];
404 assert(DefinedValues[
I] &&
"defined value must be non-null");
405 return DefinedValues[
I];
421#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
448 unsigned NextSlot = 0;
450 void assignName(
const VPValue *V);
451 void assignNames(
const VPlan &Plan);
This file defines the StringMap class.
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
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
mir Rename Register Operands
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallVector class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
This class represents an Operation in the Expression.
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.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
void push_back(EltTy NewVal)
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
VPlan-based builder utility analogous to IRBuilder.
This class augments a recipe with a set of VPValues defined by the recipe.
void dump() const
Dump the VPDef to stderr (for debugging).
unsigned getNumDefinedValues() const
Returns the number of values defined by the VPDef.
ArrayRef< VPValue * > definedValues()
Returns an ArrayRef of the values defined by the VPDef.
VPValue * getVPSingleValue()
Returns the only VPValue defined by the VPDef.
const VPValue * getVPSingleValue() const
ArrayRef< VPValue * > definedValues() const
Returns an ArrayRef of the values defined by the VPDef.
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.
enum { VPBranchOnMaskSC, VPDerivedIVSC, VPExpandSCEVSC, VPIRInstructionSC, VPInstructionSC, VPInterleaveSC, VPReductionEVLSC, VPReductionSC, VPReplicateSC, VPScalarCastSC, VPScalarIVStepsSC, VPVectorPointerSC, VPReverseVectorPointerSC, VPWidenCallSC, VPWidenCanonicalIVSC, VPWidenCastSC, VPWidenGEPSC, VPWidenIntrinsicSC, VPWidenLoadEVLSC, VPWidenLoadSC, VPWidenStoreEVLSC, VPWidenStoreSC, VPWidenSC, VPWidenEVLSC, VPWidenSelectSC, VPBlendSC, VPHistogramSC, VPWidenPHISC, VPPredInstPHISC, VPCanonicalIVPHISC, VPActiveLaneMaskPHISC, VPEVLBasedIVPHISC, VPFirstOrderRecurrencePHISC, VPWidenIntOrFpInductionSC, VPWidenPointerInductionSC, VPScalarPHISC, 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...
unsigned getVPDefID() const
VPDef(const unsigned char SC)
const VPValue * getVPValue(unsigned I) const
This is a concrete Recipe that models a single VPlan-level instruction.
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
This class can be used to assign names to VPValues.
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...
VPSlotTracker(const VPlan *Plan=nullptr)
This class augments VPValue with operands which provide the inverse def-use edges from VPValue's user...
void printOperands(raw_ostream &O, VPSlotTracker &SlotTracker) const
Print the operands to O.
VPUser(std::initializer_list< VPValue * > Operands)
void setOperand(unsigned I, VPValue *New)
VPUser & operator=(const VPUser &)=delete
unsigned getNumOperands() const
SmallVectorImpl< VPValue * >::const_iterator const_operand_iterator
const_operand_iterator op_begin() const
operand_iterator op_end()
const_operand_range operands() const
operand_iterator op_begin()
VPValue * getOperand(unsigned N) const
VPUser(ArrayRef< VPValue * > Operands)
VPUser(const VPUser &)=delete
virtual bool onlyFirstLaneUsed(const VPValue *Op) const
Returns true if the VPUser only uses the first lane of operand Op.
VPUser(iterator_range< IterT > Operands)
iterator_range< const_operand_iterator > const_operand_range
SmallVectorImpl< VPValue * >::iterator operand_iterator
virtual bool onlyFirstPartUsed(const VPValue *Op) const
Returns true if the VPUser only uses the first part of operand Op.
const_operand_iterator op_end() const
virtual bool usesScalars(const VPValue *Op) const
Returns true if the VPUser uses scalars of operand Op.
iterator_range< operand_iterator > operand_range
void addOperand(VPValue *Operand)
bool hasDefiningRecipe() const
Returns true if this VPValue is defined by a recipe.
VPValue(Value *UV=nullptr)
Create a live-in VPValue.
bool isDefinedOutsideLoopRegions() const
Returns true if the VPValue is defined outside any loop region.
unsigned getVPValueID() const
VPRecipeBase * getDefiningRecipe()
Returns the recipe defining this VPValue or nullptr if it is not defined by a recipe,...
void printAsOperand(raw_ostream &OS, VPSlotTracker &Tracker) const
void removeUser(VPUser &User)
Remove a single User from the list of users.
SmallVectorImpl< VPUser * >::const_iterator const_user_iterator
const_user_iterator user_begin() const
const Value * getLiveInIRValue() const
void addUser(VPUser &User)
bool hasMoreThanOneUniqueUser() const
Returns true if the value has more than one unique user.
Value * getUnderlyingValue() const
Return the underlying Value attached to this VPValue.
VPValue(Value *UV, VPDef *Def)
Create a VPValue for a Def which defines multiple values.
const_user_range users() const
VPValue(const VPValue &)=delete
VPValue & operator=(const VPValue &)=delete
void dump() const
Dump the value to stderr (for debugging).
void setUnderlyingValue(Value *Val)
SmallVectorImpl< VPUser * >::iterator user_iterator
iterator_range< user_iterator > user_range
const_user_iterator user_end() const
void print(raw_ostream &OS, VPSlotTracker &Tracker) const
void replaceAllUsesWith(VPValue *New)
VPValue(VPDef *Def, Value *UV=nullptr)
Create a VPValue for a Def which is a subclass of VPValue.
user_iterator user_begin()
unsigned getNumUsers() const
Value * getLiveInIRValue()
Returns the underlying IR value, if this VPValue is defined outside the scope of VPlan.
bool isLiveIn() const
Returns true if this VPValue is a live-in, i.e. defined outside the VPlan.
void replaceUsesWithIf(VPValue *New, llvm::function_ref< bool(VPUser &U, unsigned Idx)> ShouldReplace)
Go through the uses list for this VPValue and make each use point to New if the callback ShouldReplac...
VPDef * Def
Pointer to the VPDef that defines this VPValue.
@ VPVRecipeSC
A generic VPValue, like live-in values or defined by a recipe that defines multiple values.
iterator_range< const_user_iterator > const_user_range
VPlan models a candidate for vectorization, encoding various decisions take to produce efficient outp...
LLVM Value Representation.
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.
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.
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
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...
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
DenseMap< VPValue *, Value * > VPValue2ValueTy
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.
DenseMap< Value *, VPValue * > Value2VPValueTy