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");
216#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
229 template <
typename IterT>
241 Op->removeUser(*
this);
281 "Op must be an operand of the recipe");
289 "Op must be an operand of the recipe");
297 "Op must be an operand of the recipe");
311 const unsigned char SubclassID;
317 void addDefinedValue(
VPValue *V) {
319 "can only add VPValue already linked with this VPDef");
325 void removeDefinedValue(
VPValue *V) {
326 assert(V->Def ==
this &&
"can only remove VPValue linked with this VPDef");
328 "VPValue to remove must be in DefinedValues");
351 VPWidenCanonicalIVSC,
367 VPActiveLaneMaskPHISC,
369 VPFirstOrderRecurrencePHISC,
370 VPWidenIntOrFpInductionSC,
371 VPWidenPointerInductionSC,
375 VPFirstPHISC = VPWidenPHISC,
376 VPFirstHeaderPHISC = VPCanonicalIVPHISC,
377 VPLastHeaderPHISC = VPReductionPHISC,
378 VPLastPHISC = VPReductionPHISC,
381 VPDef(
const unsigned char SC) : SubclassID(SC) {}
386 "all defined VPValues should point to the containing VPDef");
387 assert(
D->getNumUsers() == 0 &&
388 "all defined VPValues should have no more users");
397 assert(DefinedValues.
size() == 1 &&
"must have exactly one defined value");
398 assert(DefinedValues[0] &&
"defined value must be non-null");
399 return DefinedValues[0];
402 assert(DefinedValues.
size() == 1 &&
"must have exactly one defined value");
403 assert(DefinedValues[0] &&
"defined value must be non-null");
404 return DefinedValues[0];
409 assert(DefinedValues[
I] &&
"defined value must be non-null");
410 return DefinedValues[
I];
413 assert(DefinedValues[
I] &&
"defined value must be non-null");
414 return DefinedValues[
I];
430#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
457 unsigned NextSlot = 0;
459 void assignName(
const VPValue *V);
460 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, VPInstructionSC, VPInterleaveSC, VPReductionEVLSC, VPReductionSC, VPReplicateSC, VPScalarCastSC, VPScalarIVStepsSC, VPVectorPointerSC, VPWidenCallSC, VPWidenCanonicalIVSC, VPWidenCastSC, VPWidenGEPSC, VPWidenLoadEVLSC, VPWidenLoadSC, VPWidenStoreEVLSC, VPWidenStoreSC, VPWidenSC, VPWidenSelectSC, VPBlendSC, 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...
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.
void setOperand(unsigned I, VPValue *New)
VPUser & operator=(const VPUser &)=delete
unsigned getNumOperands() const
SmallVectorImpl< VPValue * >::const_iterator const_operand_iterator
VPUser(ArrayRef< VPValue * > Operands, VPUserID ID)
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(const VPUser &)=delete
virtual bool onlyFirstLaneUsed(const VPValue *Op) const
Returns true if the VPUser only uses the first lane of operand Op.
VPUserID
Subclass identifier (for isa/dyn_cast).
iterator_range< const_operand_iterator > const_operand_range
VPUser(iterator_range< IterT > Operands, VPUserID ID)
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)
VPUser(std::initializer_list< VPValue * > Operands, VPUserID ID)
VPUserID getVPUserID() const
bool hasDefiningRecipe() const
Returns true if this VPValue is defined by a recipe.
VPValue(Value *UV=nullptr)
Create a live-in VPValue.
@ VPVRecipeSC
A generic VPValue, like live-in values or defined by a recipe that defines multiple values.
bool hasMoreThanOneUniqueUser()
Returns true if the value has more than one unique user.
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)
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.
iterator_range< const_user_iterator > const_user_range
bool isDefinedOutsideVectorRegions() const
Returns true if the VPValue is defined outside any vector regions, i.e.
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