mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-03-03 01:48:15 +00:00
[MBP] Code cleanup /NFC
This is one of the patches to clean up the code so that it is in a better form to make future enhancements easier. In htis patch, the logic to collect viable successors are extrated as a helper to unclutter the caller which gets very large recenty. Also cleaned up BP adjustment code. llvm-svn: 272482
This commit is contained in:
parent
1872258b31
commit
37b3e3fa49
@ -279,6 +279,10 @@ class MachineBlockPlacement : public MachineFunctionPass {
|
||||
SmallVectorImpl<MachineBasicBlock *> &BlockWorkList,
|
||||
SmallVectorImpl<MachineBasicBlock *> &EHPadWorkList,
|
||||
const BlockFilterSet *BlockFilter = nullptr);
|
||||
BranchProbability
|
||||
collectViableSuccessors(MachineBasicBlock *BB, BlockChain &Chain,
|
||||
const BlockFilterSet *BlockFilter,
|
||||
SmallVector<MachineBasicBlock *, 4> &Successors);
|
||||
MachineBasicBlock *selectBestSuccessor(MachineBasicBlock *BB,
|
||||
BlockChain &Chain,
|
||||
const BlockFilterSet *BlockFilter);
|
||||
@ -403,24 +407,13 @@ void MachineBlockPlacement::markChainSuccessors(
|
||||
}
|
||||
}
|
||||
|
||||
/// \brief Select the best successor for a block.
|
||||
///
|
||||
/// This looks across all successors of a particular block and attempts to
|
||||
/// select the "best" one to be the layout successor. It only considers direct
|
||||
/// successors which also pass the block filter. It will attempt to avoid
|
||||
/// breaking CFG structure, but cave and break such structures in the case of
|
||||
/// very hot successor edges.
|
||||
///
|
||||
/// \returns The best successor block found, or null if none are viable.
|
||||
MachineBasicBlock *
|
||||
MachineBlockPlacement::selectBestSuccessor(MachineBasicBlock *BB,
|
||||
BlockChain &Chain,
|
||||
const BlockFilterSet *BlockFilter) {
|
||||
const BranchProbability HotProb(StaticLikelyProb, 100);
|
||||
|
||||
MachineBasicBlock *BestSucc = nullptr;
|
||||
auto BestProb = BranchProbability::getZero();
|
||||
|
||||
/// This helper function collects the set of successors of block
|
||||
/// \p BB that are allowed to be its layout successors, and return
|
||||
/// the total branch probability of edges from \p BB to those
|
||||
/// blocks.
|
||||
BranchProbability MachineBlockPlacement::collectViableSuccessors(
|
||||
MachineBasicBlock *BB, BlockChain &Chain, const BlockFilterSet *BlockFilter,
|
||||
SmallVector<MachineBasicBlock *, 4> &Successors) {
|
||||
// Adjust edge probabilities by excluding edges pointing to blocks that is
|
||||
// either not in BlockFilter or is already in the current chain. Consider the
|
||||
// following CFG:
|
||||
@ -434,11 +427,10 @@ MachineBlockPlacement::selectBestSuccessor(MachineBasicBlock *BB,
|
||||
// Assume A->C is very hot (>90%), and C->D has a 50% probability, then after
|
||||
// A->C is chosen as a fall-through, D won't be selected as a successor of C
|
||||
// due to CFG constraint (the probability of C->D is not greater than
|
||||
// HotProb). If we exclude E that is not in BlockFilter when calculating the
|
||||
// probability of C->D, D will be selected and we will get A C D B as the
|
||||
// layout of this loop.
|
||||
// HotProb to break top-oorder). If we exclude E that is not in BlockFilter
|
||||
// when calculating the probability of C->D, D will be selected and we
|
||||
// will get A C D B as the layout of this loop.
|
||||
auto AdjustedSumProb = BranchProbability::getOne();
|
||||
SmallVector<MachineBasicBlock *, 4> Successors;
|
||||
for (MachineBasicBlock *Succ : BB->successors()) {
|
||||
bool SkipSucc = false;
|
||||
if (Succ->isEHPad() || (BlockFilter && !BlockFilter->count(Succ))) {
|
||||
@ -458,15 +450,53 @@ MachineBlockPlacement::selectBestSuccessor(MachineBasicBlock *BB,
|
||||
Successors.push_back(Succ);
|
||||
}
|
||||
|
||||
return AdjustedSumProb;
|
||||
}
|
||||
|
||||
/// The helper function returns the branch probability that is adjusted
|
||||
/// or normalized over the new total \p AdjustedSumProb.
|
||||
|
||||
static BranchProbability
|
||||
getAdjustedProbability(BranchProbability OrigProb,
|
||||
BranchProbability AdjustedSumProb) {
|
||||
BranchProbability SuccProb;
|
||||
uint32_t SuccProbN = OrigProb.getNumerator();
|
||||
uint32_t SuccProbD = AdjustedSumProb.getNumerator();
|
||||
if (SuccProbN >= SuccProbD)
|
||||
SuccProb = BranchProbability::getOne();
|
||||
else
|
||||
SuccProb = BranchProbability(SuccProbN, SuccProbD);
|
||||
|
||||
return SuccProb;
|
||||
}
|
||||
|
||||
/// \brief Select the best successor for a block.
|
||||
///
|
||||
/// This looks across all successors of a particular block and attempts to
|
||||
/// select the "best" one to be the layout successor. It only considers direct
|
||||
/// successors which also pass the block filter. It will attempt to avoid
|
||||
/// breaking CFG structure, but cave and break such structures in the case of
|
||||
/// very hot successor edges.
|
||||
///
|
||||
/// \returns The best successor block found, or null if none are viable.
|
||||
MachineBasicBlock *
|
||||
MachineBlockPlacement::selectBestSuccessor(MachineBasicBlock *BB,
|
||||
BlockChain &Chain,
|
||||
const BlockFilterSet *BlockFilter) {
|
||||
const BranchProbability HotProb(StaticLikelyProb, 100);
|
||||
|
||||
MachineBasicBlock *BestSucc = nullptr;
|
||||
auto BestProb = BranchProbability::getZero();
|
||||
|
||||
SmallVector<MachineBasicBlock *, 4> Successors;
|
||||
auto AdjustedSumProb =
|
||||
collectViableSuccessors(BB, Chain, BlockFilter, Successors);
|
||||
|
||||
DEBUG(dbgs() << "Attempting merge from: " << getBlockName(BB) << "\n");
|
||||
for (MachineBasicBlock *Succ : Successors) {
|
||||
BranchProbability SuccProb;
|
||||
uint32_t SuccProbN = MBPI->getEdgeProbability(BB, Succ).getNumerator();
|
||||
uint32_t SuccProbD = AdjustedSumProb.getNumerator();
|
||||
if (SuccProbN >= SuccProbD)
|
||||
SuccProb = BranchProbability::getOne();
|
||||
else
|
||||
SuccProb = BranchProbability(SuccProbN, SuccProbD);
|
||||
auto RealSuccProb = MBPI->getEdgeProbability(BB, Succ);
|
||||
BranchProbability SuccProb =
|
||||
getAdjustedProbability(RealSuccProb, AdjustedSumProb);
|
||||
|
||||
// If we outline optional branches, look whether Succ is unavoidable, i.e.
|
||||
// dominates all terminators of the MachineFunction. If it does, other
|
||||
@ -504,7 +534,6 @@ MachineBlockPlacement::selectBestSuccessor(MachineBasicBlock *BB,
|
||||
|
||||
// Make sure that a hot successor doesn't have a globally more
|
||||
// important predecessor.
|
||||
auto RealSuccProb = MBPI->getEdgeProbability(BB, Succ);
|
||||
BlockFrequency CandidateEdgeFreq = MBFI->getBlockFreq(BB) * RealSuccProb;
|
||||
bool BadCFGConflict = false;
|
||||
for (MachineBasicBlock *Pred : Succ->predecessors()) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user