LLVM 22.0.0git
|
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph. More...
#include "Transforms/Vectorize/VPlan.h"
Public Types | |
using | RecipeListTy = iplist< VPRecipeBase > |
using | iterator = RecipeListTy::iterator |
Instruction iterators... | |
using | const_iterator = RecipeListTy::const_iterator |
using | reverse_iterator = RecipeListTy::reverse_iterator |
using | const_reverse_iterator = RecipeListTy::const_reverse_iterator |
![]() | |
using | VPBlockTy = enum { VPRegionBlockSC, VPBasicBlockSC, VPIRBasicBlockSC } |
An enumeration for keeping track of the concrete subclass of VPBlockBase that are actually instantiated. | |
using | VPBlocksTy = SmallVectorImpl< VPBlockBase * > |
Public Member Functions | |
~VPBasicBlock () override | |
iterator | begin () |
Recipe iterator methods. | |
const_iterator | begin () const |
iterator | end () |
const_iterator | end () const |
reverse_iterator | rbegin () |
const_reverse_iterator | rbegin () const |
reverse_iterator | rend () |
const_reverse_iterator | rend () const |
size_t | size () const |
bool | empty () const |
const VPRecipeBase & | front () const |
VPRecipeBase & | front () |
const VPRecipeBase & | back () const |
VPRecipeBase & | back () |
RecipeListTy & | getRecipeList () |
Returns a reference to the list of recipes. | |
void | insert (VPRecipeBase *Recipe, iterator InsertPt) |
void | appendRecipe (VPRecipeBase *Recipe) |
Augment the existing recipes of a VPBasicBlock with an additional Recipe as the last recipe. | |
void | execute (VPTransformState *State) override |
The method which generates the output IR instructions that correspond to this VPBasicBlock, thereby "executing" the VPlan. | |
InstructionCost | cost (ElementCount VF, VPCostContext &Ctx) override |
Return the cost of this VPBasicBlock. | |
iterator | getFirstNonPhi () |
Return the position of the first non-phi node recipe in the block. | |
iterator_range< iterator > | phis () |
Returns an iterator range over the PHI-like recipes in the block. | |
VPBasicBlock * | splitAt (iterator SplitAt) |
Split current block at SplitAt by inserting a new block between the current block and its successors and moving all recipes starting at SplitAt to the new block. | |
VPRegionBlock * | getEnclosingLoopRegion () |
const VPRegionBlock * | getEnclosingLoopRegion () const |
void | print (raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const override |
Print this VPBsicBlock to O , prefixing all lines with Indent . | |
VPRecipeBase * | getTerminator () |
If the block has multiple successors, return the branch recipe terminating the block. | |
const VPRecipeBase * | getTerminator () const |
bool | isExiting () const |
Returns true if the block is exiting it's parent region. | |
VPBasicBlock * | clone () override |
Clone the current block and it's recipes, without updating the operands of the cloned recipes. | |
const VPBasicBlock * | getCFGPredecessor (unsigned Idx) const |
Returns the predecessor block at index Idx with the predecessors as per the corresponding plain CFG. | |
virtual void | print (raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const=0 |
Print plain-text dump of this VPBlockBase to O , prefixing all lines with Indent . | |
void | print (raw_ostream &O) const |
Print plain-text dump of this VPlan to O . | |
![]() | |
virtual | ~VPBlockBase ()=default |
const std::string & | getName () const |
void | setName (const Twine &newName) |
unsigned | getVPBlockID () const |
VPRegionBlock * | getParent () |
const VPRegionBlock * | getParent () const |
VPlan * | getPlan () |
const VPlan * | getPlan () const |
void | setPlan (VPlan *ParentPlan) |
Sets the pointer of the plan containing the block. | |
void | setParent (VPRegionBlock *P) |
const VPBasicBlock * | getEntryBasicBlock () const |
VPBasicBlock * | getEntryBasicBlock () |
const VPBasicBlock * | getExitingBasicBlock () const |
VPBasicBlock * | getExitingBasicBlock () |
const VPBlocksTy & | getSuccessors () const |
VPBlocksTy & | getSuccessors () |
iterator_range< VPBlockBase ** > | successors () |
iterator_range< VPBlockBase ** > | predecessors () |
const VPBlocksTy & | getPredecessors () const |
VPBlocksTy & | getPredecessors () |
VPBlockBase * | getSingleSuccessor () const |
VPBlockBase * | getSinglePredecessor () const |
size_t | getNumSuccessors () const |
size_t | getNumPredecessors () const |
VPBlockBase * | getEnclosingBlockWithSuccessors () |
An Enclosing Block of a block B is any block containing B, including B itself. | |
VPBlockBase * | getEnclosingBlockWithPredecessors () |
const VPBlocksTy & | getHierarchicalSuccessors () |
VPBlockBase * | getSingleHierarchicalSuccessor () |
const VPBlocksTy & | getHierarchicalPredecessors () |
VPBlockBase * | getSingleHierarchicalPredecessor () |
void | setOneSuccessor (VPBlockBase *Successor) |
Set a given VPBlockBase Successor as the single successor of this VPBlockBase. | |
void | setTwoSuccessors (VPBlockBase *IfTrue, VPBlockBase *IfFalse) |
Set two given VPBlockBases IfTrue and IfFalse to be the two successors of this VPBlockBase. | |
void | setPredecessors (ArrayRef< VPBlockBase * > NewPreds) |
Set each VPBasicBlock in NewPreds as predecessor of this VPBlockBase. | |
void | setSuccessors (ArrayRef< VPBlockBase * > NewSuccs) |
Set each VPBasicBlock in NewSuccss as successor of this VPBlockBase. | |
void | clearPredecessors () |
Remove all the predecessor of this block. | |
void | clearSuccessors () |
Remove all the successors of this block. | |
void | swapPredecessors () |
Swap predecessors of the block. | |
void | swapSuccessors () |
Swap successors of the block. The block must have exactly 2 successors. | |
unsigned | getIndexForPredecessor (const VPBlockBase *Pred) const |
Returns the index for Pred in the blocks predecessors list. | |
unsigned | getIndexForSuccessor (const VPBlockBase *Succ) const |
Returns the index for Succ in the blocks successor list. | |
virtual void | execute (VPTransformState *State)=0 |
The method which generates the output IR that correspond to this VPBlockBase, thereby "executing" the VPlan. | |
virtual InstructionCost | cost (ElementCount VF, VPCostContext &Ctx)=0 |
Return the cost of the block. | |
bool | isLegalToHoistInto () |
Return true if it is legal to hoist instructions into this block. | |
void | printAsOperand (raw_ostream &OS, bool PrintType=false) const |
virtual void | print (raw_ostream &O, const Twine &Indent, VPSlotTracker &SlotTracker) const =0 |
Print plain-text dump of this VPBlockBase to O , prefixing all lines with Indent . | |
void | print (raw_ostream &O) const |
Print plain-text dump of this VPlan to O . | |
void | printSuccessors (raw_ostream &O, const Twine &Indent) const |
Print the successors of this block to O , prefixing all lines with Indent . | |
LLVM_DUMP_METHOD void | dump () const |
Dump this VPBlockBase to dbgs(). | |
virtual VPBlockBase * | clone ()=0 |
Clone the current block and it's recipes without updating the operands of the cloned recipes, including all blocks in the single-entry single-exit region for VPRegionBlocks. | |
Static Public Member Functions | |
static RecipeListTy VPBasicBlock::* | getSublistAccess (VPRecipeBase *) |
Returns a pointer to a member of the recipe list. | |
static bool | classof (const VPBlockBase *V) |
Method to support type inquiry through isa, cast, and dyn_cast. | |
Protected Member Functions | |
VPBasicBlock (const unsigned char BlockSC, const Twine &Name="") | |
void | executeRecipes (VPTransformState *State, BasicBlock *BB) |
Execute the recipes in the IR basic block BB . | |
void | connectToPredecessors (VPTransformState &State) |
Connect the VPBBs predecessors' in the VPlan CFG to the IR basic block generated for this VPBB. | |
![]() | |
VPBlockBase (const unsigned char SC, const std::string &N) | |
Protected Attributes | |
RecipeListTy | Recipes |
The VPRecipes held in the order of output instructions to generate. | |
Friends | |
class | VPlan |
VPBasicBlock serves as the leaf of the Hierarchical Control-Flow Graph.
It holds a sequence of zero or more VPRecipe's each representing a sequence of output IR instructions. All PHI-like recipes must come before any non-PHI recipes.
Instruction iterators...
|
inlineoverride |
Definition at line 3660 of file VPlan.h.
References llvm::iplist_impl< IntrusiveListT, TraitsT >::pop_back().
|
inline |
Augment the existing recipes of a VPBasicBlock with an additional Recipe
as the last recipe.
Definition at line 3714 of file VPlan.h.
Referenced by clone(), llvm::VPIRBasicBlock::clone(), llvm::vputils::getOrCreateVPValueForSCEVExpr(), optimizeVectorInductionWidthForTCAndVFUF(), simplifyBranchConditionForVFAndUF(), and llvm::VPlanTransforms::truncateToMinimalBitwidths().
|
inline |
|
inline |
Definition at line 3688 of file VPlan.h.
Referenced by addCanonicalIVRecipes(), getTerminator(), hasConditionalTerminator(), and simplifyBranchConditionForVFAndUF().
|
inline |
Recipe iterator methods.
Definition at line 3674 of file VPlan.h.
Referenced by addCanonicalIVRecipes(), llvm::VPlanTransforms::canonicalizeEVLLoops(), llvm::VPlan::getCanonicalIV(), getFirstNonPhi(), llvm::VPlanTransforms::materializeBackedgeTakenCount(), llvm::VPlanTransforms::materializeBroadcasts(), llvm::VPlanTransforms::materializeVectorTripCount(), llvm::VPlanTransforms::materializeVFAndVFxUF(), preparePlanForMainVectorLoop(), and replaceVPBBWithIRVPBB().
|
inline |
|
inlinestatic |
|
overridevirtual |
Clone the current block and it's recipes, without updating the operands of the cloned recipes.
Implements llvm::VPBlockBase.
Reimplemented in llvm::VPIRBasicBlock.
Definition at line 573 of file VPlan.cpp.
References appendRecipe(), llvm::VPlan::createVPBasicBlock(), llvm::VPBlockBase::getName(), and llvm::VPBlockBase::getPlan().
|
protected |
Connect the VPBBs predecessors' in the VPlan CFG to the IR basic block generated for this VPBB.
Definition at line 425 of file VPlan.cpp.
References llvm::LoopBase< BlockT, LoopT >::addBasicBlockToLoop(), assert(), CFG, llvm::VPTransformState::CFG, llvm::BranchInst::Create(), llvm::VPTransformState::CurrentParentLoop, llvm::dbgs(), DL, llvm::MachineBasicBlock::eraseFromParent(), llvm::VPBlockBase::getExitingBasicBlock(), llvm::VPBlockBase::getHierarchicalSuccessors(), llvm::LoopInfoBase< BlockT, LoopT >::getLoopFor(), llvm::Value::getName(), llvm::VPBlockBase::getPlan(), llvm::VPBlockBase::getPredecessors(), llvm::VPBlockBase::getSingleSuccessor(), llvm::BasicBlock::getTerminator(), llvm::DominatorTreeBase< BasicBlock, false >::Insert, llvm::VPlan::isExitBlock(), llvm::VPBlockUtils::isHeader(), llvm::VPTransformState::LI, LLVM_DEBUG, llvm::VPTransformState::Plan, llvm::to_vector(), and llvm::VPTransformState::VPDT.
Referenced by execute(), and llvm::VPIRBasicBlock::execute().
|
overridevirtual |
Return the cost of this VPBasicBlock.
Implements llvm::VPBlockBase.
Definition at line 803 of file VPlan.cpp.
References Recipes.
Referenced by llvm::VPlan::cost().
|
inline |
Definition at line 3685 of file VPlan.h.
Referenced by addCanonicalIVRecipes(), llvm::VPlan::getCanonicalIV(), and hasConditionalTerminator().
|
inline |
Definition at line 3676 of file VPlan.h.
Referenced by getFirstNonPhi(), llvm::VPRecipeBase::insertBefore(), licm(), llvm::VPlanTransforms::materializeBroadcasts(), mergeBlocksIntoPredecessors(), preparePlanForMainVectorLoop(), replaceVPBBWithIRVPBB(), llvm::VPBuilder::setInsertPoint(), and splitAt().
|
inline |
|
overridevirtual |
The method which generates the output IR instructions that correspond to this VPBasicBlock, thereby "executing" the VPlan.
Implements llvm::VPBlockBase.
Reimplemented in llvm::VPIRBasicBlock.
Definition at line 522 of file VPlan.cpp.
References llvm::LoopBase< BlockT, LoopT >::addChildLoop(), llvm::LoopInfoBase< BlockT, LoopT >::addTopLevelLoop(), llvm::LoopInfoBase< BlockT, LoopT >::AllocateLoop(), assert(), llvm::VPTransformState::Builder, llvm::VPTransformState::CFG, connectToPredecessors(), llvm::IRBuilderBase::CreateUnreachable(), llvm::VPTransformState::CurrentParentLoop, executeRecipes(), llvm::VPBlockBase::getParent(), llvm::LoopBase< BlockT, LoopT >::getParentLoop(), llvm::VPBlockBase::getSingleHierarchicalPredecessor(), llvm::VPBlockUtils::isHeader(), llvm::VPBlockUtils::isLatch(), llvm::VPTransformState::Lane, llvm::VPTransformState::LI, llvm::VPTransformState::CFGState::PrevBB, llvm::IRBuilderBase::SetInsertPoint(), llvm::VPTransformState::CFGState::VPBB2IRBB, and llvm::VPTransformState::VPDT.
|
protected |
Execute the recipes in the IR basic block BB
.
Definition at line 580 of file VPlan.cpp.
References llvm::VPTransformState::CFG, llvm::dbgs(), llvm::Value::getName(), llvm::VPBlockBase::getName(), LLVM_DEBUG, llvm::VPTransformState::CFGState::PrevVPBB, Recipes, and llvm::VPTransformState::setDebugLocFrom().
Referenced by execute(), and llvm::VPIRBasicBlock::execute().
|
inline |
|
inline |
const VPBasicBlock * VPBasicBlock::getCFGPredecessor | ( | unsigned | Idx | ) | const |
Returns the predecessor block at index Idx
with the predecessors as per the corresponding plain CFG.
If the block is an entry block to a region, the first predecessor is the single predecessor of a region, and the second predecessor is the exiting block of the region.
Definition at line 810 of file VPlan.cpp.
References assert(), llvm::RegionBase< Tr >::getEntry(), llvm::VPBlockBase::getExitingBasicBlock(), llvm::VPBlockBase::getNumPredecessors(), llvm::VPBlockBase::getParent(), llvm::VPBlockBase::getPredecessors(), and Idx.
Referenced by llvm::VPPhiAccessors::getIncomingBlock().
VPRegionBlock * VPBasicBlock::getEnclosingLoopRegion | ( | ) |
Definition at line 622 of file VPlan.cpp.
References getEnclosingLoopRegionForRegion(), and llvm::VPBlockBase::getParent().
Referenced by hoistPreviousBeforeFORUsers(), isDefinedInsideLoopRegions(), and llvm::VPRecipeBuilder::tryToCreateWidenRecipe().
const VPRegionBlock * VPBasicBlock::getEnclosingLoopRegion | ( | ) | const |
Definition at line 626 of file VPlan.cpp.
References getEnclosingLoopRegionForRegion(), and llvm::VPBlockBase::getParent().
VPBasicBlock::iterator VPBasicBlock::getFirstNonPhi | ( | ) |
Return the position of the first non-phi node recipe in the block.
Definition at line 236 of file VPlan.cpp.
References begin(), and end().
Referenced by llvm::VPlanTransforms::adjustFixedOrderRecurrences(), createExtractsForLiveOuts(), legalizeAndOptimizeInductions(), mergeReplicateRegionsIntoSuccessors(), replaceVPBBWithIRVPBB(), and sinkScalarOperands().
|
inline |
Returns a reference to the list of recipes.
Definition at line 3692 of file VPlan.h.
Referenced by llvm::VPRecipeBase::eraseFromParent(), and llvm::VPRecipeBase::removeFromParent().
|
inlinestatic |
VPRecipeBase * VPBasicBlock::getTerminator | ( | ) |
If the block has multiple successors, return the branch recipe terminating the block.
If there are no or only a single successor, return nullptr;
Definition at line 667 of file VPlan.cpp.
References back(), and hasConditionalTerminator().
Referenced by llvm::VPlanTransforms::addBranchWeightToMiddleTerminator(), addCanonicalIVRecipes(), addVPLaneMaskPhiAndUpdateExitBranch(), llvm::VPlanTransforms::canonicalizeEVLLoops(), expandVPWidenIntOrFpInduction(), expandVPWidenPointerInduction(), llvm::VPlanTransforms::handleMaxMinNumReductions(), llvm::VPlanTransforms::handleUncountableEarlyExit(), and llvm::VPlanTransforms::introduceMasksAndLinearize().
const VPRecipeBase * VPBasicBlock::getTerminator | ( | ) | const |
Definition at line 673 of file VPlan.cpp.
References back(), and hasConditionalTerminator().
|
inline |
Definition at line 3705 of file VPlan.h.
References assert(), and llvm::iplist_impl< IntrusiveListT, TraitsT >::insert().
Referenced by addCanonicalIVRecipes(), llvm::VPBuilder::insert(), llvm::VPRecipeBase::insertAfter(), and llvm::VPRecipeBase::insertBefore().
bool VPBasicBlock::isExiting | ( | ) | const |
Returns true if the block is exiting it's parent region.
Definition at line 679 of file VPlan.cpp.
References llvm::VPBlockBase::getExitingBasicBlock(), and llvm::VPBlockBase::getParent().
Referenced by hasConditionalTerminator().
|
inline |
Returns an iterator range over the PHI-like recipes in the block.
Definition at line 3727 of file VPlan.h.
References llvm::make_range().
Referenced by addExitUsersForFirstOrderRecurrences(), addScalarResumePhis(), llvm::VPlanTransforms::adjustFixedOrderRecurrences(), llvm::calculateRegisterUsageForPlan(), llvm::VPlanTransforms::clearReductionWrapFlags(), llvm::LoopVectorizationPlanner::executePlan(), findHeaderMask(), llvm::VPlanTransforms::handleMaxMinNumReductions(), llvm::VPlanTransforms::handleUncountableEarlyExit(), legalizeAndOptimizeInductions(), optimizeVectorInductionWidthForTCAndVFUF(), preparePlanForMainVectorLoop(), llvm::VPlanTransforms::removeBranchOnConst(), removeRedundantCanonicalIVs(), removeRedundantInductionCasts(), replaceVPBBWithIRVPBB(), llvm::LoopVectorizationPlanner::selectInterleaveCount(), and llvm::VPlanTransforms::unrollByUF().
void VPBlockBase::print | ( | raw_ostream & | O | ) | const |
|
overridevirtual |
Print this VPBsicBlock to O
, prefixing all lines with Indent
.
SlotTracker
is used to print unnamed VPValue's using consequtive numbers.
Note that the numbering is applied to the whole VPlan, so printing individual blocks is consistent with the whole VPlan printing.
Implements llvm::VPBlockBase.
Definition at line 701 of file VPlan.cpp.
References llvm::VPBlockBase::getName(), llvm::VPDef::print(), and llvm::VPBlockBase::printSuccessors().
|
virtual |
Print plain-text dump of this VPBlockBase to O
, prefixing all lines with Indent
.
SlotTracker
is used to print unnamed VPValue's using consequtive numbers.
Note that the numbering is applied to the whole VPlan, so printing individual blocks is consistent with the whole VPlan printing.
Implements llvm::VPBlockBase.
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
Definition at line 3684 of file VPlan.h.
Referenced by llvm::VPIRBasicBlock::execute().
VPBasicBlock * VPBasicBlock::splitAt | ( | iterator | SplitAt | ) |
Split current block at SplitAt
by inserting a new block between the current block and its successors and moving all recipes starting at SplitAt to the new block.
Returns the new block.
Definition at line 594 of file VPlan.cpp.
References assert(), llvm::VPlan::createVPBasicBlock(), llvm::BasicBlock::end(), end(), llvm::VPBlockBase::getName(), llvm::VPBlockBase::getPlan(), llvm::VPBlockUtils::insertBlockAfter(), llvm::make_early_inc_range(), llvm::make_range(), and llvm::SplitBlock().
Referenced by addReplicateRegions().
|
protected |
The VPRecipes held in the order of output instructions to generate.
Definition at line 3654 of file VPlan.h.
Referenced by llvm::VPIRBasicBlock::clone(), cost(), and executeRecipes().