20#ifndef LLVM_TRANSFORMS_VECTORIZE_VPLAN_VALUE_H 
   21#define LLVM_TRANSFORMS_VECTORIZE_VPLAN_VALUE_H 
   37struct VPDoubleValueDef;
 
   55  const unsigned char SubclassID; 
 
  105#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 
  121    if (
I != Users.end())
 
 
  158  void replaceUsesWithIf(
 
  178           "VPValue is not a live-in; it is defined by a VPDef inside a VPlan");
 
 
  183  bool isDefinedOutsideLoopRegions() 
const;
 
 
  207  void removeOperand(
unsigned Idx) {
 
  209    Operands.erase(Operands.begin() + Idx);
 
  213#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 
  219    for (
VPValue *Operand : Operands)
 
 
  229      Op->removeUser(*
this);
 
 
  233    Operands.push_back(Operand);
 
 
  239    assert(
N < Operands.size() && 
"Operand index out of bounds");
 
 
  244    Operands[
I]->removeUser(*
this);
 
 
  251    assert(Operands.size() == 2 && 
"must have 2 operands to swap");
 
 
  276           "Op must be an operand of the recipe");
 
 
  284           "Op must be an operand of the recipe");
 
 
  292           "Op must be an operand of the recipe");
 
 
 
  306  const unsigned char SubclassID;
 
  312  void addDefinedValue(
VPValue *V) {
 
  314           "can only add VPValue already linked with this VPDef");
 
  315    DefinedValues.push_back(V);
 
  320  void removeDefinedValue(
VPValue *V) {
 
  321    assert(V->Def == 
this && 
"can only remove VPValue linked with this VPDef");
 
  323           "VPValue to remove must be in DefinedValues");
 
  344    VPPartialReductionSC,
 
  348    VPVectorEndPointerSC,
 
  350    VPWidenCanonicalIVSC,
 
  368    VPActiveLaneMaskPHISC,
 
  370    VPFirstOrderRecurrencePHISC,
 
  371    VPWidenIntOrFpInductionSC,
 
  372    VPWidenPointerInductionSC,
 
  376    VPFirstPHISC = VPWidenPHISC,
 
  377    VPFirstHeaderPHISC = VPCanonicalIVPHISC,
 
  378    VPLastHeaderPHISC = VPReductionPHISC,
 
  379    VPLastPHISC = VPReductionPHISC,
 
 
  382  VPDef(
const unsigned char SC) : SubclassID(SC) {}
 
  387             "all defined VPValues should point to the containing VPDef");
 
  388      assert(
D->getNumUsers() == 0 &&
 
  389             "all defined VPValues should have no more users");
 
 
  398    assert(DefinedValues.size() == 1 && 
"must have exactly one defined value");
 
  399    assert(DefinedValues[0] && 
"defined value must be non-null");
 
  400    return DefinedValues[0];
 
 
  403    assert(DefinedValues.size() == 1 && 
"must have exactly one defined value");
 
  404    assert(DefinedValues[0] && 
"defined value must be non-null");
 
  405    return DefinedValues[0];
 
 
  410    assert(DefinedValues[
I] && 
"defined value must be non-null");
 
  411    return DefinedValues[
I];
 
 
  414    assert(DefinedValues[
I] && 
"defined value must be non-null");
 
  415    return DefinedValues[
I];
 
 
  431#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 
 
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
 
This file defines the DenseMap class.
 
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...
 
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.
 
unsigned getVPDefID() const
 
VPDef(const unsigned char SC)
 
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...
 
const VPValue * getVPValue(unsigned I) const
 
A common base class for interleaved memory operations.
 
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.
 
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
 
virtual bool onlyFirstLaneUsed(const VPValue *Op) const
Returns true if the VPUser only uses the first lane of operand Op.
 
iterator_range< const_operand_iterator > const_operand_range
 
void swapOperands()
Swap operands of the VPUser. It must have exactly 2 operands.
 
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)
 
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.
 
VPValue(Value *UV=nullptr)
Create a live-in VPValue.
 
unsigned getVPValueID() const
 
VPRecipeBase * getDefiningRecipe()
Returns the recipe defining this VPValue or nullptr if it is not defined by a recipe,...
 
friend class VPExpressionRecipe
 
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
 
void addUser(VPUser &User)
 
bool hasMoreThanOneUniqueUser() const
Returns true if the value has more than one unique user.
 
Value * getLiveInIRValue() const
Returns the underlying IR value, if this VPValue is defined outside the scope of VPlan.
 
Value * getUnderlyingValue() const
Return the underlying Value attached to this VPValue.
 
Value * UnderlyingVal
Hold the underlying Value, if any, 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
 
@ VPVRecipeSC
A generic VPValue, like live-in values or defined by a recipe that defines multiple values.
 
VPValue(const unsigned char SC, Value *UV=nullptr, VPDef *Def=nullptr)
 
void setUnderlyingValue(Value *Val)
 
SmallVectorImpl< VPUser * >::iterator user_iterator
 
iterator_range< user_iterator > user_range
 
const_user_iterator user_end() const
 
VPValue(VPDef *Def, Value *UV=nullptr)
Create a VPValue for a Def which is a subclass of VPValue.
 
user_iterator user_begin()
 
friend class VPInterleaveBase
 
unsigned getNumUsers() const
 
bool isLiveIn() const
Returns true if this VPValue is a live-in, i.e. defined outside the VPlan.
 
friend struct VPDoubleValueDef
 
VPDef * Def
Pointer to the VPDef that defines this VPValue.
 
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)
 
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
 
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.
 
DenseMap< Value *, VPValue * > Value2VPValueTy
 
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.