diff options
author | Xinliang David Li <davidxl@google.com> | 2016-06-11 18:35:40 +0000 |
---|---|---|
committer | Xinliang David Li <davidxl@google.com> | 2016-06-11 18:35:40 +0000 |
commit | 594ffa3d368ef069f56916fc126ae43493a8fb7f (patch) | |
tree | 4312c18768b57fc6de067d67fffaf0a9db14f6f0 /llvm/lib/CodeGen/MachineBlockPlacement.cpp | |
parent | e2d8a40a3ea1ed5fa35777a985c94748914bc187 (diff) | |
download | bcm5719-llvm-594ffa3d368ef069f56916fc126ae43493a8fb7f.tar.gz bcm5719-llvm-594ffa3d368ef069f56916fc126ae43493a8fb7f.zip |
[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
Diffstat (limited to 'llvm/lib/CodeGen/MachineBlockPlacement.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineBlockPlacement.cpp | 89 |
1 files changed, 59 insertions, 30 deletions
diff --git a/llvm/lib/CodeGen/MachineBlockPlacement.cpp b/llvm/lib/CodeGen/MachineBlockPlacement.cpp index d7321a82ce2..28322be079b 100644 --- a/llvm/lib/CodeGen/MachineBlockPlacement.cpp +++ b/llvm/lib/CodeGen/MachineBlockPlacement.cpp @@ -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()) { |