LLVM 22.0.0git
|
A recipe representing a sequence of load -> update -> store as part of a histogram operation. More...
#include "Transforms/Vectorize/VPlan.h"
Public Member Functions | |
VPHistogramRecipe (unsigned Opcode, ArrayRef< VPValue * > Operands, DebugLoc DL=DebugLoc::getUnknown()) | |
~VPHistogramRecipe () override=default | |
VPHistogramRecipe * | clone () override |
Clone the current recipe. | |
VP_CLASSOF_IMPL (VPDef::VPHistogramSC) | |
void | execute (VPTransformState &State) override |
Produce a vectorized histogram operation. | |
InstructionCost | computeCost (ElementCount VF, VPCostContext &Ctx) const override |
Return the cost of this VPHistogramRecipe. | |
unsigned | getOpcode () const |
VPValue * | getMask () const |
Return the mask operand if one was provided, or a null pointer if all lanes should be executed unconditionally. | |
void | print (raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const override |
Print the recipe. | |
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). | |
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 . |
A recipe representing a sequence of load -> update -> store as part of a histogram operation.
This means there may be aliasing between vector lanes, which is handled by the llvm.experimental.vector.histogram family of intrinsics. The only update operations currently supported are 'add' and 'sub' where the other term is loop-invariant.
|
inline |
Definition at line 1687 of file VPlan.h.
References llvm::DebugLoc::getUnknown(), and llvm::VPRecipeBase::VPRecipeBase().
Referenced by clone().
|
overridedefault |
|
inlineoverridevirtual |
Clone the current recipe.
Implements llvm::VPRecipeBase.
Definition at line 1693 of file VPlan.h.
References llvm::VPRecipeBase::getDebugLoc(), llvm::VPUser::operands(), and VPHistogramRecipe().
|
overridevirtual |
Return the cost of this VPHistogramRecipe.
Reimplemented from llvm::VPRecipeBase.
Definition at line 1875 of file VPlanRecipes.cpp.
References assert(), llvm::dyn_cast(), llvm::VectorType::get(), llvm::Type::getInt1Ty(), llvm::VPValue::getLiveInIRValue(), llvm::VPUser::getOperand(), llvm::Type::getVoidTy(), llvm::ConstantInt::getZExtValue(), llvm::VPValue::isLiveIn(), llvm::ElementCount::isVector(), and llvm::TargetTransformInfo::TCC_Free.
|
overridevirtual |
Produce a vectorized histogram operation.
Implements llvm::VPRecipeBase.
Definition at line 1846 of file VPlanRecipes.cpp.
References llvm::Address, assert(), llvm::cast(), llvm::VectorType::getElementCount(), getMask(), llvm::VPUser::getOperand(), and llvm::Value::getType().
|
inline |
Return the mask operand if one was provided, or a null pointer if all lanes should be executed unconditionally.
Definition at line 1710 of file VPlan.h.
References llvm::VPUser::getNumOperands(), and llvm::VPUser::getOperand().
|
inline |
|
overridevirtual |
Print the recipe.
Implements llvm::VPDef.
Definition at line 1912 of file VPlanRecipes.cpp.
References assert(), getMask(), llvm::VPUser::getOperand(), and llvm::VPValue::printAsOperand().
llvm::VPHistogramRecipe::VP_CLASSOF_IMPL | ( | VPDef::VPHistogramSC | ) |