LLVM 22.0.0git
|
A specialization of VPInstruction augmenting it with a dedicated result type, to be used when the opcode and operands of the VPInstruction don't directly determine the result type. More...
#include "Transforms/Vectorize/VPlan.h"
Public Member Functions | |
VPInstructionWithType (unsigned Opcode, ArrayRef< VPValue * > Operands, Type *ResultTy, const VPIRFlags &Flags, DebugLoc DL, const Twine &Name="") | |
VPInstruction * | clone () override |
Clone the current recipe. | |
void | execute (VPTransformState &State) override |
Generate the instruction. | |
InstructionCost | computeCost (ElementCount VF, VPCostContext &Ctx) const override |
Return the cost of this VPInstruction. | |
Type * | getResultType () const |
void | print (raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const override |
Print the recipe. | |
Public Member Functions inherited from llvm::VPInstruction | |
VPInstruction (unsigned Opcode, ArrayRef< VPValue * > Operands, DebugLoc DL=DebugLoc::getUnknown(), const Twine &Name="") | |
VPInstruction (unsigned Opcode, ArrayRef< VPValue * > Operands, const VPIRFlags &Flags, DebugLoc DL=DebugLoc::getUnknown(), const Twine &Name="") | |
unsigned | getOpcode () const |
LLVM_DUMP_METHOD void | dump () const |
Print the VPInstruction to dbgs() (for debugging). | |
bool | hasResult () const |
bool | opcodeMayReadOrWriteFromMemory () const |
Returns true if the underlying opcode may read from or write to memory. | |
bool | onlyFirstLaneUsed (const VPValue *Op) const override |
Returns true if the recipe only uses the first lane of operand Op . | |
bool | onlyFirstPartUsed (const VPValue *Op) const override |
Returns true if the recipe only uses the first part of operand Op . | |
bool | isVectorToScalar () const |
Returns true if this VPInstruction produces a scalar value from a vector, e.g. | |
bool | isSingleScalar () const |
Returns true if this VPInstruction's operands are single scalars and the result is also a single scalar. | |
StringRef | getName () const |
Returns the symbolic name assigned to the VPInstruction. | |
Public Member Functions inherited from llvm::VPRecipeWithIRFlags | |
VPRecipeWithIRFlags (const unsigned char SC, ArrayRef< VPValue * > Operands, DebugLoc DL=DebugLoc::getUnknown()) | |
VPRecipeWithIRFlags (const unsigned char SC, ArrayRef< VPValue * > Operands, Instruction &I) | |
VPRecipeWithIRFlags (const unsigned char SC, ArrayRef< VPValue * > Operands, const VPIRFlags &Flags, DebugLoc DL=DebugLoc::getUnknown()) | |
std::optional< InstructionCost > | getCostForRecipeWithOpcode (unsigned Opcode, ElementCount VF, VPCostContext &Ctx) const |
Compute the cost for this recipe for VF , using Opcode and Ctx . | |
Public Member Functions inherited from llvm::VPSingleDefRecipe | |
VPSingleDefRecipe (const unsigned char SC, ArrayRef< VPValue * > Operands, DebugLoc DL=DebugLoc::getUnknown()) | |
VPSingleDefRecipe (const unsigned char SC, ArrayRef< VPValue * > Operands, Value *UV, DebugLoc DL=DebugLoc::getUnknown()) | |
Instruction * | getUnderlyingInstr () |
Returns the underlying instruction. | |
const Instruction * | getUnderlyingInstr () const |
LLVM_DUMP_METHOD void | dump () const |
Print this VPSingleDefRecipe to dbgs() (for debugging). | |
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 . | |
Public Member Functions inherited from llvm::VPValue | |
Value * | getUnderlyingValue () const |
Return the underlying Value attached to this VPValue. | |
VPValue (const VPValue &)=delete | |
VPValue & | operator= (const VPValue &)=delete |
virtual | ~VPValue () |
unsigned | getVPValueID () const |
void | printAsOperand (raw_ostream &OS, VPSlotTracker &Tracker) const |
void | print (raw_ostream &OS, VPSlotTracker &Tracker) const |
void | dump () const |
Dump the value to stderr (for debugging). | |
unsigned | getNumUsers () const |
void | addUser (VPUser &User) |
void | removeUser (VPUser &User) |
Remove a single User from the list of users. | |
user_iterator | user_begin () |
const_user_iterator | user_begin () const |
user_iterator | user_end () |
const_user_iterator | user_end () const |
user_range | users () |
const_user_range | users () const |
bool | hasMoreThanOneUniqueUser () const |
Returns true if the value has more than one unique user. | |
void | replaceAllUsesWith (VPValue *New) |
void | replaceUsesWithIf (VPValue *New, llvm::function_ref< bool(VPUser &U, unsigned Idx)> ShouldReplace) |
Go through the uses list for this VPValue and make each use point to New if the callback ShouldReplace returns true for the given use specified by a pair of (VPUser, the use index). | |
VPRecipeBase * | getDefiningRecipe () |
Returns the recipe defining this VPValue or nullptr if it is not defined by a recipe, i.e. | |
const VPRecipeBase * | getDefiningRecipe () const |
bool | hasDefiningRecipe () const |
Returns true if this VPValue is defined by a recipe. | |
bool | isLiveIn () const |
Returns true if this VPValue is a live-in, i.e. defined outside the VPlan. | |
Value * | getLiveInIRValue () const |
Returns the underlying IR value, if this VPValue is defined outside the scope of VPlan. | |
bool | isDefinedOutsideLoopRegions () const |
Returns true if the VPValue is defined outside any loop. | |
void | setUnderlyingValue (Value *Val) |
Public Member Functions inherited from llvm::VPIRFlags | |
VPIRFlags () | |
VPIRFlags (Instruction &I) | |
VPIRFlags (CmpInst::Predicate Pred) | |
VPIRFlags (WrapFlagsTy WrapFlags) | |
VPIRFlags (FastMathFlags FMFs) | |
VPIRFlags (DisjointFlagsTy DisjointFlags) | |
VPIRFlags (NonNegFlagsTy NonNegFlags) | |
VPIRFlags (GEPNoWrapFlags GEPFlags) | |
void | transferFlags (VPIRFlags &Other) |
void | intersectFlags (const VPIRFlags &Other) |
Only keep flags also present in Other . | |
void | dropPoisonGeneratingFlags () |
Drop all poison-generating flags. | |
void | applyFlags (Instruction &I) const |
Apply the IR flags to I . | |
CmpInst::Predicate | getPredicate () const |
void | setPredicate (CmpInst::Predicate Pred) |
GEPNoWrapFlags | getGEPNoWrapFlags () const |
bool | hasPredicate () const |
Returns true if the recipe has a comparison predicate. | |
bool | hasFastMathFlags () const |
Returns true if the recipe has fast-math flags. | |
LLVM_ABI_FOR_TEST FastMathFlags | getFastMathFlags () const |
bool | hasNonNegFlag () const |
Returns true if the recipe has non-negative flag. | |
bool | isNonNeg () const |
bool | hasNoUnsignedWrap () const |
bool | hasNoSignedWrap () const |
bool | isDisjoint () const |
bool | flagsValidForOpcode (unsigned Opcode) const |
Returns true if the set flags are valid for Opcode . | |
void | printFlags (raw_ostream &O) const |
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 *R) |
Static Public Member Functions inherited from llvm::VPRecipeWithIRFlags | |
static bool | classof (const VPRecipeBase *R) |
static bool | classof (const VPUser *U) |
static bool | classof (const VPValue *V) |
static bool | classof (const VPSingleDefRecipe *U) |
Static Public Member Functions inherited from llvm::VPSingleDefRecipe | |
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) |
A specialization of VPInstruction augmenting it with a dedicated result type, to be used when the opcode and operands of the VPInstruction don't directly determine the result type.
Note that there is no separate VPDef ID for VPInstructionWithType; it shares the same ID as VPInstruction and is distinguished purely by the opcode.
|
inlinestatic |
Definition at line 1198 of file VPlan.h.
References llvm::dyn_cast(), llvm::VPInstruction::StepVector, llvm::VPInstruction::VScale, and llvm::VPInstruction::WideIVStep.
Definition at line 1216 of file VPlan.h.
References llvm::cast(), and llvm::isa().
|
inlineoverridevirtual |
Clone the current recipe.
Reimplemented from llvm::VPInstruction.
Definition at line 1220 of file VPlan.h.
References llvm::VPRecipeBase::getDebugLoc(), llvm::VPInstruction::getName(), llvm::VPInstruction::getOpcode(), getResultType(), llvm::VPValue::getUnderlyingValue(), Operands, llvm::VPUser::operands(), llvm::VPInstruction::VPInstruction(), and VPInstructionWithType().
|
inlineoverridevirtual |
Return the cost of this VPInstruction.
Reimplemented from llvm::VPInstruction.
|
overridevirtual |
Generate the instruction.
TODO: We currently execute only per-part unless a specific instance is provided.
Reimplemented from llvm::VPInstruction.
Definition at line 1431 of file VPlanRecipes.cpp.
References llvm::VectorType::get(), llvm::VPRecipeBase::getDebugLoc(), llvm::VPInstruction::getOpcode(), llvm::VPUser::getOperand(), llvm::VPRecipeBase::isScalarCast(), llvm_unreachable, llvm::VPInstruction::StepVector, and llvm::VPInstruction::VScale.
|
inline |
|
overridevirtual |
Print the recipe.
Reimplemented from llvm::VPInstruction.
Definition at line 1459 of file VPlanRecipes.cpp.
References assert(), llvm::VPInstruction::getOpcode(), llvm::Instruction::getOpcodeName(), llvm::Instruction::isCast(), llvm::VPInstruction::isSingleScalar(), llvm::VPValue::printAsOperand(), llvm::VPUser::printOperands(), llvm::VPInstruction::StepVector, llvm::VPInstruction::VScale, and llvm::VPInstruction::WideIVStep.