LLVM 22.0.0git
|
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions. More...
#include "Transforms/Vectorize/VPlan.h"
Public Member Functions | |
VPRecipeBase (const unsigned char SC, ArrayRef< VPValue * > Operands, DebugLoc DL=DebugLoc::getUnknown()) | |
virtual | ~VPRecipeBase ()=default |
virtual VPRecipeBase * | clone ()=0 |
Clone the current recipe. | |
VPBasicBlock * | getParent () |
const VPBasicBlock * | getParent () const |
virtual void | execute (VPTransformState &State)=0 |
The method which generates the output IR instructions that correspond to this VPRecipe, thereby "executing" the VPlan. | |
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 . | |
![]() | |
VPRecipeBase * | getPrevNode () |
const VPRecipeBase * | getPrevNode () const |
Get the previous node, or nullptr for the list head. | |
VPRecipeBase * | getNextNode () |
Get the next node, or nullptr for the list tail. | |
const VPRecipeBase * | getNextNode () const |
Get the next node, or nullptr for the list tail. | |
![]() | |
self_iterator | getIterator () |
const_self_iterator | getIterator () const |
reverse_self_iterator | getReverseIterator () |
const_reverse_self_iterator | getReverseIterator () const |
std::enable_if_t< T::is_sentinel_tracking_explicit, bool > | isSentinel () const |
Check whether this is the sentinel node. | |
![]() | |
const ParentTy * | getParent () const |
ParentTy * | getParent () |
void | setParent (ParentTy *Parent) |
![]() | |
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. | |
![]() | |
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 . | |
Static Public Member Functions | |
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 | |
virtual InstructionCost | computeCost (ElementCount VF, VPCostContext &Ctx) const |
Compute the cost of this recipe either using a recipe's specialized implementation or using the legacy cost model and the underlying instructions. | |
![]() | |
ilist_node_with_parent ()=default | |
![]() | |
ilist_node_impl ()=default | |
![]() | |
void | printOperands (raw_ostream &O, VPSlotTracker &SlotTracker) const |
Print the operands to O . | |
VPUser (ArrayRef< VPValue * > Operands) | |
Friends | |
class | VPBlockUtils |
Additional Inherited Members | |
![]() | |
using | VPRecipeTy = enum { VPBranchOnMaskSC, VPDerivedIVSC, VPExpandSCEVSC, VPExpressionSC, VPIRInstructionSC, VPInstructionSC, 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, } |
An enumeration for keeping track of the concrete subclass of VPRecipeBase that is actually instantiated. | |
![]() | |
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 |
![]() | |
using | self_iterator = typename ilist_select_iterator_type< OptionsT::has_iterator_bits, ilist_detail::compute_node_options< T, Options... >::type, false, false >::type |
using | const_self_iterator = typename ilist_select_iterator_type< OptionsT::has_iterator_bits, ilist_detail::compute_node_options< T, Options... >::type, false, true >::type |
using | reverse_self_iterator = typename ilist_select_iterator_type< OptionsT::has_iterator_bits, ilist_detail::compute_node_options< T, Options... >::type, true, false >::type |
using | const_reverse_self_iterator = typename ilist_select_iterator_type< OptionsT::has_iterator_bits, ilist_detail::compute_node_options< T, Options... >::type, true, true >::type |
VPRecipeBase is a base class modeling a sequence of one or more output IR instructions.
VPRecipeBase owns the VPValues it defines through VPDef and is responsible for deleting its defined values. Single-value recipes must inherit from VPSingleDef instead of inheriting from both VPRecipeBase and VPValue separately.
|
virtualdefault |
|
pure virtual |
Clone the current recipe.
Implemented in llvm::VPInstruction, llvm::VPInstructionWithType, llvm::VPPhi, llvm::VPIRInstruction, llvm::VPWidenRecipe, llvm::VPWidenCastRecipe, llvm::VPWidenIntrinsicRecipe, llvm::VPWidenCallRecipe, llvm::VPHistogramRecipe, llvm::VPWidenSelectRecipe, llvm::VPWidenGEPRecipe, llvm::VPVectorEndPointerRecipe, llvm::VPVectorPointerRecipe, llvm::VPWidenIntOrFpInductionRecipe, llvm::VPWidenPointerInductionRecipe, llvm::VPWidenPHIRecipe, llvm::VPFirstOrderRecurrencePHIRecipe, llvm::VPReductionPHIRecipe, llvm::VPBlendRecipe, llvm::VPInterleaveRecipe, llvm::VPReductionRecipe, llvm::VPPartialReductionRecipe, llvm::VPReductionEVLRecipe, llvm::VPReplicateRecipe, llvm::VPBranchOnMaskRecipe, llvm::VPExpressionRecipe, llvm::VPPredInstPHIRecipe, llvm::VPWidenMemoryRecipe, llvm::VPWidenLoadRecipe, llvm::VPWidenStoreRecipe, llvm::VPExpandSCEVRecipe, llvm::VPCanonicalIVPHIRecipe, llvm::VPActiveLaneMaskPHIRecipe, llvm::VPEVLBasedIVPHIRecipe, llvm::VPWidenCanonicalIVRecipe, llvm::VPDerivedIVRecipe, llvm::VPScalarIVStepsRecipe, and llvm::VPSingleDefRecipe.
|
protectedvirtual |
Compute the cost of this recipe either using a recipe's specialized implementation or using the legacy cost model and the underlying instructions.
Reimplemented in llvm::VPInstruction, llvm::VPInstructionWithType, llvm::VPIRInstruction, llvm::VPWidenRecipe, llvm::VPWidenCastRecipe, llvm::VPWidenIntrinsicRecipe, llvm::VPWidenCallRecipe, llvm::VPHistogramRecipe, llvm::VPWidenSelectRecipe, llvm::VPWidenGEPRecipe, llvm::VPVectorEndPointerRecipe, llvm::VPVectorPointerRecipe, llvm::VPHeaderPHIRecipe, llvm::VPFirstOrderRecurrencePHIRecipe, llvm::VPBlendRecipe, llvm::VPInterleaveRecipe, llvm::VPReductionRecipe, llvm::VPPartialReductionRecipe, llvm::VPReplicateRecipe, llvm::VPBranchOnMaskRecipe, llvm::VPExpressionRecipe, llvm::VPPredInstPHIRecipe, llvm::VPWidenMemoryRecipe, llvm::VPWidenLoadEVLRecipe, llvm::VPWidenStoreEVLRecipe, llvm::VPExpandSCEVRecipe, llvm::VPCanonicalIVPHIRecipe, llvm::VPEVLBasedIVPHIRecipe, llvm::VPWidenCanonicalIVRecipe, llvm::VPDerivedIVRecipe, and llvm::VPScalarIVStepsRecipe.
Definition at line 280 of file VPlanRecipes.cpp.
References llvm_unreachable.
Referenced by cost().
InstructionCost VPRecipeBase::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.
Also takes care of printing the cost for debugging.
Definition at line 250 of file VPlanRecipes.cpp.
References computeCost(), llvm::dbgs(), llvm::VPDef::dump(), llvm::ForceTargetInstructionCost, llvm::InstructionCost::isValid(), llvm::ElementCount::isVector(), LLVM_DEBUG, and llvm::VPCostContext::skipCostComputation().
iplist< VPRecipeBase >::iterator VPRecipeBase::eraseFromParent | ( | ) |
This method unlinks 'this' from the containing basic block and deletes it.
Definition at line 234 of file VPlanRecipes.cpp.
References assert(), llvm::iplist_impl< IntrusiveListT, TraitsT >::erase(), llvm::ilist_node_impl< ilist_detail::compute_node_options< T, Options... >::type >::getIterator(), getParent(), and llvm::VPBasicBlock::getRecipeList().
Referenced by llvm::VPlanTransforms::addActiveLaneMask(), addCanonicalIVRecipes(), addVPLaneMaskPhiAndUpdateExitBranch(), llvm::VPlanTransforms::canonicalizeEVLLoops(), llvm::VPlanTransforms::createInterleaveGroups(), createReplicateRegion(), llvm::VPlanTransforms::handleMaxMinNumReductions(), llvm::VPlanTransforms::handleUncountableEarlyExit(), llvm::VPlanTransforms::introduceMasksAndLinearize(), preparePlanForMainVectorLoop(), removeRedundantCanonicalIVs(), and llvm::VPlanTransforms::replicateByVF().
|
pure virtual |
The method which generates the output IR instructions that correspond to this VPRecipe, thereby "executing" the VPlan.
Implemented in llvm::VPInstruction, llvm::VPInstructionWithType, llvm::VPPhi, llvm::VPIRInstruction, llvm::VPIRPhi, llvm::VPWidenRecipe, llvm::VPWidenCastRecipe, llvm::VPWidenIntrinsicRecipe, llvm::VPWidenCallRecipe, llvm::VPHistogramRecipe, llvm::VPWidenSelectRecipe, llvm::VPWidenGEPRecipe, llvm::VPVectorEndPointerRecipe, llvm::VPVectorPointerRecipe, llvm::VPWidenIntOrFpInductionRecipe, llvm::VPWidenPointerInductionRecipe, llvm::VPWidenPHIRecipe, llvm::VPFirstOrderRecurrencePHIRecipe, llvm::VPReductionPHIRecipe, llvm::VPBlendRecipe, llvm::VPInterleaveRecipe, llvm::VPReductionRecipe, llvm::VPPartialReductionRecipe, llvm::VPReductionEVLRecipe, llvm::VPReplicateRecipe, llvm::VPBranchOnMaskRecipe, llvm::VPExpressionRecipe, llvm::VPPredInstPHIRecipe, llvm::VPWidenMemoryRecipe, llvm::VPWidenLoadRecipe, llvm::VPWidenLoadEVLRecipe, llvm::VPWidenStoreRecipe, llvm::VPWidenStoreEVLRecipe, llvm::VPExpandSCEVRecipe, llvm::VPCanonicalIVPHIRecipe, llvm::VPActiveLaneMaskPHIRecipe, llvm::VPEVLBasedIVPHIRecipe, llvm::VPWidenCanonicalIVRecipe, llvm::VPDerivedIVRecipe, llvm::VPScalarIVStepsRecipe, llvm::VPRecipeWithIRFlags, llvm::VPHeaderPHIRecipe, and llvm::VPWidenInductionRecipe.
|
inline |
Returns the debug location of the recipe.
Definition at line 479 of file VPlan.h.
References DL.
Referenced by addCanonicalIVRecipes(), addResumePhiRecipeForInduction(), llvm::VPlanTransforms::canonicalizeEVLLoops(), llvm::VPInstructionWithType::clone(), llvm::VPWidenIntrinsicRecipe::clone(), llvm::VPHistogramRecipe::clone(), llvm::VPVectorEndPointerRecipe::clone(), llvm::VPVectorPointerRecipe::clone(), llvm::VPWidenIntOrFpInductionRecipe::clone(), llvm::VPWidenPointerInductionRecipe::clone(), llvm::VPCanonicalIVPHIRecipe::clone(), llvm::VPActiveLaneMaskPHIRecipe::clone(), llvm::VPInstructionWithType::execute(), llvm::VPPhi::execute(), expandVPWidenIntOrFpInduction(), legalizeAndOptimizeInductions(), optimizeMaskToEVL(), llvm::VPInstruction::print(), and scalarizeInstruction().
|
inline |
Definition at line 412 of file VPlan.h.
Referenced by llvm::VPlanTransforms::adjustFixedOrderRecurrences(), llvm::VPlanTransforms::canonicalizeEVLLoops(), llvm::VPInstruction::dump(), eraseFromParent(), llvm::VPPhi::execute(), llvm::VPIRPhi::execute(), llvm::VPFirstOrderRecurrencePHIRecipe::execute(), llvm::VPReductionPHIRecipe::execute(), llvm::VPActiveLaneMaskPHIRecipe::execute(), expandVPWidenIntOrFpInduction(), llvm::VPPhiAccessors::getIncomingBlock(), llvm::VPSlotTracker::getOrCreateName(), hoistPreviousBeforeFORUsers(), insertAfter(), insertBefore(), llvm::VPWidenIntOrFpInductionRecipe::isCanonical(), isDefinedInsideLoopRegions(), removeFromParent(), scalarizeInstruction(), llvm::VPBuilder::setInsertPoint(), sinkScalarOperands(), and transformRecipestoEVLRecipes().
|
inline |
void VPRecipeBase::insertAfter | ( | VPRecipeBase * | InsertPos | ) |
Insert an unlinked Recipe into a basic block immediately after the specified Recipe.
Definition at line 221 of file VPlanRecipes.cpp.
References assert(), llvm::ilist_node_impl< OptionsT >::getIterator(), getParent(), and llvm::VPBasicBlock::insert().
Referenced by llvm::VPlanTransforms::materializeBuildVectors(), and moveAfter().
void VPRecipeBase::insertBefore | ( | VPBasicBlock & | BB, |
iplist< VPRecipeBase >::iterator | IP | ||
) |
Insert an unlinked recipe into BB
immediately before the insertion point IP
;.
Definition at line 214 of file VPlanRecipes.cpp.
References assert(), llvm::VPBasicBlock::end(), I, and llvm::VPBasicBlock::insert().
void VPRecipeBase::insertBefore | ( | VPRecipeBase * | InsertPos | ) |
Insert an unlinked recipe into a basic block immediately before the specified recipe.
Definition at line 207 of file VPlanRecipes.cpp.
References assert(), llvm::ilist_node_impl< OptionsT >::getIterator(), getParent(), and llvm::VPBasicBlock::insert().
Referenced by llvm::VPlanTransforms::expandSCEVs(), moveBefore(), optimizeMaskToEVL(), sinkScalarOperands(), transformRecipestoEVLRecipes(), llvm::VPlanTransforms::truncateToMinimalBitwidths(), llvm::VPlanTransforms::tryToConvertVPInstructionsToVPRecipes(), tryToCreateAbstractReductionRecipe(), and tryToMatchAndCreateMulAccumulateReduction().
bool VPRecipeBase::isPhi | ( | ) | const |
Returns true for PHI-like recipes.
Definition at line 285 of file VPlanRecipes.cpp.
References llvm::VPDef::getVPDefID().
bool VPRecipeBase::isScalarCast | ( | ) | const |
Return true if the recipe is a scalar cast.
Definition at line 290 of file VPlanRecipes.cpp.
References llvm::Instruction::isCast().
Referenced by llvm::VPInstructionWithType::execute(), and llvm::VPInstruction::isSingleScalar().
bool VPRecipeBase::mayHaveSideEffects | ( | ) | const |
Returns true if the recipe may have side-effects.
Definition at line 149 of file VPlanRecipes.cpp.
References assert(), llvm::Function::doesNotThrow(), llvm::VPDef::getVPDefID(), llvm::VPDef::getVPSingleValue(), I, mayHaveSideEffects(), mayWriteToMemory(), and llvm::Function::willReturn().
Referenced by hoistPreviousBeforeFORUsers(), mayHaveSideEffects(), and sinkScalarOperands().
bool VPRecipeBase::mayReadFromMemory | ( | ) | const |
Returns true if the recipe may read from memory.
Definition at line 101 of file VPlanRecipes.cpp.
References assert(), llvm::VPDef::getVPDefID(), llvm::VPDef::getVPSingleValue(), and I.
Referenced by hoistPreviousBeforeFORUsers().
|
inline |
Returns true if the recipe may read from or write to memory.
Definition at line 474 of file VPlan.h.
Referenced by sinkScalarOperands().
bool VPRecipeBase::mayWriteToMemory | ( | ) | const |
Returns true if the recipe may write to memory.
Definition at line 49 of file VPlanRecipes.cpp.
References assert(), llvm::VPDef::getVPDefID(), llvm::VPDef::getVPSingleValue(), and I.
Referenced by mayHaveSideEffects().
void VPRecipeBase::moveAfter | ( | VPRecipeBase * | MovePos | ) |
Unlink this recipe from its current VPBasicBlock and insert it into the VPBasicBlock that MovePos lives in, right after MovePos.
Definition at line 239 of file VPlanRecipes.cpp.
References insertAfter(), and removeFromParent().
Referenced by llvm::VPlanTransforms::handleMaxMinNumReductions().
void VPRecipeBase::moveBefore | ( | VPBasicBlock & | BB, |
iplist< VPRecipeBase >::iterator | I | ||
) |
Unlink this recipe and insert into BB before I.
Definition at line 244 of file VPlanRecipes.cpp.
References I, insertBefore(), and removeFromParent().
Referenced by preparePlanForMainVectorLoop(), and sinkScalarOperands().
void VPRecipeBase::removeFromParent | ( | ) |
This method unlinks 'this' from the containing basic block, but does not delete it.
Definition at line 228 of file VPlanRecipes.cpp.
References assert(), llvm::ilist_node_impl< ilist_detail::compute_node_options< T, Options... >::type >::getIterator(), getParent(), llvm::VPBasicBlock::getRecipeList(), and llvm::iplist_impl< IntrusiveListT, TraitsT >::remove().
Referenced by moveAfter(), and moveBefore().
|
inline |
|
friend |