[llvm] [NewPM] Port StaticDataSplitter (PR #207627)
Aiden Grossman via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 5 17:32:53 PDT 2026
https://github.com/boomanaiden154 created https://github.com/llvm/llvm-project/pull/207627
Standard pass porting. Remove the MBPI member given it was unused.
>From 3ad2a7699a50bb9209390492d82f4763f8ad9b55 Mon Sep 17 00:00:00 2001
From: Aiden Grossman <aidengrossman at google.com>
Date: Mon, 6 Jul 2026 00:32:41 +0000
Subject: [PATCH] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20initia?=
=?UTF-8?q?l=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.7
---
llvm/include/llvm/CodeGen/Passes.h | 2 +-
.../include/llvm/CodeGen/StaticDataSplitter.h | 28 ++++++
llvm/include/llvm/InitializePasses.h | 2 +-
.../llvm/Passes/MachinePassRegistry.def | 2 +-
llvm/lib/CodeGen/CodeGen.cpp | 2 +-
llvm/lib/CodeGen/StaticDataSplitter.cpp | 95 +++++++++++++------
llvm/lib/CodeGen/TargetPassConfig.cpp | 2 +-
llvm/lib/Passes/PassBuilder.cpp | 1 +
8 files changed, 102 insertions(+), 32 deletions(-)
create mode 100644 llvm/include/llvm/CodeGen/StaticDataSplitter.h
diff --git a/llvm/include/llvm/CodeGen/Passes.h b/llvm/include/llvm/CodeGen/Passes.h
index 4ae41f7427c51..d30f4e2031817 100644
--- a/llvm/include/llvm/CodeGen/Passes.h
+++ b/llvm/include/llvm/CodeGen/Passes.h
@@ -86,7 +86,7 @@ LLVM_ABI MachineFunctionPass *createMachineFunctionSplitterPass();
/// createStaticDataSplitterPass - This is a machine-function pass that
/// categorizes static data hotness using profile information.
-LLVM_ABI MachineFunctionPass *createStaticDataSplitterPass();
+LLVM_ABI MachineFunctionPass *createStaticDataSplitterLegacyPass();
/// createStaticDataAnnotatorPASS - This is a module pass that reads from
/// StaticDataProfileInfoWrapperPass and annotates the section prefix of
diff --git a/llvm/include/llvm/CodeGen/StaticDataSplitter.h b/llvm/include/llvm/CodeGen/StaticDataSplitter.h
new file mode 100644
index 0000000000000..2e33fbc6d3493
--- /dev/null
+++ b/llvm/include/llvm/CodeGen/StaticDataSplitter.h
@@ -0,0 +1,28 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CODEGEN_STATICDATASPLITTER_H
+#define LLVM_CODEGEN_STATICDATASPLITTER_H
+
+#include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"
+#include "llvm/IR/Analysis.h"
+#include "llvm/IR/PassManager.h"
+
+namespace llvm {
+
+class StaticDataSplitterPass
+ : public OptionalPassInfoMixin<StaticDataSplitterPass> {
+public:
+ LLVM_ABI PreservedAnalyses run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM);
+};
+
+} // namespace llvm
+
+#endif // LLVM_CODEGEN_STATICDATASPLITTER_H
diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h
index 2f02a7ede167f..c24edf0e6a2e8 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -313,7 +313,7 @@ LLVM_ABI void initializeSpeculativeExecutionLegacyPassPass(PassRegistry &);
LLVM_ABI void initializeSpillPlacementWrapperLegacyPass(PassRegistry &);
LLVM_ABI void initializeStackColoringLegacyPass(PassRegistry &);
LLVM_ABI void initializeStackFrameLayoutAnalysisLegacyPass(PassRegistry &);
-LLVM_ABI void initializeStaticDataSplitterPass(PassRegistry &);
+LLVM_ABI void initializeStaticDataSplitterLegacyPass(PassRegistry &);
LLVM_ABI void initializeStackMapLivenessPass(PassRegistry &);
LLVM_ABI void initializeStackProtectorPass(PassRegistry &);
LLVM_ABI void initializeStackSafetyGlobalInfoWrapperPassPass(PassRegistry &);
diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def
index cb3aa9c013c43..7a910556d1acc 100644
--- a/llvm/include/llvm/Passes/MachinePassRegistry.def
+++ b/llvm/include/llvm/Passes/MachinePassRegistry.def
@@ -136,6 +136,7 @@ MACHINE_FUNCTION_PASS("shrink-wrap", ShrinkWrapPass())
MACHINE_FUNCTION_PASS("stack-coloring", StackColoringPass())
MACHINE_FUNCTION_PASS("stack-frame-layout", StackFrameLayoutAnalysisPass())
MACHINE_FUNCTION_PASS("stack-slot-coloring", StackSlotColoringPass())
+MACHINE_FUNCTION_PASS("static-data-splitter", StaticDataSplitterPass())
MACHINE_FUNCTION_PASS("tailduplication", TailDuplicatePass())
MACHINE_FUNCTION_PASS("trigger-verifier-error", TriggerVerifierErrorPass())
MACHINE_FUNCTION_PASS("two-address-instruction", TwoAddressInstructionPass())
@@ -244,7 +245,6 @@ DUMMY_MACHINE_FUNCTION_PASS("irtranslator", IRTranslatorPass)
DUMMY_MACHINE_FUNCTION_PASS("legalizer", LegalizerPass)
DUMMY_MACHINE_FUNCTION_PASS("lrshrink", LiveRangeShrinkPass)
DUMMY_MACHINE_FUNCTION_PASS("machine-combiner", MachineCombinerPass)
-DUMMY_MACHINE_FUNCTION_PASS("static-data-splitter", StaticDataSplitter)
DUMMY_MACHINE_FUNCTION_PASS("machine-function-splitter", MachineFunctionSplitterPass)
DUMMY_MACHINE_FUNCTION_PASS("machineinstr-printer", MachineFunctionPrinterPass)
DUMMY_MACHINE_FUNCTION_PASS("mirfs-discriminators", MIRAddFSDiscriminatorsPass)
diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp
index 870e12f1b308e..1f7a5a02138e4 100644
--- a/llvm/lib/CodeGen/CodeGen.cpp
+++ b/llvm/lib/CodeGen/CodeGen.cpp
@@ -152,7 +152,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
initializeStackMapLivenessPass(Registry);
initializeStackProtectorPass(Registry);
initializeStackSlotColoringLegacyPass(Registry);
- initializeStaticDataSplitterPass(Registry);
+ initializeStaticDataSplitterLegacyPass(Registry);
initializeStaticDataAnnotatorPass(Registry);
initializeStripDebugMachineModulePass(Registry);
initializeTailDuplicateLegacyPass(Registry);
diff --git a/llvm/lib/CodeGen/StaticDataSplitter.cpp b/llvm/lib/CodeGen/StaticDataSplitter.cpp
index 7e87ec248e781..4b4c26939a65d 100644
--- a/llvm/lib/CodeGen/StaticDataSplitter.cpp
+++ b/llvm/lib/CodeGen/StaticDataSplitter.cpp
@@ -15,6 +15,7 @@
// For the original RFC of this pass please see
// https://discourse.llvm.org/t/rfc-profile-guided-static-data-partitioning/83744
+#include "llvm/CodeGen/StaticDataSplitter.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/Analysis/StaticDataProfileInfo.h"
@@ -24,9 +25,12 @@
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
#include "llvm/CodeGen/MachineConstantPool.h"
#include "llvm/CodeGen/MachineFunction.h"
+#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineJumpTableInfo.h"
+#include "llvm/CodeGen/MachinePassManager.h"
#include "llvm/CodeGen/Passes.h"
+#include "llvm/IR/Analysis.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
@@ -42,8 +46,7 @@ STATISTIC(NumUnknownJumpTables,
"Number of jump tables with unknown hotness. They are from functions "
"without profile information.");
-class StaticDataSplitter : public MachineFunctionPass {
- const MachineBranchProbabilityInfo *MBPI = nullptr;
+class StaticDataSplitterImpl {
const MachineBlockFrequencyInfo *MBFI = nullptr;
const ProfileSummaryInfo *PSI = nullptr;
StaticDataProfileInfo *SDPI = nullptr;
@@ -72,10 +75,19 @@ class StaticDataSplitter : public MachineFunctionPass {
void annotateStaticDataWithoutProfiles(const MachineFunction &MF);
+public:
+ explicit StaticDataSplitterImpl(MachineBlockFrequencyInfo *MBFI,
+ ProfileSummaryInfo *PSI,
+ StaticDataProfileInfo *SDPI)
+ : MBFI(MBFI), PSI(PSI), SDPI(SDPI) {}
+ bool runOnMachineFunction(MachineFunction &MF);
+};
+
+class StaticDataSplitterLegacy : public MachineFunctionPass {
public:
static char ID;
- StaticDataSplitter() : MachineFunctionPass(ID) {}
+ StaticDataSplitterLegacy() : MachineFunctionPass(ID) {}
StringRef getPassName() const override { return "Static Data Splitter"; }
@@ -95,14 +107,7 @@ class StaticDataSplitter : public MachineFunctionPass {
bool runOnMachineFunction(MachineFunction &MF) override;
};
-bool StaticDataSplitter::runOnMachineFunction(MachineFunction &MF) {
- MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
- MBFI = &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI();
- PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
-
- SDPI = &getAnalysis<StaticDataProfileInfoWrapperPass>()
- .getStaticDataProfileInfo();
-
+bool StaticDataSplitterImpl::runOnMachineFunction(MachineFunction &MF) {
const bool ProfileAvailable = PSI && PSI->hasProfileSummary() && MBFI &&
MF.getFunction().hasProfileData();
@@ -119,9 +124,9 @@ bool StaticDataSplitter::runOnMachineFunction(MachineFunction &MF) {
}
const Constant *
-StaticDataSplitter::getConstant(const MachineOperand &Op,
- const TargetMachine &TM,
- const MachineConstantPool *MCP) {
+StaticDataSplitterImpl::getConstant(const MachineOperand &Op,
+ const TargetMachine &TM,
+ const MachineConstantPool *MCP) {
if (!Op.isGlobal() && !Op.isCPI())
return nullptr;
@@ -148,7 +153,8 @@ StaticDataSplitter::getConstant(const MachineOperand &Op,
return CPE.Val.ConstVal;
}
-bool StaticDataSplitter::partitionStaticDataWithProfiles(MachineFunction &MF) {
+bool StaticDataSplitterImpl::partitionStaticDataWithProfiles(
+ MachineFunction &MF) {
// If any of the static data (jump tables, global variables, constant pools)
// are captured by the analysis, set `Changed` to true. Note this pass won't
// invalidate any analysis pass (see `getAnalysisUsage` above), so the main
@@ -201,22 +207,23 @@ bool StaticDataSplitter::partitionStaticDataWithProfiles(MachineFunction &MF) {
}
const GlobalVariable *
-StaticDataSplitter::getLocalLinkageGlobalVariable(const GlobalValue *GV) {
+StaticDataSplitterImpl::getLocalLinkageGlobalVariable(const GlobalValue *GV) {
// LLVM IR Verifier requires that a declaration must have valid declaration
// linkage, and local linkages are not among the valid ones. So there is no
// need to check GV is not a declaration here.
return (GV && GV->hasLocalLinkage()) ? dyn_cast<GlobalVariable>(GV) : nullptr;
}
-bool StaticDataSplitter::inStaticDataSection(const GlobalVariable &GV,
- const TargetMachine &TM) {
+bool StaticDataSplitterImpl::inStaticDataSection(const GlobalVariable &GV,
+ const TargetMachine &TM) {
SectionKind Kind = TargetLoweringObjectFile::getKindForGlobal(&GV, TM);
return Kind.isData() || Kind.isReadOnly() || Kind.isReadOnlyWithRel() ||
Kind.isBSS();
}
-void StaticDataSplitter::updateStatsWithProfiles(const MachineFunction &MF) {
+void StaticDataSplitterImpl::updateStatsWithProfiles(
+ const MachineFunction &MF) {
if (!AreStatisticsEnabled())
return;
@@ -234,7 +241,7 @@ void StaticDataSplitter::updateStatsWithProfiles(const MachineFunction &MF) {
}
}
-void StaticDataSplitter::annotateStaticDataWithoutProfiles(
+void StaticDataSplitterImpl::annotateStaticDataWithoutProfiles(
const MachineFunction &MF) {
for (const auto &MBB : MF)
for (const MachineInstr &I : MBB)
@@ -244,7 +251,8 @@ void StaticDataSplitter::annotateStaticDataWithoutProfiles(
SDPI->addConstantProfileCount(C, std::nullopt);
}
-void StaticDataSplitter::updateStatsWithoutProfiles(const MachineFunction &MF) {
+void StaticDataSplitterImpl::updateStatsWithoutProfiles(
+ const MachineFunction &MF) {
if (!AreStatisticsEnabled())
return;
@@ -253,17 +261,50 @@ void StaticDataSplitter::updateStatsWithoutProfiles(const MachineFunction &MF) {
}
}
-char StaticDataSplitter::ID = 0;
+char StaticDataSplitterLegacy::ID = 0;
-INITIALIZE_PASS_BEGIN(StaticDataSplitter, DEBUG_TYPE, "Split static data",
+INITIALIZE_PASS_BEGIN(StaticDataSplitterLegacy, DEBUG_TYPE, "Split static data",
false, false)
INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
INITIALIZE_PASS_DEPENDENCY(MachineBlockFrequencyInfoWrapperPass)
INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
INITIALIZE_PASS_DEPENDENCY(StaticDataProfileInfoWrapperPass)
-INITIALIZE_PASS_END(StaticDataSplitter, DEBUG_TYPE, "Split static data", false,
- false)
+INITIALIZE_PASS_END(StaticDataSplitterLegacy, DEBUG_TYPE, "Split static data",
+ false, false)
+
+MachineFunctionPass *llvm::createStaticDataSplitterLegacyPass() {
+ return new StaticDataSplitterLegacy();
+}
+
+bool StaticDataSplitterLegacy::runOnMachineFunction(MachineFunction &MF) {
+ MachineBlockFrequencyInfo *MBFI =
+ &getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI();
+ ProfileSummaryInfo *PSI =
+ &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
+ StaticDataProfileInfo *SDPI = &getAnalysis<StaticDataProfileInfoWrapperPass>()
+ .getStaticDataProfileInfo();
+ StaticDataSplitterImpl Impl(MBFI, PSI, SDPI);
+ return Impl.runOnMachineFunction(MF);
+}
-MachineFunctionPass *llvm::createStaticDataSplitterPass() {
- return new StaticDataSplitter();
+PreservedAnalyses
+StaticDataSplitterPass::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ MachineBlockFrequencyInfo *MBFI =
+ &MFAM.getResult<MachineBlockFrequencyAnalysis>(MF);
+ auto &ModuleAnalysisManagerProxy =
+ MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF);
+ ProfileSummaryInfo *PSI =
+ ModuleAnalysisManagerProxy.getCachedResult<ProfileSummaryAnalysis>(
+ *MF.getFunction().getParent());
+ StaticDataProfileInfo *SDPI =
+ &ModuleAnalysisManagerProxy
+ .getCachedResult<StaticDataProfileInfoAnalysis>(
+ *MF.getFunction().getParent())
+ ->getStaticDataProfileInfo();
+ StaticDataSplitterImpl Impl(MBFI, PSI, SDPI);
+ return Impl.runOnMachineFunction(MF)
+ ? getMachineFunctionPassPreservedAnalyses()
+ .preserveSet<CFGAnalyses>()
+ : PreservedAnalyses::all();
}
diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp
index 614c280a2110c..0cd4c4b74bd9d 100644
--- a/llvm/lib/CodeGen/TargetPassConfig.cpp
+++ b/llvm/lib/CodeGen/TargetPassConfig.cpp
@@ -1288,7 +1288,7 @@ void TargetPassConfig::addMachinePasses() {
// The static data splitter pass is a machine function pass. and
// static data annotator pass is a module-wide pass. See the file comment
// in StaticDataAnnotator.cpp for the motivation.
- addPass(createStaticDataSplitterPass());
+ addPass(createStaticDataSplitterLegacyPass());
addPass(createStaticDataAnnotatorPass());
}
// We run the BasicBlockSections pass if either we need BB sections or BB
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index bb2144f8ba6a8..019d43737fbc0 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -183,6 +183,7 @@
#include "llvm/CodeGen/StackFrameLayoutAnalysisPass.h"
#include "llvm/CodeGen/StackProtector.h"
#include "llvm/CodeGen/StackSlotColoring.h"
+#include "llvm/CodeGen/StaticDataSplitter.h"
#include "llvm/CodeGen/TailDuplication.h"
#include "llvm/CodeGen/TargetPassConfig.h"
#include "llvm/CodeGen/TwoAddressInstructionPass.h"
More information about the llvm-commits
mailing list