[llvm] [CodeGen] Use SmallVector for MBB preds/succs (PR #101948)
Alexis Engelke via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 6 00:14:38 PDT 2024
https://github.com/aengelke updated https://github.com/llvm/llvm-project/pull/101948
>From 61a0ed0ea4eab2a9d4b0f1d1ce7b62b57b7cf50e Mon Sep 17 00:00:00 2001
From: Alexis Engelke <engelke at in.tum.de>
Date: Sun, 4 Aug 2024 17:02:22 +0000
Subject: [PATCH 1/2] [CodeGen] Use SmallVector for MBB preds/succs
Avoid extra heap allocations for typical predecessor/successor counts.
---
llvm/include/llvm/Analysis/RegionInfoImpl.h | 2 +-
llvm/include/llvm/CodeGen/MachineBasicBlock.h | 22 ++++++++++---------
.../Target/Hexagon/HexagonCopyHoisting.cpp | 2 +-
3 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/llvm/include/llvm/Analysis/RegionInfoImpl.h b/llvm/include/llvm/Analysis/RegionInfoImpl.h
index c5e8821858fd2..2ea432ea95d37 100644
--- a/llvm/include/llvm/Analysis/RegionInfoImpl.h
+++ b/llvm/include/llvm/Analysis/RegionInfoImpl.h
@@ -814,7 +814,7 @@ RegionInfoBase<Tr>::getMaxRegionExit(BlockT *BB) const {
// Get the single exit of BB.
if (R && R->getEntry() == BB)
Exit = R->getExit();
- else if (++BlockTraits::child_begin(BB) == BlockTraits::child_end(BB))
+ else if (BlockTraits::child_begin(BB) + 1 == BlockTraits::child_end(BB))
Exit = *BlockTraits::child_begin(BB);
else // No single exit exists.
return Exit;
diff --git a/llvm/include/llvm/CodeGen/MachineBasicBlock.h b/llvm/include/llvm/CodeGen/MachineBasicBlock.h
index b8153fd5d3fb7..5b80827b780b5 100644
--- a/llvm/include/llvm/CodeGen/MachineBasicBlock.h
+++ b/llvm/include/llvm/CodeGen/MachineBasicBlock.h
@@ -157,8 +157,8 @@ class MachineBasicBlock
Instructions Insts;
/// Keep track of the predecessor / successor basic blocks.
- std::vector<MachineBasicBlock *> Predecessors;
- std::vector<MachineBasicBlock *> Successors;
+ SmallVector<MachineBasicBlock *, 4> Predecessors;
+ SmallVector<MachineBasicBlock *, 2> Successors;
/// Keep track of the probabilities to the successors. This vector has the
/// same order as Successors, or it is empty if we don't use it (disable
@@ -387,18 +387,20 @@ class MachineBasicBlock
}
// Machine-CFG iterators
- using pred_iterator = std::vector<MachineBasicBlock *>::iterator;
- using const_pred_iterator = std::vector<MachineBasicBlock *>::const_iterator;
- using succ_iterator = std::vector<MachineBasicBlock *>::iterator;
- using const_succ_iterator = std::vector<MachineBasicBlock *>::const_iterator;
+ using pred_iterator = SmallVectorImpl<MachineBasicBlock *>::iterator;
+ using const_pred_iterator =
+ SmallVectorImpl<MachineBasicBlock *>::const_iterator;
+ using succ_iterator = SmallVectorImpl<MachineBasicBlock *>::iterator;
+ using const_succ_iterator =
+ SmallVectorImpl<MachineBasicBlock *>::const_iterator;
using pred_reverse_iterator =
- std::vector<MachineBasicBlock *>::reverse_iterator;
+ SmallVectorImpl<MachineBasicBlock *>::reverse_iterator;
using const_pred_reverse_iterator =
- std::vector<MachineBasicBlock *>::const_reverse_iterator;
+ SmallVectorImpl<MachineBasicBlock *>::const_reverse_iterator;
using succ_reverse_iterator =
- std::vector<MachineBasicBlock *>::reverse_iterator;
+ SmallVectorImpl<MachineBasicBlock *>::reverse_iterator;
using const_succ_reverse_iterator =
- std::vector<MachineBasicBlock *>::const_reverse_iterator;
+ SmallVectorImpl<MachineBasicBlock *>::const_reverse_iterator;
pred_iterator pred_begin() { return Predecessors.begin(); }
const_pred_iterator pred_begin() const { return Predecessors.begin(); }
pred_iterator pred_end() { return Predecessors.end(); }
diff --git a/llvm/lib/Target/Hexagon/HexagonCopyHoisting.cpp b/llvm/lib/Target/Hexagon/HexagonCopyHoisting.cpp
index e9d95c6e89db4..a43042a303093 100644
--- a/llvm/lib/Target/Hexagon/HexagonCopyHoisting.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonCopyHoisting.cpp
@@ -249,7 +249,7 @@ void HexagonCopyHoisting::moveCopyInstr(MachineBasicBlock *DestBB,
DestBB->splice(FirstTI, MI->getParent(), MI);
addMItoCopyList(MI);
- for (auto I = ++(DestBB->succ_begin()), E = DestBB->succ_end(); I != E; ++I) {
+ for (auto I = DestBB->succ_begin() + 1, E = DestBB->succ_end(); I != E; ++I) {
MachineBasicBlock *SuccBB = *I;
auto &BBCopyInst = CopyMIList[SuccBB->getNumber()];
MachineInstr *SuccMI = BBCopyInst[Key];
>From 88618151162f482050bbe0c26f5d83ab5e6fadfb Mon Sep 17 00:00:00 2001
From: Alexis Engelke <engelke at in.tum.de>
Date: Tue, 6 Aug 2024 07:14:20 +0000
Subject: [PATCH 2/2] Fix MSVC build + address comment
---
llvm/include/llvm/Analysis/RegionInfoImpl.h | 3 ++-
llvm/lib/CodeGen/MIRSampleProfile.cpp | 6 ++++--
llvm/lib/Target/Hexagon/HexagonCopyHoisting.cpp | 3 ++-
3 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/llvm/include/llvm/Analysis/RegionInfoImpl.h b/llvm/include/llvm/Analysis/RegionInfoImpl.h
index 2ea432ea95d37..ebfb060ded3dd 100644
--- a/llvm/include/llvm/Analysis/RegionInfoImpl.h
+++ b/llvm/include/llvm/Analysis/RegionInfoImpl.h
@@ -814,7 +814,8 @@ RegionInfoBase<Tr>::getMaxRegionExit(BlockT *BB) const {
// Get the single exit of BB.
if (R && R->getEntry() == BB)
Exit = R->getExit();
- else if (BlockTraits::child_begin(BB) + 1 == BlockTraits::child_end(BB))
+ else if (std::next(BlockTraits::child_begin(BB)) ==
+ BlockTraits::child_end(BB))
Exit = *BlockTraits::child_begin(BB);
else // No single exit exists.
return Exit;
diff --git a/llvm/lib/CodeGen/MIRSampleProfile.cpp b/llvm/lib/CodeGen/MIRSampleProfile.cpp
index ce82f280c1c53..90a15210a03b8 100644
--- a/llvm/lib/CodeGen/MIRSampleProfile.cpp
+++ b/llvm/lib/CodeGen/MIRSampleProfile.cpp
@@ -126,8 +126,10 @@ template <> struct IRTraits<MachineBasicBlock> {
using PostDominatorTreeT = MachinePostDominatorTree;
using OptRemarkEmitterT = MachineOptimizationRemarkEmitter;
using OptRemarkAnalysisT = MachineOptimizationRemarkAnalysis;
- using PredRangeT = iterator_range<std::vector<MachineBasicBlock *>::iterator>;
- using SuccRangeT = iterator_range<std::vector<MachineBasicBlock *>::iterator>;
+ using PredRangeT =
+ iterator_range<SmallVectorImpl<MachineBasicBlock *>::iterator>;
+ using SuccRangeT =
+ iterator_range<SmallVectorImpl<MachineBasicBlock *>::iterator>;
static Function &getFunction(MachineFunction &F) { return F.getFunction(); }
static const MachineBasicBlock *getEntryBB(const MachineFunction *F) {
return GraphTraits<const MachineFunction *>::getEntryNode(F);
diff --git a/llvm/lib/Target/Hexagon/HexagonCopyHoisting.cpp b/llvm/lib/Target/Hexagon/HexagonCopyHoisting.cpp
index a43042a303093..a2230289ae69c 100644
--- a/llvm/lib/Target/Hexagon/HexagonCopyHoisting.cpp
+++ b/llvm/lib/Target/Hexagon/HexagonCopyHoisting.cpp
@@ -249,7 +249,8 @@ void HexagonCopyHoisting::moveCopyInstr(MachineBasicBlock *DestBB,
DestBB->splice(FirstTI, MI->getParent(), MI);
addMItoCopyList(MI);
- for (auto I = DestBB->succ_begin() + 1, E = DestBB->succ_end(); I != E; ++I) {
+ for (auto I = std::next(DestBB->succ_begin()), E = DestBB->succ_end(); I != E;
+ ++I) {
MachineBasicBlock *SuccBB = *I;
auto &BBCopyInst = CopyMIList[SuccBB->getNumber()];
MachineInstr *SuccMI = BBCopyInst[Key];
More information about the llvm-commits
mailing list