[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