[llvm] [CodeGen] Use BasicBlock numbers to map to MBBs (PR #101883)
Alexis Engelke via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 6 00:29:22 PDT 2024
https://github.com/aengelke updated https://github.com/llvm/llvm-project/pull/101883
>From 6bcd6780a22f1b9c3a055936c27fab875cc85455 Mon Sep 17 00:00:00 2001
From: Alexis Engelke <engelke at in.tum.de>
Date: Sun, 4 Aug 2024 11:03:26 +0000
Subject: [PATCH 1/3] [CodeGen] Use BasicBlock numbers to map to MBBs
Now that basic blocks have numbers, we can replace the BB-to-MBB maps
and the visited set during ISel with vectors for faster lookup.
---
llvm/include/llvm/CodeGen/FunctionLoweringInfo.h | 11 ++++++-----
llvm/include/llvm/CodeGen/GlobalISel/IRTranslator.h | 5 -----
llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 8 +++++---
.../lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp | 3 ++-
llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 8 +++++---
5 files changed, 18 insertions(+), 17 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h b/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h
index 0e08b9bef11aa..88d6fc2c7abb3 100644
--- a/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h
+++ b/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h
@@ -73,8 +73,8 @@ class FunctionLoweringInfo {
/// allocated to hold a pointer to the hidden sret parameter.
Register DemoteRegister;
- /// MBBMap - A mapping from LLVM basic blocks to their machine code entry.
- DenseMap<const BasicBlock*, MachineBasicBlock *> MBBMap;
+ /// MBBMap - A mapping from LLVM basic block number to their machine block.
+ SmallVector<MachineBasicBlock *> MBBMap;
/// ValueMap - Since we emit code for the function a basic block at a time,
/// we must remember which virtual registers hold the values for
@@ -173,8 +173,8 @@ class FunctionLoweringInfo {
DenseMap<const Value *, ISD::NodeType> PreferredExtendType;
/// VisitedBBs - The set of basic blocks visited thus far by instruction
- /// selection.
- SmallPtrSet<const BasicBlock*, 4> VisitedBBs;
+ /// selection. Indexed by basic block number.
+ SmallVector<bool> VisitedBBs;
/// PHINodesToUpdate - A list of phi instructions whose operand list will
/// be updated after processing the current basic block.
@@ -213,7 +213,8 @@ class FunctionLoweringInfo {
}
MachineBasicBlock *getMBB(const BasicBlock *BB) const {
- return MBBMap.lookup(BB);
+ assert(BB->getNumber() < MBBMap.size() && "uninitialized MBBMap?");
+ return MBBMap[BB->getNumber()];
}
Register CreateReg(MVT VT, bool isDivergent = false);
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/IRTranslator.h b/llvm/include/llvm/CodeGen/GlobalISel/IRTranslator.h
index deae2c55d26e2..2796ea4a86617 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/IRTranslator.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/IRTranslator.h
@@ -146,11 +146,6 @@ class IRTranslator : public MachineFunctionPass {
/// virtual registers and offsets.
ValueToVRegInfo VMap;
- // N.b. it's not completely obvious that this will be sufficient for every
- // LLVM IR construct (with "invoke" being the obvious candidate to mess up our
- // lives.
- DenseMap<const BasicBlock *, MachineBasicBlock *> BBToMBB;
-
// One BasicBlock can be translated to multiple MachineBasicBlocks. For such
// BasicBlocks translated to multiple MachineBasicBlocks, MachinePreds retains
// a mapping between the edges arriving at the BasicBlock to the corresponding
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index 68a8a273a1b47..6b91ff7ba75dc 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -287,7 +287,7 @@ Align IRTranslator::getMemOpAlign(const Instruction &I) {
}
MachineBasicBlock &IRTranslator::getMBB(const BasicBlock &BB) {
- MachineBasicBlock *&MBB = BBToMBB[&BB];
+ MachineBasicBlock *MBB = FuncInfo.getMBB(&BB);
assert(MBB && "BasicBlock was not encountered before");
return *MBB;
}
@@ -3832,7 +3832,8 @@ static bool checkForMustTailInVarArgFn(bool IsVarArg, const BasicBlock &BB) {
bool IRTranslator::runOnMachineFunction(MachineFunction &CurMF) {
MF = &CurMF;
- const Function &F = MF->getFunction();
+ Function &F = MF->getFunction();
+ F.renumberBlocks(); // renumber blocks for dense values
GISelCSEAnalysisWrapper &Wrapper =
getAnalysis<GISelCSEAnalysisWrapperPass>().getCSEWrapper();
// Set the CSEConfig and run the analysis.
@@ -3907,8 +3908,9 @@ bool IRTranslator::runOnMachineFunction(MachineFunction &CurMF) {
bool HasMustTailInVarArgFn = false;
// Create all blocks, in IR order, to preserve the layout.
+ FuncInfo.MBBMap.assign(F.getMaxBlockNumber(), nullptr);
for (const BasicBlock &BB: F) {
- auto *&MBB = BBToMBB[&BB];
+ auto *&MBB = FuncInfo.MBBMap[BB.getNumber()];
MBB = MF->CreateMachineBasicBlock(&BB);
MF->push_back(MBB);
diff --git a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
index 9ca76aa09a2fa..8405ba9ac326c 100644
--- a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp
@@ -236,6 +236,7 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf,
// Create an initial MachineBasicBlock for each LLVM BasicBlock in F. This
// also creates the initial PHI MachineInstrs, though none of the input
// operands are populated.
+ MBBMap.resize(Fn->getMaxBlockNumber());
for (const BasicBlock &BB : *Fn) {
// Don't create MachineBasicBlocks for imaginary EH pad blocks. These blocks
// are really data, and no instructions can live here.
@@ -261,7 +262,7 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf,
}
MachineBasicBlock *MBB = mf.CreateMachineBasicBlock(&BB);
- MBBMap[&BB] = MBB;
+ MBBMap[BB.getNumber()] = MBB;
MF->push_back(MBB);
// Transfer the address-taken flag. This is necessary because there could
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 95b6d27d31eea..e8f1b2a622af7 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -572,7 +572,8 @@ void SelectionDAGISel::initializeAnalysisResults(MachineFunctionPass &MFP) {
bool SelectionDAGISel::runOnMachineFunction(MachineFunction &mf) {
SwiftError->setFunction(mf);
- const Function &Fn = mf.getFunction();
+ Function &Fn = mf.getFunction();
+ Fn.renumberBlocks(); // renumber blocks for dense numbers
bool InstrRef = mf.shouldUseDebugInstrRef();
@@ -1643,11 +1644,12 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
}
// Iterate over all basic blocks in the function.
+ FuncInfo->VisitedBBs.assign(Fn.getMaxBlockNumber(), false);
for (const BasicBlock *LLVMBB : RPOT) {
if (OptLevel != CodeGenOptLevel::None) {
bool AllPredsVisited = true;
for (const BasicBlock *Pred : predecessors(LLVMBB)) {
- if (!FuncInfo->VisitedBBs.count(Pred)) {
+ if (!FuncInfo->VisitedBBs[Pred->getNumber()]) {
AllPredsVisited = false;
break;
}
@@ -1661,7 +1663,7 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
FuncInfo->InvalidatePHILiveOutRegInfo(&PN);
}
- FuncInfo->VisitedBBs.insert(LLVMBB);
+ FuncInfo->VisitedBBs[LLVMBB->getNumber()] = true;
}
BasicBlock::const_iterator const Begin =
>From 6783762405780371ba49b422950f0c85044dd8f0 Mon Sep 17 00:00:00 2001
From: Alexis Engelke <engelke at in.tum.de>
Date: Tue, 6 Aug 2024 07:20:31 +0000
Subject: [PATCH 2/3] address comments
---
llvm/include/llvm/CodeGen/FunctionLoweringInfo.h | 6 +++---
llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h b/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h
index 88d6fc2c7abb3..c17cacbdc8759 100644
--- a/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h
+++ b/llvm/include/llvm/CodeGen/FunctionLoweringInfo.h
@@ -73,7 +73,7 @@ class FunctionLoweringInfo {
/// allocated to hold a pointer to the hidden sret parameter.
Register DemoteRegister;
- /// MBBMap - A mapping from LLVM basic block number to their machine block.
+ /// A mapping from LLVM basic block number to their machine block.
SmallVector<MachineBasicBlock *> MBBMap;
/// ValueMap - Since we emit code for the function a basic block at a time,
@@ -172,8 +172,8 @@ class FunctionLoweringInfo {
/// for a value.
DenseMap<const Value *, ISD::NodeType> PreferredExtendType;
- /// VisitedBBs - The set of basic blocks visited thus far by instruction
- /// selection. Indexed by basic block number.
+ /// The set of basic blocks visited thus far by instruction selection. Indexed
+ /// by basic block number.
SmallVector<bool> VisitedBBs;
/// PHINodesToUpdate - A list of phi instructions whose operand list will
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index 6b91ff7ba75dc..f757e5fa22ad3 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -3908,7 +3908,7 @@ bool IRTranslator::runOnMachineFunction(MachineFunction &CurMF) {
bool HasMustTailInVarArgFn = false;
// Create all blocks, in IR order, to preserve the layout.
- FuncInfo.MBBMap.assign(F.getMaxBlockNumber(), nullptr);
+ FuncInfo.MBBMap.resize(F.getMaxBlockNumber());
for (const BasicBlock &BB: F) {
auto *&MBB = FuncInfo.MBBMap[BB.getNumber()];
>From 9463e258ee0df2dacd8385b9d4ecda8dad9fcdff Mon Sep 17 00:00:00 2001
From: Alexis Engelke <engelke at in.tum.de>
Date: Tue, 6 Aug 2024 07:25:09 +0000
Subject: [PATCH 3/3] Don't renumber in MachineFunctionPass
---
llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp | 3 +--
llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 3 +--
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index f757e5fa22ad3..0169a0e466d87 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -3832,8 +3832,7 @@ static bool checkForMustTailInVarArgFn(bool IsVarArg, const BasicBlock &BB) {
bool IRTranslator::runOnMachineFunction(MachineFunction &CurMF) {
MF = &CurMF;
- Function &F = MF->getFunction();
- F.renumberBlocks(); // renumber blocks for dense values
+ const Function &F = MF->getFunction();
GISelCSEAnalysisWrapper &Wrapper =
getAnalysis<GISelCSEAnalysisWrapperPass>().getCSEWrapper();
// Set the CSEConfig and run the analysis.
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index e8f1b2a622af7..3e517a51862de 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -572,8 +572,7 @@ void SelectionDAGISel::initializeAnalysisResults(MachineFunctionPass &MFP) {
bool SelectionDAGISel::runOnMachineFunction(MachineFunction &mf) {
SwiftError->setFunction(mf);
- Function &Fn = mf.getFunction();
- Fn.renumberBlocks(); // renumber blocks for dense numbers
+ const Function &Fn = mf.getFunction();
bool InstrRef = mf.shouldUseDebugInstrRef();
More information about the llvm-commits
mailing list