LLVM 22.0.0git
|
A common base class for widening memory operations. More...
#include "Transforms/Vectorize/VPlan.h"
Public Member Functions | |
VPWidenMemoryRecipe * | clone () override |
Clone the current recipe. | |
bool | isConsecutive () const |
Return whether the loaded-from / stored-to addresses are consecutive. | |
bool | isReverse () const |
Return whether the consecutive loaded/stored addresses are in reverse order. | |
VPValue * | getAddr () const |
Return the address accessed by this recipe. | |
bool | isMasked () const |
Returns true if the recipe is masked. | |
VPValue * | getMask () const |
Return the mask used by this recipe. | |
void | execute (VPTransformState &State) override |
Generate the wide load/store. | |
InstructionCost | computeCost (ElementCount VF, VPCostContext &Ctx) const override |
Return the cost of this VPWidenMemoryRecipe. | |
Instruction & | getIngredient () const |
Public Member Functions inherited from llvm::VPRecipeBase | |
VPRecipeBase (const unsigned char SC, ArrayRef< VPValue * > Operands, DebugLoc DL=DebugLoc::getUnknown()) | |
virtual | ~VPRecipeBase ()=default |
VPBasicBlock * | getParent () |
const VPBasicBlock * | getParent () const |
InstructionCost | cost (ElementCount VF, VPCostContext &Ctx) |
Return the cost of this recipe, taking into account if the cost computation should be skipped and the ForceTargetInstructionCost flag. | |
void | insertBefore (VPRecipeBase *InsertPos) |
Insert an unlinked recipe into a basic block immediately before the specified recipe. | |
void | insertBefore (VPBasicBlock &BB, iplist< VPRecipeBase >::iterator IP) |
Insert an unlinked recipe into BB immediately before the insertion point IP ;. | |
void | insertAfter (VPRecipeBase *InsertPos) |
Insert an unlinked Recipe into a basic block immediately after the specified Recipe. | |
void | moveAfter (VPRecipeBase *MovePos) |
Unlink this recipe from its current VPBasicBlock and insert it into the VPBasicBlock that MovePos lives in, right after MovePos. | |
void | moveBefore (VPBasicBlock &BB, iplist< VPRecipeBase >::iterator I) |
Unlink this recipe and insert into BB before I. | |
void | removeFromParent () |
This method unlinks 'this' from the containing basic block, but does not delete it. | |
iplist< VPRecipeBase >::iterator | eraseFromParent () |
This method unlinks 'this' from the containing basic block and deletes it. | |
bool | mayHaveSideEffects () const |
Returns true if the recipe may have side-effects. | |
bool | isPhi () const |
Returns true for PHI-like recipes. | |
bool | mayReadFromMemory () const |
Returns true if the recipe may read from memory. | |
bool | mayWriteToMemory () const |
Returns true if the recipe may write to memory. | |
bool | mayReadOrWriteMemory () const |
Returns true if the recipe may read from or write to memory. | |
DebugLoc | getDebugLoc () const |
Returns the debug location of the recipe. | |
bool | isScalarCast () const |
Return true if the recipe is a scalar cast. | |
void | setDebugLoc (DebugLoc NewDL) |
Set the recipe's debug location to NewDL . | |
Public Member Functions inherited from llvm::ilist_node_with_parent< VPRecipeBase, VPBasicBlock > | |
VPRecipeBase * | getPrevNode () |
VPRecipeBase * | getNextNode () |
Get the next node, or nullptr for the list tail. | |
Public Member Functions inherited from llvm::ilist_node_impl< ilist_detail::compute_node_options< VPRecipeBase, Options... >::type > | |
self_iterator | getIterator () |
reverse_self_iterator | getReverseIterator () |
std::enable_if_t< T::is_sentinel_tracking_explicit, bool > | isSentinel () const |
Check whether this is the sentinel node. | |
Public Member Functions inherited from llvm::ilist_detail::node_parent_access< ilist_node_impl< ilist_detail::compute_node_options< VPRecipeBase, Options... >::type >, ilist_detail::compute_node_options< VPRecipeBase, Options... >::type::parent_ty > | |
const ilist_detail::compute_node_options< VPRecipeBase, Options... >::type::parent_ty * | getParent () const |
void | setParent (ilist_detail::compute_node_options< VPRecipeBase, Options... >::type::parent_ty *Parent) |
Public Member Functions inherited from llvm::VPDef | |
VPDef (const unsigned char SC) | |
virtual | ~VPDef () |
VPValue * | getVPSingleValue () |
Returns the only VPValue defined by the VPDef. | |
const VPValue * | getVPSingleValue () const |
VPValue * | getVPValue (unsigned I) |
Returns the VPValue with index I defined by the VPDef. | |
const VPValue * | getVPValue (unsigned I) const |
ArrayRef< VPValue * > | definedValues () |
Returns an ArrayRef of the values defined by the VPDef. | |
ArrayRef< VPValue * > | definedValues () const |
Returns an ArrayRef of the values defined by the VPDef. | |
unsigned | getNumDefinedValues () const |
Returns the number of values defined by the VPDef. | |
unsigned | getVPDefID () const |
void | dump () const |
Dump the VPDef to stderr (for debugging). | |
virtual void | print (raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const =0 |
Each concrete VPDef prints itself. | |
Public Member Functions inherited from llvm::VPUser | |
VPUser ()=delete | |
VPUser (const VPUser &)=delete | |
VPUser & | operator= (const VPUser &)=delete |
virtual | ~VPUser () |
void | addOperand (VPValue *Operand) |
unsigned | getNumOperands () const |
VPValue * | getOperand (unsigned N) const |
void | setOperand (unsigned I, VPValue *New) |
void | swapOperands () |
Swap operands of the VPUser. It must have exactly 2 operands. | |
void | replaceUsesOfWith (VPValue *From, VPValue *To) |
Replaces all uses of From in the VPUser with To . | |
operand_iterator | op_begin () |
const_operand_iterator | op_begin () const |
operand_iterator | op_end () |
const_operand_iterator | op_end () const |
operand_range | operands () |
const_operand_range | operands () const |
virtual bool | usesScalars (const VPValue *Op) const |
Returns true if the VPUser uses scalars of operand Op . | |
virtual bool | onlyFirstLaneUsed (const VPValue *Op) const |
Returns true if the VPUser only uses the first lane of operand Op . | |
virtual bool | onlyFirstPartUsed (const VPValue *Op) const |
Returns true if the VPUser only uses the first part of operand Op . | |
Public Member Functions inherited from llvm::VPIRMetadata | |
VPIRMetadata () | |
VPIRMetadata (Instruction &I) | |
Adds metatadata that can be preserved from the original instruction I . | |
VPIRMetadata (Instruction &I, LoopVersioning *LVer) | |
Adds metatadata that can be preserved from the original instruction I and noalias metadata guaranteed by runtime checks using LVer . | |
VPIRMetadata (const VPIRMetadata &Other) | |
Copy constructor for cloning. | |
VPIRMetadata & | operator= (const VPIRMetadata &Other) |
void | applyMetadata (Instruction &I) const |
Add all metadata to I . | |
void | addMetadata (unsigned Kind, MDNode *Node) |
Add metadata with kind Kind and Node . | |
void | intersect (const VPIRMetadata &MD) |
Intersect this VPIRMetada object with MD , keeping only metadata nodes that are common to both. |
Static Public Member Functions | |
static bool | classof (const VPRecipeBase *R) |
static bool | classof (const VPUser *U) |
Static Public Member Functions inherited from llvm::VPRecipeBase | |
static bool | classof (const VPDef *D) |
Method to support type inquiry through isa, cast, and dyn_cast. | |
static bool | classof (const VPUser *U) |
Protected Member Functions | |
void | setMask (VPValue *Mask) |
VPWidenMemoryRecipe (const char unsigned SC, Instruction &I, std::initializer_list< VPValue * > Operands, bool Consecutive, bool Reverse, const VPIRMetadata &Metadata, DebugLoc DL) | |
Protected Member Functions inherited from llvm::ilist_node_with_parent< VPRecipeBase, VPBasicBlock > | |
ilist_node_with_parent ()=default | |
Protected Member Functions inherited from llvm::ilist_node_impl< ilist_detail::compute_node_options< VPRecipeBase, Options... >::type > | |
ilist_node_impl ()=default | |
Protected Member Functions inherited from llvm::VPUser | |
void | printOperands (raw_ostream &O, VPSlotTracker &SlotTracker) const |
Print the operands to O . | |
VPUser (ArrayRef< VPValue * > Operands) |
Protected Attributes | |
Instruction & | Ingredient |
bool | Consecutive |
Whether the accessed addresses are consecutive. | |
bool | Reverse |
Whether the consecutive accessed addresses are in reverse order. | |
bool | IsMasked = false |
Whether the memory access is masked. |
Additional Inherited Members | |
Public Types inherited from llvm::VPDef | |
using | VPRecipeTy |
An enumeration for keeping track of the concrete subclass of VPRecipeBase that is actually instantiated. | |
Public Types inherited from llvm::VPUser | |
typedef SmallVectorImpl< VPValue * >::iterator | operand_iterator |
typedef SmallVectorImpl< VPValue * >::const_iterator | const_operand_iterator |
typedef iterator_range< operand_iterator > | operand_range |
typedef iterator_range< const_operand_iterator > | const_operand_range |
Protected Types inherited from llvm::ilist_node_impl< ilist_detail::compute_node_options< VPRecipeBase, Options... >::type > | |
using | self_iterator |
using | const_self_iterator |
using | reverse_self_iterator |
using | const_reverse_self_iterator |
A common base class for widening memory operations.
An optional mask can be provided as the last operand.
|
inlineprotected |
Definition at line 3150 of file VPlan.h.
References assert(), Consecutive, I, Ingredient, Reverse, llvm::VPIRMetadata::VPIRMetadata(), and llvm::VPRecipeBase::VPRecipeBase().
Referenced by clone(), llvm::VPWidenLoadEVLRecipe::VPWidenLoadEVLRecipe(), llvm::VPWidenLoadRecipe::VPWidenLoadRecipe(), llvm::VPWidenStoreEVLRecipe::VPWidenStoreEVLRecipe(), and llvm::VPWidenStoreRecipe::VPWidenStoreRecipe().
|
inlinestatic |
Definition at line 3164 of file VPlan.h.
References llvm::VPRecipeBase::VPRecipeBase().
Referenced by classof().
Definition at line 3171 of file VPlan.h.
References classof(), and llvm::dyn_cast().
|
inlineoverridevirtual |
Clone the current recipe.
Implements llvm::VPRecipeBase.
Reimplemented in llvm::VPWidenStoreRecipe.
Definition at line 3160 of file VPlan.h.
References llvm_unreachable, and VPWidenMemoryRecipe().
|
overridevirtual |
Return the cost of this VPWidenMemoryRecipe.
Reimplemented from llvm::VPRecipeBase.
Reimplemented in llvm::VPWidenStoreEVLRecipe.
Definition at line 3311 of file VPlanRecipes.cpp.
References assert(), llvm::cast(), Consecutive, getAddr(), llvm::getLoadStoreAlignment(), llvm::getLoadStorePointerOperand(), llvm::getLoadStoreType(), llvm::VPUser::getOperand(), Ingredient, llvm::isa(), IsMasked, llvm::vputils::isSingleScalar(), Ptr, Reverse, llvm::TargetTransformInfo::SK_Reverse, and llvm::toVectorTy().
Referenced by llvm::VPWidenLoadEVLRecipe::computeCost(), and llvm::VPWidenStoreEVLRecipe::computeCost().
|
inlineoverridevirtual |
Generate the wide load/store.
Implements llvm::VPRecipeBase.
Reimplemented in llvm::VPWidenStoreEVLRecipe, and llvm::VPWidenStoreRecipe.
Definition at line 3197 of file VPlan.h.
References llvm_unreachable.
|
inline |
Return the address accessed by this recipe.
Definition at line 3184 of file VPlan.h.
References llvm::VPUser::getOperand().
Referenced by llvm::VPWidenLoadRecipe::clone(), llvm::VPWidenStoreRecipe::clone(), computeCost(), llvm::VPWidenLoadEVLRecipe::execute(), llvm::VPWidenLoadRecipe::execute(), llvm::VPWidenStoreEVLRecipe::execute(), llvm::VPWidenStoreRecipe::execute(), llvm::VPWidenLoadEVLRecipe::onlyFirstLaneUsed(), llvm::VPWidenLoadRecipe::onlyFirstLaneUsed(), llvm::VPWidenStoreEVLRecipe::onlyFirstLaneUsed(), llvm::VPWidenStoreRecipe::onlyFirstLaneUsed(), and optimizeMaskToEVL().
|
inline |
Definition at line 3205 of file VPlan.h.
References Ingredient.
Referenced by llvm::VPWidenLoadEVLRecipe::VPWidenLoadEVLRecipe(), and llvm::VPWidenStoreEVLRecipe::VPWidenStoreEVLRecipe().
|
inline |
Return the mask used by this recipe.
Note that a full mask is represented by a nullptr.
Definition at line 3191 of file VPlan.h.
References llvm::VPUser::getNumOperands(), llvm::VPUser::getOperand(), and isMasked().
Referenced by llvm::VPWidenLoadEVLRecipe::execute(), llvm::VPWidenLoadRecipe::execute(), llvm::VPWidenStoreEVLRecipe::execute(), llvm::VPWidenStoreRecipe::execute(), and optimizeMaskToEVL().
|
inline |
Return whether the loaded-from / stored-to addresses are consecutive.
Definition at line 3177 of file VPlan.h.
References Consecutive.
Referenced by llvm::VPWidenLoadEVLRecipe::execute(), llvm::VPWidenLoadRecipe::execute(), llvm::VPWidenStoreEVLRecipe::execute(), llvm::VPWidenStoreRecipe::execute(), llvm::VPWidenLoadEVLRecipe::onlyFirstLaneUsed(), llvm::VPWidenLoadRecipe::onlyFirstLaneUsed(), llvm::VPWidenStoreEVLRecipe::onlyFirstLaneUsed(), and llvm::VPWidenStoreRecipe::onlyFirstLaneUsed().
|
inline |
|
inline |
Return whether the consecutive loaded/stored addresses are in reverse order.
Definition at line 3181 of file VPlan.h.
References Reverse.
Referenced by llvm::VPWidenLoadEVLRecipe::execute(), llvm::VPWidenLoadRecipe::execute(), llvm::VPWidenStoreEVLRecipe::execute(), and llvm::VPWidenStoreRecipe::execute().
|
inlineprotected |
Definition at line 3142 of file VPlan.h.
References addOperand(), assert(), and IsMasked.
|
protected |
Whether the accessed addresses are consecutive.
Definition at line 3134 of file VPlan.h.
Referenced by llvm::VPWidenLoadRecipe::clone(), llvm::VPWidenStoreRecipe::clone(), llvm::VPWidenLoadEVLRecipe::computeCost(), computeCost(), llvm::VPWidenStoreEVLRecipe::computeCost(), isConsecutive(), llvm::VPWidenLoadRecipe::VPWidenLoadRecipe(), VPWidenMemoryRecipe(), and llvm::VPWidenStoreRecipe::VPWidenStoreRecipe().
|
protected |
Definition at line 3131 of file VPlan.h.
Referenced by llvm::VPWidenLoadRecipe::clone(), llvm::VPWidenStoreRecipe::clone(), llvm::VPWidenLoadEVLRecipe::computeCost(), computeCost(), llvm::VPWidenStoreEVLRecipe::computeCost(), llvm::VPWidenLoadEVLRecipe::execute(), llvm::VPWidenLoadRecipe::execute(), llvm::VPWidenStoreEVLRecipe::execute(), llvm::VPWidenStoreRecipe::execute(), getIngredient(), and VPWidenMemoryRecipe().
|
protected |
Whether the memory access is masked.
Definition at line 3140 of file VPlan.h.
Referenced by llvm::VPWidenLoadEVLRecipe::computeCost(), computeCost(), llvm::VPWidenStoreEVLRecipe::computeCost(), isMasked(), and setMask().
|
protected |
Whether the consecutive accessed addresses are in reverse order.
Definition at line 3137 of file VPlan.h.
Referenced by llvm::VPWidenLoadRecipe::clone(), llvm::VPWidenStoreRecipe::clone(), llvm::VPWidenLoadEVLRecipe::computeCost(), computeCost(), llvm::VPWidenStoreEVLRecipe::computeCost(), llvm::VPWidenLoadRecipe::execute(), isReverse(), llvm::VPWidenLoadRecipe::VPWidenLoadRecipe(), VPWidenMemoryRecipe(), and llvm::VPWidenStoreRecipe::VPWidenStoreRecipe().