diff options
| author | Arthur Eubanks <aeubanks@google.com> | 2024-06-27 16:32:27 -0700 |
|---|---|---|
| committer | shawbyoung <shawbyoung@gmail.com> | 2024-06-27 16:32:27 -0700 |
| commit | f5c7df12cacdb84552b36a7ac598a8db41acc680 (patch) | |
| tree | 3b33e941b9bfb88c40c64fd18ee32a633423cbed /llvm/lib/CodeGen/MachineBlockPlacement.cpp | |
| parent | 608880c3a7a59c86db82728067e553a8d4665a45 (diff) | |
| parent | 804415825b97e974c96a92580bcbeaf4c7ff0a04 (diff) | |
[𝘀𝗽𝗿] changes introduced through rebaseusers/shawbyoung/spr/main.boltnfc-refactoring-callgraph
Created using spr 1.3.4
[skip ci]
Diffstat (limited to 'llvm/lib/CodeGen/MachineBlockPlacement.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/MachineBlockPlacement.cpp | 124 |
1 files changed, 89 insertions, 35 deletions
diff --git a/llvm/lib/CodeGen/MachineBlockPlacement.cpp b/llvm/lib/CodeGen/MachineBlockPlacement.cpp index c0cdeab25f1c..1cb71f39efbe 100644 --- a/llvm/lib/CodeGen/MachineBlockPlacement.cpp +++ b/llvm/lib/CodeGen/MachineBlockPlacement.cpp @@ -480,14 +480,16 @@ class MachineBlockPlacement : public MachineFunctionPass { BlockFilterSet *BlockFilter); bool repeatedlyTailDuplicateBlock( MachineBasicBlock *BB, MachineBasicBlock *&LPred, - const MachineBasicBlock *LoopHeaderBB, - BlockChain &Chain, BlockFilterSet *BlockFilter, - MachineFunction::iterator &PrevUnplacedBlockIt); - bool maybeTailDuplicateBlock( - MachineBasicBlock *BB, MachineBasicBlock *LPred, - BlockChain &Chain, BlockFilterSet *BlockFilter, + const MachineBasicBlock *LoopHeaderBB, BlockChain &Chain, + BlockFilterSet *BlockFilter, MachineFunction::iterator &PrevUnplacedBlockIt, - bool &DuplicatedToLPred); + BlockFilterSet::iterator &PrevUnplacedBlockInFilterIt); + bool + maybeTailDuplicateBlock(MachineBasicBlock *BB, MachineBasicBlock *LPred, + BlockChain &Chain, BlockFilterSet *BlockFilter, + MachineFunction::iterator &PrevUnplacedBlockIt, + BlockFilterSet::iterator &PrevUnplacedBlockInFilterIt, + bool &DuplicatedToLPred); bool hasBetterLayoutPredecessor( const MachineBasicBlock *BB, const MachineBasicBlock *Succ, const BlockChain &SuccChain, BranchProbability SuccProb, @@ -498,10 +500,13 @@ class MachineBlockPlacement : public MachineFunctionPass { const BlockFilterSet *BlockFilter); MachineBasicBlock *selectBestCandidateBlock( const BlockChain &Chain, SmallVectorImpl<MachineBasicBlock *> &WorkList); - MachineBasicBlock *getFirstUnplacedBlock( - const BlockChain &PlacedChain, - MachineFunction::iterator &PrevUnplacedBlockIt, - const BlockFilterSet *BlockFilter); + MachineBasicBlock * + getFirstUnplacedBlock(const BlockChain &PlacedChain, + MachineFunction::iterator &PrevUnplacedBlockIt); + MachineBasicBlock * + getFirstUnplacedBlock(const BlockChain &PlacedChain, + BlockFilterSet::iterator &PrevUnplacedBlockInFilterIt, + const BlockFilterSet *BlockFilter); /// Add a basic block to the work list if it is appropriate. /// @@ -606,7 +611,7 @@ public: AU.addRequired<MachineBranchProbabilityInfo>(); AU.addRequired<MachineBlockFrequencyInfo>(); if (TailDupPlacement) - AU.addRequired<MachinePostDominatorTree>(); + AU.addRequired<MachinePostDominatorTreeWrapperPass>(); AU.addRequired<MachineLoopInfo>(); AU.addRequired<ProfileSummaryInfoWrapperPass>(); AU.addRequired<TargetPassConfig>(); @@ -624,7 +629,7 @@ INITIALIZE_PASS_BEGIN(MachineBlockPlacement, DEBUG_TYPE, "Branch Probability Basic Block Placement", false, false) INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfo) INITIALIZE_PASS_DEPENDENCY(MachineBlockFrequencyInfo) -INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree) +INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass) INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo) INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass) INITIALIZE_PASS_END(MachineBlockPlacement, DEBUG_TYPE, @@ -1761,7 +1766,7 @@ MachineBasicBlock *MachineBlockPlacement::selectBestCandidateBlock( return BestBlock; } -/// Retrieve the first unplaced basic block. +/// Retrieve the first unplaced basic block in the entire function. /// /// This routine is called when we are unable to use the CFG to walk through /// all of the basic blocks and form a chain due to unnatural loops in the CFG. @@ -1770,12 +1775,10 @@ MachineBasicBlock *MachineBlockPlacement::selectBestCandidateBlock( /// re-scanning the entire sequence on repeated calls to this routine. MachineBasicBlock *MachineBlockPlacement::getFirstUnplacedBlock( const BlockChain &PlacedChain, - MachineFunction::iterator &PrevUnplacedBlockIt, - const BlockFilterSet *BlockFilter) { + MachineFunction::iterator &PrevUnplacedBlockIt) { + for (MachineFunction::iterator I = PrevUnplacedBlockIt, E = F->end(); I != E; ++I) { - if (BlockFilter && !BlockFilter->count(&*I)) - continue; if (BlockToChain[&*I] != &PlacedChain) { PrevUnplacedBlockIt = I; // Now select the head of the chain to which the unplaced block belongs @@ -1787,6 +1790,31 @@ MachineBasicBlock *MachineBlockPlacement::getFirstUnplacedBlock( return nullptr; } +/// Retrieve the first unplaced basic block among the blocks in BlockFilter. +/// +/// This is similar to getFirstUnplacedBlock for the entire function, but since +/// the size of BlockFilter is typically far less than the number of blocks in +/// the entire function, iterating through the BlockFilter is more efficient. +/// When processing the entire funciton, using the version without BlockFilter +/// has a complexity of #(loops in function) * #(blocks in function), while this +/// version has a complexity of sum(#(loops in block) foreach block in function) +/// which is always smaller. For long function mostly sequential in structure, +/// the complexity is amortized to 1 * #(blocks in function). +MachineBasicBlock *MachineBlockPlacement::getFirstUnplacedBlock( + const BlockChain &PlacedChain, + BlockFilterSet::iterator &PrevUnplacedBlockInFilterIt, + const BlockFilterSet *BlockFilter) { + assert(BlockFilter); + for (; PrevUnplacedBlockInFilterIt != BlockFilter->end(); + ++PrevUnplacedBlockInFilterIt) { + BlockChain *C = BlockToChain[*PrevUnplacedBlockInFilterIt]; + if (C != &PlacedChain) { + return *C->begin(); + } + } + return nullptr; +} + void MachineBlockPlacement::fillWorkLists( const MachineBasicBlock *MBB, SmallPtrSetImpl<BlockChain *> &UpdatedPreds, @@ -1826,6 +1854,9 @@ void MachineBlockPlacement::buildChain( assert(HeadBB && "BB must not be null.\n"); assert(BlockToChain[HeadBB] == &Chain && "BlockToChainMap mis-match.\n"); MachineFunction::iterator PrevUnplacedBlockIt = F->begin(); + BlockFilterSet::iterator PrevUnplacedBlockInFilterIt; + if (BlockFilter) + PrevUnplacedBlockInFilterIt = BlockFilter->begin(); const MachineBasicBlock *LoopHeaderBB = HeadBB; markChainSuccessors(Chain, LoopHeaderBB, BlockFilter); @@ -1855,7 +1886,11 @@ void MachineBlockPlacement::buildChain( BestSucc = selectBestCandidateBlock(Chain, EHPadWorkList); if (!BestSucc) { - BestSucc = getFirstUnplacedBlock(Chain, PrevUnplacedBlockIt, BlockFilter); + if (BlockFilter) + BestSucc = getFirstUnplacedBlock(Chain, PrevUnplacedBlockInFilterIt, + BlockFilter); + else + BestSucc = getFirstUnplacedBlock(Chain, PrevUnplacedBlockIt); if (!BestSucc) break; @@ -1867,7 +1902,8 @@ void MachineBlockPlacement::buildChain( // Check for that now. if (allowTailDupPlacement() && BestSucc && ShouldTailDup) { repeatedlyTailDuplicateBlock(BestSucc, BB, LoopHeaderBB, Chain, - BlockFilter, PrevUnplacedBlockIt); + BlockFilter, PrevUnplacedBlockIt, + PrevUnplacedBlockInFilterIt); // If the chosen successor was duplicated into BB, don't bother laying // it out, just go round the loop again with BB as the chain end. if (!BB->isSuccessor(BestSucc)) @@ -3017,14 +3053,14 @@ void MachineBlockPlacement::alignBlocks() { /// @return true if \p BB was removed. bool MachineBlockPlacement::repeatedlyTailDuplicateBlock( MachineBasicBlock *BB, MachineBasicBlock *&LPred, - const MachineBasicBlock *LoopHeaderBB, - BlockChain &Chain, BlockFilterSet *BlockFilter, - MachineFunction::iterator &PrevUnplacedBlockIt) { + const MachineBasicBlock *LoopHeaderBB, BlockChain &Chain, + BlockFilterSet *BlockFilter, MachineFunction::iterator &PrevUnplacedBlockIt, + BlockFilterSet::iterator &PrevUnplacedBlockInFilterIt) { bool Removed, DuplicatedToLPred; bool DuplicatedToOriginalLPred; - Removed = maybeTailDuplicateBlock(BB, LPred, Chain, BlockFilter, - PrevUnplacedBlockIt, - DuplicatedToLPred); + Removed = maybeTailDuplicateBlock( + BB, LPred, Chain, BlockFilter, PrevUnplacedBlockIt, + PrevUnplacedBlockInFilterIt, DuplicatedToLPred); if (!Removed) return false; DuplicatedToOriginalLPred = DuplicatedToLPred; @@ -3045,9 +3081,9 @@ bool MachineBlockPlacement::repeatedlyTailDuplicateBlock( if (ChainEnd == Chain.begin()) break; DupPred = *std::prev(ChainEnd); - Removed = maybeTailDuplicateBlock(DupBB, DupPred, Chain, BlockFilter, - PrevUnplacedBlockIt, - DuplicatedToLPred); + Removed = maybeTailDuplicateBlock( + DupBB, DupPred, Chain, BlockFilter, PrevUnplacedBlockIt, + PrevUnplacedBlockInFilterIt, DuplicatedToLPred); } // If BB was duplicated into LPred, it is now scheduled. But because it was // removed, markChainSuccessors won't be called for its chain. Instead we @@ -3074,9 +3110,9 @@ bool MachineBlockPlacement::repeatedlyTailDuplicateBlock( /// \p DuplicatedToLPred - True if the block was duplicated into LPred. /// \return - True if the block was duplicated into all preds and removed. bool MachineBlockPlacement::maybeTailDuplicateBlock( - MachineBasicBlock *BB, MachineBasicBlock *LPred, - BlockChain &Chain, BlockFilterSet *BlockFilter, - MachineFunction::iterator &PrevUnplacedBlockIt, + MachineBasicBlock *BB, MachineBasicBlock *LPred, BlockChain &Chain, + BlockFilterSet *BlockFilter, MachineFunction::iterator &PrevUnplacedBlockIt, + BlockFilterSet::iterator &PrevUnplacedBlockInFilterIt, bool &DuplicatedToLPred) { DuplicatedToLPred = false; if (!shouldTailDuplicate(BB)) @@ -3118,7 +3154,25 @@ bool MachineBlockPlacement::maybeTailDuplicateBlock( // Handle the filter set if (BlockFilter) { - BlockFilter->remove(RemBB); + auto It = llvm::find(*BlockFilter, RemBB); + // Erase RemBB from BlockFilter, and keep PrevUnplacedBlockInFilterIt + // pointing to the same element as before. + if (It != BlockFilter->end()) { + if (It < PrevUnplacedBlockInFilterIt) { + const MachineBasicBlock *PrevBB = *PrevUnplacedBlockInFilterIt; + // BlockFilter is a SmallVector so all elements after RemBB are + // shifted to the front by 1 after its deletion. + auto Distance = PrevUnplacedBlockInFilterIt - It - 1; + PrevUnplacedBlockInFilterIt = BlockFilter->erase(It) + Distance; + assert(*PrevUnplacedBlockInFilterIt == PrevBB); + (void)PrevBB; + } else if (It == PrevUnplacedBlockInFilterIt) + // The block pointed by PrevUnplacedBlockInFilterIt is erased, we + // have to set it to the next element. + PrevUnplacedBlockInFilterIt = BlockFilter->erase(It); + else + BlockFilter->erase(It); + } } // Remove the block from loop info. @@ -3417,7 +3471,7 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) { TailDupSize = TII->getTailDuplicateSize(PassConfig->getOptLevel()); if (allowTailDupPlacement()) { - MPDT = &getAnalysis<MachinePostDominatorTree>(); + MPDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree(); bool OptForSize = MF.getFunction().hasOptSize() || llvm::shouldOptimizeForSize(&MF, PSI, &MBFI->getMBFI()); if (OptForSize) @@ -3449,7 +3503,7 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) { ComputedEdges.clear(); // Must redo the post-dominator tree if blocks were changed. if (MPDT) - MPDT->runOnMachineFunction(MF); + MPDT->recalculate(MF); ChainAllocator.DestroyAll(); buildCFGChains(); } |
