20#ifndef LLVM_TRANSFORMS_VECTORIZE_VPLAN_VALUE_H
21#define LLVM_TRANSFORMS_VECTORIZE_VPLAN_VALUE_H
36struct VPDoubleValueDef;
53 const unsigned char SubclassID;
60 VPValue(
const unsigned char SC,
Value *UV =
nullptr)
61 : SubclassID(SC), UnderlyingVal(UV) {}
75 Value *getLiveInIRValue()
const;
89 assert(Users.empty() &&
"trying to delete a VPValue with remaining users");
97#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
113 if (
I != Users.end())
157 void replaceUsesWithIf(
170 bool isDefinedOutsideLoopRegions()
const;
174 assert(!UnderlyingVal &&
"Underlying Value is already set.");
180 const VPRecipeBase &R);
186 assert(UV &&
"VPIRValue requires an underlying IR value");
237 void removeOperand(
unsigned Idx) {
239 Operands.erase(Operands.begin() + Idx);
243#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
249 for (
VPValue *Operand : Operands)
259 Op->removeUser(*
this);
263 Operands.push_back(Operand);
269 assert(
N < Operands.size() &&
"Operand index out of bounds");
274 Operands[
I]->removeUser(*
this);
281 assert(Operands.size() == 2 &&
"must have 2 operands to swap");
306 "Op must be an operand of the recipe");
314 "Op must be an operand of the recipe");
322 "Op must be an operand of the recipe");
337 const unsigned char SubclassID;
345 "can only add VPValue already linked with this VPDef");
346 DefinedValues.push_back(V);
352 assert(V->Def ==
this &&
"can only remove VPValue linked with this VPDef");
354 "VPValue to remove must be in DefinedValues");
378 VPVectorEndPointerSC,
380 VPWidenCanonicalIVSC,
398 VPActiveLaneMaskPHISC,
400 VPFirstOrderRecurrencePHISC,
401 VPWidenIntOrFpInductionSC,
402 VPWidenPointerInductionSC,
406 VPFirstPHISC = VPWidenPHISC,
407 VPFirstHeaderPHISC = VPCanonicalIVPHISC,
408 VPLastHeaderPHISC = VPReductionPHISC,
409 VPLastPHISC = VPReductionPHISC,
412 VPDef(
const unsigned char SC) : SubclassID(SC) {}
417 "all defined VPValues should point to the containing VPDef");
418 assert(
D->getNumUsers() == 0 &&
419 "all defined VPValues should have no more users");
427 assert(DefinedValues.size() == 1 &&
"must have exactly one defined value");
428 assert(DefinedValues[0] &&
"defined value must be non-null");
429 return DefinedValues[0];
432 assert(DefinedValues.size() == 1 &&
"must have exactly one defined value");
433 assert(DefinedValues[0] &&
"defined value must be non-null");
434 return DefinedValues[0];
439 assert(DefinedValues[
I] &&
"defined value must be non-null");
440 return DefinedValues[
I];
443 assert(DefinedValues[
I] &&
"defined value must be non-null");
444 return DefinedValues[
I];
460#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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
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),...
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...
The instances of the Type class are immutable: once they are created, they are never changed.
This class augments a recipe with a set of VPValues defined by the recipe.
LLVM_ABI_FOR_TEST void dump() const
Dump the VPDef to stderr (for debugging).
unsigned getNumDefinedValues() const
Returns the number of values defined by the VPDef.
enum { VPBranchOnMaskSC, VPDerivedIVSC, VPExpandSCEVSC, VPExpressionSC, VPIRInstructionSC, VPInstructionSC, VPInterleaveEVLSC, VPInterleaveSC, VPReductionEVLSC, VPReductionSC, 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...
friend class VPRecipeValue
VPValue * getVPSingleValue()
Returns the only VPValue defined by the VPDef.
const VPValue * getVPSingleValue() const
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.
ArrayRef< VPRecipeValue * > definedValues() const
Returns an ArrayRef of the values defined by the VPDef.
ArrayRef< VPRecipeValue * > definedValues()
Returns an ArrayRef of the values defined by the VPDef.
unsigned getVPDefID() const
VPDef(const unsigned char SC)
const VPValue * getVPValue(unsigned I) const
Helper type to provide functions to access incoming values and blocks for phi-like recipes.
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
A VPValue defined by a recipe that produces one or more values.
VPRecipeValue(VPDef *Def, Value *UV=nullptr)
static bool classof(const VPValue *V)
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...
void replaceUsesOfWith(VPValue *From, VPValue *To)
Replaces all uses of From in the VPUser with To.
void printOperands(raw_ostream &O, VPSlotTracker &SlotTracker) const
Print the operands to O.
void setOperand(unsigned I, VPValue *New)
VPUser & operator=(const VPUser &)=delete
friend class VPPhiAccessors
Grant access to removeOperand for VPPhiAccessors, the only supported user.
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
iterator_range< const_operand_iterator > const_operand_range
virtual bool usesFirstPartOnly(const VPValue *Op) const
Returns true if the VPUser only uses the first part of operand Op.
void swapOperands()
Swap operands of the VPUser. It must have exactly 2 operands.
SmallVectorImpl< VPValue * >::iterator operand_iterator
virtual bool usesFirstLaneOnly(const VPValue *Op) const
Returns true if the VPUser only uses the first lane 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)
This is the base class of the VPlan Def/Use graph, used for modeling the data flow into,...
bool hasDefiningRecipe() const
Returns true if this VPValue is defined by a recipe.
unsigned getVPValueID() const
VPRecipeBase * getDefiningRecipe()
Returns the recipe defining this VPValue or nullptr if it is not defined by a recipe,...
void removeUser(VPUser &User)
Remove a single User from the list of users.
SmallVectorImpl< VPUser * >::const_iterator const_user_iterator
friend class VPRecipeValue
const_user_iterator user_begin() 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.
const_user_range users() const
VPValue(const VPValue &)=delete
VPValue & operator=(const VPValue &)=delete
@ VPVSymbolicSC
A live-in VPValue wrapping an IR Value.
@ VPVRecipeValueSC
A symbolic live-in VPValue without IR backing.
const VPUser * getSingleUser() const
void setUnderlyingValue(Value *Val)
SmallVectorImpl< VPUser * >::iterator user_iterator
iterator_range< user_iterator > user_range
const_user_iterator user_end() const
VPUser * getSingleUser()
Return the single user of this value, or nullptr if there is not exactly one user.
user_iterator user_begin()
unsigned getNumUsers() const
friend struct VPSymbolicValue
friend struct VPDoubleValueDef
iterator_range< const_user_iterator > const_user_range
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.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
void erase(Container &C, ValueType V)
Wrapper function to remove a value from a container:
SmallVector< ValueTypeFromRangeType< R >, Size > to_vector(R &&Range)
Given a range of type R, iterate the entire range and return a SmallVector with elements of the vecto...
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.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Value * getValue() const
Returns the underlying IR value.
static bool classof(const VPValue *V)
Type * getType() const
Returns the type of the underlying IR value.
static bool classof(const VPValue *V)