LLVM
8.0.1
|
Utility class to perform tail duplication. More...
#include "llvm/CodeGen/TailDuplicator.h"
Public Member Functions | |
void | initMF (MachineFunction &MF, bool PreRegAlloc, const MachineBranchProbabilityInfo *MBPI, bool LayoutMode, unsigned TailDupSize=0) |
Prepare to run on a specific machine function. More... | |
bool | tailDuplicateBlocks () |
Look for small blocks that are unconditionally branched to and do not fall through. More... | |
bool | shouldTailDuplicate (bool IsSimple, MachineBasicBlock &TailBB) |
Determine if it is profitable to duplicate this block. More... | |
bool | canTailDuplicate (MachineBasicBlock *TailBB, MachineBasicBlock *PredBB) |
Returns true if TailBB can successfully be duplicated into PredBB. More... | |
bool | tailDuplicateAndUpdate (bool IsSimple, MachineBasicBlock *MBB, MachineBasicBlock *ForcedLayoutPred, SmallVectorImpl< MachineBasicBlock *> *DuplicatedPreds=nullptr, function_ref< void(MachineBasicBlock *)> *RemovalCallback=nullptr) |
Tail duplicate a single basic block into its predecessors, and then clean up. More... | |
Static Public Member Functions | |
static bool | isSimpleBB (MachineBasicBlock *TailBB) |
True if this BB has only one unconditional jump. More... | |
Utility class to perform tail duplication.
Definition at line 37 of file TailDuplicator.h.
bool TailDuplicator::canTailDuplicate | ( | MachineBasicBlock * | TailBB, |
MachineBasicBlock * | PredBB | ||
) |
Returns true if TailBB can successfully be duplicated into PredBB.
Definition at line 773 of file TailDuplicator.cpp.
References llvm::MachineInstrBuilder::addReg(), llvm::MachineBasicBlock::addSuccessor(), llvm::TargetInstrInfo::analyzeBranch(), assert(), llvm::MachineBasicBlock::begin(), llvm::BuildMI(), C, llvm::MachineBasicBlock::canFallThrough(), llvm::dbgs(), E, llvm::SmallVectorBase::empty(), llvm::MachineBasicBlock::end(), llvm::MachineBasicBlock::eraseFromParent(), llvm::MachineInstr::eraseFromParent(), llvm::MCInstrInfo::get(), llvm::MachineBranchProbabilityInfo::getEdgeProbability(), llvm::MachineBasicBlock::getFirstTerminator(), llvm::ilist_node_impl< OptionsT >::getIterator(), getRegsUsedByPHIs(), llvm::MachineBasicBlock::hasAddressTaken(), I, llvm::is_contained(), llvm::MachineInstr::isBundle(), llvm::MachineBasicBlock::isLayoutSuccessor(), llvm::MachineInstr::isPHI(), LLVM_DEBUG, llvm::MachineBasicBlock::pred_begin(), llvm::MachineBasicBlock::pred_empty(), llvm::MachineBasicBlock::pred_end(), llvm::MachineBasicBlock::pred_size(), llvm::printMBBReference(), llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::SmallVectorTemplateBase< T >::push_back(), llvm::TargetInstrInfo::removeBranch(), llvm::MachineBasicBlock::removeSuccessor(), llvm::MachineBasicBlock::size(), llvm::MachineBasicBlock::splice(), llvm::MachineBasicBlock::succ_begin(), llvm::MachineBasicBlock::succ_empty(), llvm::MachineBasicBlock::succ_end(), llvm::MachineBasicBlock::succ_size(), llvm::MachineBasicBlock::successors(), and llvm::MachineBasicBlock::transferSuccessors().
Referenced by greaterWithBias().
void TailDuplicator::initMF | ( | MachineFunction & | MF, |
bool | PreRegAlloc, | ||
const MachineBranchProbabilityInfo * | MBPI, | ||
bool | LayoutMode, | ||
unsigned | TailDupSize = 0 |
||
) |
Prepare to run on a specific machine function.
MF | - Function that will be processed |
PreRegAlloc | - true if used before register allocation |
MBPI | - Branch Probability Info. Used to propagate correct probabilities when modifying the CFG. |
LayoutMode | - When true, don't use the existing layout to make decisions. |
TailDupSize | - Maxmimum size of blocks to tail-duplicate. Zero default implies using the command line value TailDupSize. |
Definition at line 79 of file TailDuplicator.cpp.
References assert(), llvm::TargetSubtargetInfo::getInstrInfo(), llvm::MachineFunction::getMMI(), llvm::MachineFunction::getRegInfo(), llvm::TargetSubtargetInfo::getRegisterInfo(), and llvm::MachineFunction::getSubtarget().
Referenced by getLayoutSuccessorProbThreshold().
|
static |
True if this BB has only one unconditional jump.
Definition at line 663 of file TailDuplicator.cpp.
References llvm::MachineBasicBlock::end(), llvm::MachineBasicBlock::getFirstNonDebugInstr(), I, llvm::MachineBasicBlock::pred_empty(), and llvm::MachineBasicBlock::succ_size().
Referenced by getLayoutSuccessorProbThreshold(), hasSameSuccessors(), and tailDuplicateBlocks().
bool TailDuplicator::shouldTailDuplicate | ( | bool | IsSimple, |
MachineBasicBlock & | TailBB | ||
) |
Determine if it is profitable to duplicate this block.
Definition at line 543 of file TailDuplicator.cpp.
References llvm::TargetInstrInfo::analyzeBranch(), assert(), llvm::MachineBasicBlock::back(), llvm::MachineBasicBlock::canFallThrough(), llvm::MachineBasicBlock::empty(), llvm::MachineFunction::getFunction(), getPHISrcRegOpIdx(), llvm::MachineOperand::getSubReg(), I, InstrCount, llvm::MachineInstr::isCall(), llvm::MachineInstr::isCFIInstruction(), llvm::MachineInstr::isConvergent(), llvm::MachineInstr::isIndirectBranch(), llvm::MachineInstr::isMetaInstruction(), llvm::MachineInstr::isNotDuplicable(), llvm::MachineInstr::isPHI(), llvm::MachineInstr::isReturn(), llvm::MachineBasicBlock::isSuccessor(), llvm::Function::optForSize(), TailDupIndirectBranchSize, and TailDuplicateSize.
Referenced by hasSameSuccessors(), and tailDuplicateBlocks().
bool TailDuplicator::tailDuplicateAndUpdate | ( | bool | IsSimple, |
MachineBasicBlock * | MBB, | ||
MachineBasicBlock * | ForcedLayoutPred, | ||
SmallVectorImpl< MachineBasicBlock *> * | DuplicatedPreds = nullptr , |
||
function_ref< void(MachineBasicBlock *)> * | RemovalCallback = nullptr |
||
) |
Tail duplicate a single basic block into its predecessors, and then clean up.
Tail duplicate the block and cleanup.
If DuplicatePreds
is not null, it will be updated to contain the list of predecessors that received a copy of MBB
. If RemovalCallback
is non-null. It will be called before MBB is deleted.
IsSimple
- return value of isSimpleBB MBB
- block to be duplicated ForcedLayoutPred
- If non-null, treat this block as the layout predecessor, instead of using the ordering in MF DuplicatedPreds
- if non-null, DuplicatedPreds
will contain a list of all Preds that received a copy of MBB
. RemovalCallback
- if non-null, called just before MBB is deleted.
Definition at line 152 of file TailDuplicator.cpp.
References llvm::MachineSSAUpdater::AddAvailableValue(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::clear(), llvm::SmallVectorImpl< T >::clear(), llvm::MachineRegisterInfo::constrainRegClass(), Copies, DefMI, llvm::SmallVectorBase::empty(), llvm::MachineInstr::eraseFromParent(), llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::MachineInstr::getOperand(), llvm::MachineOperand::getParent(), llvm::MachineInstr::getParent(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getRegClass(), llvm::MachineRegisterInfo::getVRegDef(), llvm::MachineBasicBlock::hasAddressTaken(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), llvm::MachineSSAUpdater::Initialize(), llvm::MachineInstr::isCopy(), llvm::MachineInstr::isDebugValue(), llvm::MachineInstr::isPHI(), llvm::MachineBasicBlock::pred_empty(), llvm::MachineRegisterInfo::replaceRegWith(), llvm::MachineSSAUpdater::RewriteUse(), llvm::SmallVectorBase::size(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::size(), llvm::MachineBasicBlock::size(), llvm::MachineBasicBlock::succ_begin(), llvm::MachineBasicBlock::succ_end(), llvm::MachineRegisterInfo::use_begin(), llvm::MachineRegisterInfo::use_end(), and UseMI.
Referenced by getLayoutSuccessorProbThreshold(), and tailDuplicateBlocks().
bool TailDuplicator::tailDuplicateBlocks | ( | ) |
Look for small blocks that are unconditionally branched to and do not fall through.
Tail-duplicate their instructions into their predecessors to eliminate (dynamic) branches.
Definition at line 261 of file TailDuplicator.cpp.
References llvm::MachineFunction::begin(), llvm::dbgs(), E, llvm::MachineFunction::end(), I, isSimpleBB(), LLVM_DEBUG, shouldTailDuplicate(), tailDuplicateAndUpdate(), TailDupLimit, TailDupVerify, and VerifyPHIs().