diff options
author | Jeremy Morse <jeremy.morse@sony.com> | 2024-07-17 11:25:08 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-17 11:25:08 +0100 |
commit | 0b71d8020f1181c75c305d34943ed42bb1948177 (patch) | |
tree | e4944014b21461a28165742697baf9db09a6daee /llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp | |
parent | 9b9194af408003e7d484d621fb3ee61389bdd20e (diff) | |
download | llvm-0b71d8020f1181c75c305d34943ed42bb1948177.zip llvm-0b71d8020f1181c75c305d34943ed42bb1948177.tar.gz llvm-0b71d8020f1181c75c305d34943ed42bb1948177.tar.bz2 |
[InstrRef][NFC] Avoid un-necessary DenseMap queries (#99048)
This patch adjusts how some data is stored to avoid a number of
un-necessary DenseMap queries. There's no change to the compiler
behaviour, and it's measurably faster on the compile time tracker.
The BlockOrders vector in buildVLocValueMap collects the blocks over
which a variables value have to be determined: however the Cmp ordering
function makes two DenseMap queries to determine the RPO-order of blocks
being compared. And given that sorting is O(N log(N)) comparisons this
isn't fast. So instead, fetch the RPO-numbers of the block collection,
order those, and then map back to the blocks themselves.
The OrderToBB collection mapped an RPO-number to an MBB: it's completely
un-necessary to have DenseMap here, we can just use the RPO number as an
array index. Switch it to a SmallVector and deal with a few consequences
when iterating.
(And for good measure I've jammed in a couple of reserve calls).
Diffstat (limited to 'llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp')
-rw-r--r-- | llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp | 44 |
1 files changed, 26 insertions, 18 deletions
diff --git a/llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp b/llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp index 555cbb7..bde8cc4 100644 --- a/llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp +++ b/llvm/lib/CodeGen/LiveDebugValues/InstrRefBasedImpl.cpp @@ -3109,12 +3109,8 @@ void InstrRefBasedLDV::buildVLocValueMap( SmallPtrSet<const MachineBasicBlock *, 8> BlocksToExplore; // The order in which to examine them (RPO). - SmallVector<MachineBasicBlock *, 8> BlockOrders; - - // RPO ordering function. - auto Cmp = [&](MachineBasicBlock *A, MachineBasicBlock *B) { - return BBToOrder[A] < BBToOrder[B]; - }; + SmallVector<MachineBasicBlock *, 16> BlockOrders; + SmallVector<unsigned, 32> BlockOrderNums; getBlocksForScope(DILoc, BlocksToExplore, AssignBlocks); @@ -3132,11 +3128,16 @@ void InstrRefBasedLDV::buildVLocValueMap( for (const auto *MBB : BlocksToExplore) MutBlocksToExplore.insert(const_cast<MachineBasicBlock *>(MBB)); - // Picks out relevants blocks RPO order and sort them. + // Picks out relevants blocks RPO order and sort them. Sort their + // order-numbers and map back to MBB pointers later, to avoid repeated + // DenseMap queries during comparisons. for (const auto *MBB : BlocksToExplore) - BlockOrders.push_back(const_cast<MachineBasicBlock *>(MBB)); + BlockOrderNums.push_back(BBToOrder[MBB]); - llvm::sort(BlockOrders, Cmp); + llvm::sort(BlockOrderNums); + for (unsigned int I : BlockOrderNums) + BlockOrders.push_back(OrderToBB[I]); + BlockOrderNums.clear(); unsigned NumBlocks = BlockOrders.size(); // Allocate some vectors for storing the live ins and live outs. Large. @@ -3396,16 +3397,24 @@ void InstrRefBasedLDV::initialSetup(MachineFunction &MF) { return DL.getLine() != 0; return false; }; - // Collect a set of all the artificial blocks. - for (auto &MBB : MF) + + // Collect a set of all the artificial blocks. Collect the size too, ilist + // size calls are O(n). + unsigned int Size = 0; + for (auto &MBB : MF) { + ++Size; if (none_of(MBB.instrs(), hasNonArtificialLocation)) ArtificialBlocks.insert(&MBB); + } // Compute mappings of block <=> RPO order. ReversePostOrderTraversal<MachineFunction *> RPOT(&MF); unsigned int RPONumber = 0; + OrderToBB.reserve(Size); + BBToOrder.reserve(Size); + BBNumToRPO.reserve(Size); auto processMBB = [&](MachineBasicBlock *MBB) { - OrderToBB[RPONumber] = MBB; + OrderToBB.push_back(MBB); BBToOrder[MBB] = RPONumber; BBNumToRPO[MBB->getNumber()] = RPONumber; ++RPONumber; @@ -3724,14 +3733,13 @@ bool InstrRefBasedLDV::ExtendRanges(MachineFunction &MF, // Walk back through each block / instruction, collecting DBG_VALUE // instructions and recording what machine value their operands refer to. - for (auto &OrderPair : OrderToBB) { - MachineBasicBlock &MBB = *OrderPair.second; - CurBB = MBB.getNumber(); + for (MachineBasicBlock *MBB : OrderToBB) { + CurBB = MBB->getNumber(); VTracker = &vlocs[CurBB]; - VTracker->MBB = &MBB; - MTracker->loadFromArray(MInLocs[MBB], CurBB); + VTracker->MBB = MBB; + MTracker->loadFromArray(MInLocs[*MBB], CurBB); CurInst = 1; - for (auto &MI : MBB) { + for (auto &MI : *MBB) { process(MI, &MOutLocs, &MInLocs); ++CurInst; } |