[llvm] [CodeGen][NPM] Port StackFrameLayoutAnalysisPass to NPM (PR #130070)

Akshat Oke via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 14 21:32:16 PDT 2025


https://github.com/optimisan updated https://github.com/llvm/llvm-project/pull/130070

>From e3492432f84cfaf96108a14ce0d30a8cc91a73bb Mon Sep 17 00:00:00 2001
From: Akshat Oke <Akshat.Oke at amd.com>
Date: Thu, 6 Mar 2025 10:45:25 +0000
Subject: [PATCH] [CodeGen][NPM] Port StackFrameLayoutAnalysisPass to NPM

---
 .../CodeGen/StackFrameLayoutAnalysisPass.h    | 26 ++++++++
 llvm/include/llvm/InitializePasses.h          |  2 +-
 llvm/include/llvm/Passes/CodeGenPassBuilder.h |  3 +
 .../llvm/Passes/MachinePassRegistry.def       |  2 +-
 llvm/lib/CodeGen/CodeGen.cpp                  |  2 +-
 .../CodeGen/StackFrameLayoutAnalysisPass.cpp  | 61 +++++++++++++------
 llvm/lib/Passes/PassBuilder.cpp               |  1 +
 7 files changed, 74 insertions(+), 23 deletions(-)
 create mode 100644 llvm/include/llvm/CodeGen/StackFrameLayoutAnalysisPass.h

diff --git a/llvm/include/llvm/CodeGen/StackFrameLayoutAnalysisPass.h b/llvm/include/llvm/CodeGen/StackFrameLayoutAnalysisPass.h
new file mode 100644
index 0000000000000..5283cda30da12
--- /dev/null
+++ b/llvm/include/llvm/CodeGen/StackFrameLayoutAnalysisPass.h
@@ -0,0 +1,26 @@
+//===- llvm/CodeGen/StackFrameLayoutAnalysisPass.h --------------*- C++ -*-===//
+//
+// 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_STACKFRAMELAYOUTANALYSISPASS_H
+#define LLVM_CODEGEN_STACKFRAMELAYOUTANALYSISPASS_H
+
+#include "llvm/CodeGen/MachinePassManager.h"
+
+namespace llvm {
+
+class StackFrameLayoutAnalysisPass
+    : public PassInfoMixin<StackFrameLayoutAnalysisPass> {
+public:
+  PreservedAnalyses run(MachineFunction &MF,
+                        MachineFunctionAnalysisManager &MFAM);
+  static bool isRequired() { return true; }
+};
+
+} // namespace llvm
+
+#endif // LLVM_CODEGEN_STACKFRAMELAYOUTANALYSISPASS_H
diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h
index 71486ab52e348..ea6afbfdc7861 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -292,7 +292,7 @@ void initializeSlotIndexesWrapperPassPass(PassRegistry &);
 void initializeSpeculativeExecutionLegacyPassPass(PassRegistry &);
 void initializeSpillPlacementWrapperLegacyPass(PassRegistry &);
 void initializeStackColoringLegacyPass(PassRegistry &);
-void initializeStackFrameLayoutAnalysisPassPass(PassRegistry &);
+void initializeStackFrameLayoutAnalysisLegacyPass(PassRegistry &);
 void initializeStaticDataSplitterPass(PassRegistry &);
 void initializeStackMapLivenessPass(PassRegistry &);
 void initializeStackProtectorPass(PassRegistry &);
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
index ab9e7b2d23b9f..d092049022623 100644
--- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h
+++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h
@@ -84,6 +84,7 @@
 #include "llvm/CodeGen/ShadowStackGCLowering.h"
 #include "llvm/CodeGen/SjLjEHPrepare.h"
 #include "llvm/CodeGen/StackColoring.h"
+#include "llvm/CodeGen/StackFrameLayoutAnalysisPass.h"
 #include "llvm/CodeGen/StackProtector.h"
 #include "llvm/CodeGen/StackSlotColoring.h"
 #include "llvm/CodeGen/TailDuplication.h"
@@ -1021,6 +1022,8 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::addMachinePasses(
       addPass(MachineOutlinerPass(RunOnAllFunctions));
   }
 
+  addPass(StackFrameLayoutAnalysisPass());
+
   // Add passes that directly emit MI after all other MI passes.
   derived().addPreEmitPass2(addPass);
 
diff --git a/llvm/include/llvm/Passes/MachinePassRegistry.def b/llvm/include/llvm/Passes/MachinePassRegistry.def
index 076daf0b40ccf..3ba2d259fe78c 100644
--- a/llvm/include/llvm/Passes/MachinePassRegistry.def
+++ b/llvm/include/llvm/Passes/MachinePassRegistry.def
@@ -188,6 +188,7 @@ MACHINE_FUNCTION_PASS("remove-redundant-debug-values", RemoveRedundantDebugValue
 MACHINE_FUNCTION_PASS("require-all-machine-function-properties",
                       RequireAllMachineFunctionPropertiesPass())
 MACHINE_FUNCTION_PASS("stack-coloring", StackColoringPass())
+MACHINE_FUNCTION_PASS("stack-frame-layout", StackFrameLayoutAnalysisPass())
 MACHINE_FUNCTION_PASS("stack-slot-coloring", StackSlotColoringPass())
 MACHINE_FUNCTION_PASS("tailduplication", TailDuplicatePass())
 MACHINE_FUNCTION_PASS("trigger-verifier-error", TriggerVerifierErrorPass())
@@ -314,7 +315,6 @@ DUMMY_MACHINE_FUNCTION_PASS("regallocscoringpass", RegAllocScoringPass)
 DUMMY_MACHINE_FUNCTION_PASS("regbankselect", RegBankSelectPass)
 DUMMY_MACHINE_FUNCTION_PASS("reset-machine-function", ResetMachineFunctionPass)
 DUMMY_MACHINE_FUNCTION_PASS("shrink-wrap", ShrinkWrapPass)
-DUMMY_MACHINE_FUNCTION_PASS("stack-frame-layout", StackFrameLayoutAnalysisPass)
 DUMMY_MACHINE_FUNCTION_PASS("stackmap-liveness", StackMapLivenessPass)
 DUMMY_MACHINE_FUNCTION_PASS("unpack-mi-bundles", UnpackMachineBundlesPass)
 DUMMY_MACHINE_FUNCTION_PASS("virtregrewriter", VirtRegRewriterPass)
diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp
index 0581598432487..dd04b2e81a2a7 100644
--- a/llvm/lib/CodeGen/CodeGen.cpp
+++ b/llvm/lib/CodeGen/CodeGen.cpp
@@ -127,7 +127,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
   initializeSjLjEHPreparePass(Registry);
   initializeSlotIndexesWrapperPassPass(Registry);
   initializeStackColoringLegacyPass(Registry);
-  initializeStackFrameLayoutAnalysisPassPass(Registry);
+  initializeStackFrameLayoutAnalysisLegacyPass(Registry);
   initializeStackMapLivenessPass(Registry);
   initializeStackProtectorPass(Registry);
   initializeStackSlotColoringLegacyPass(Registry);
diff --git a/llvm/lib/CodeGen/StackFrameLayoutAnalysisPass.cpp b/llvm/lib/CodeGen/StackFrameLayoutAnalysisPass.cpp
index aa71be16f0552..096a33c17cb4b 100644
--- a/llvm/lib/CodeGen/StackFrameLayoutAnalysisPass.cpp
+++ b/llvm/lib/CodeGen/StackFrameLayoutAnalysisPass.cpp
@@ -16,6 +16,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/CodeGen/StackFrameLayoutAnalysisPass.h"
 #include "llvm/ADT/SetVector.h"
 #include "llvm/Analysis/OptimizationRemarkEmitter.h"
 #include "llvm/CodeGen/MachineFrameInfo.h"
@@ -43,9 +44,11 @@ namespace {
 /// StackFrameLayoutAnalysisPass - This is a pass to dump the stack frame of a
 /// MachineFunction.
 ///
-struct StackFrameLayoutAnalysisPass : public MachineFunctionPass {
+struct StackFrameLayoutAnalysis {
   using SlotDbgMap = SmallDenseMap<int, SetVector<const DILocalVariable *>>;
-  static char ID;
+  MachineOptimizationRemarkEmitter &ORE;
+
+  StackFrameLayoutAnalysis(MachineOptimizationRemarkEmitter &ORE) : ORE(ORE) {}
 
   enum SlotType {
     Spill,          // a Spill slot
@@ -99,19 +102,7 @@ struct StackFrameLayoutAnalysisPass : public MachineFunctionPass {
     }
   };
 
-  StackFrameLayoutAnalysisPass() : MachineFunctionPass(ID) {}
-
-  StringRef getPassName() const override {
-    return "Stack Frame Layout Analysis";
-  }
-
-  void getAnalysisUsage(AnalysisUsage &AU) const override {
-    AU.setPreservesAll();
-    MachineFunctionPass::getAnalysisUsage(AU);
-    AU.addRequired<MachineOptimizationRemarkEmitterPass>();
-  }
-
-  bool runOnMachineFunction(MachineFunction &MF) override {
+  bool run(MachineFunction &MF) {
     // TODO: We should implement a similar filter for remarks:
     //   -Rpass-func-filter=<regex>
     if (!isFunctionInPrintList(MF.getName()))
@@ -126,7 +117,7 @@ struct StackFrameLayoutAnalysisPass : public MachineFunctionPass {
                                           &MF.front());
     Rem << ("\nFunction: " + MF.getName()).str();
     emitStackFrameLayoutRemarks(MF, Rem);
-    getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE().emit(Rem);
+    ORE.emit(Rem);
     return false;
   }
 
@@ -278,17 +269,47 @@ struct StackFrameLayoutAnalysisPass : public MachineFunctionPass {
   }
 };
 
-char StackFrameLayoutAnalysisPass::ID = 0;
+class StackFrameLayoutAnalysisLegacy : public MachineFunctionPass {
+public:
+  static char ID;
+
+  StackFrameLayoutAnalysisLegacy() : MachineFunctionPass(ID) {}
+
+  StringRef getPassName() const override {
+    return "Stack Frame Layout Analysis";
+  }
+
+  void getAnalysisUsage(AnalysisUsage &AU) const override {
+    AU.setPreservesAll();
+    MachineFunctionPass::getAnalysisUsage(AU);
+    AU.addRequired<MachineOptimizationRemarkEmitterPass>();
+  }
+
+  bool runOnMachineFunction(MachineFunction &MF) override {
+    auto &ORE = getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE();
+    return StackFrameLayoutAnalysis(ORE).run(MF);
+  }
+};
+
+char StackFrameLayoutAnalysisLegacy::ID = 0;
 } // namespace
 
-char &llvm::StackFrameLayoutAnalysisPassID = StackFrameLayoutAnalysisPass::ID;
-INITIALIZE_PASS(StackFrameLayoutAnalysisPass, "stack-frame-layout",
+PreservedAnalyses
+llvm::StackFrameLayoutAnalysisPass::run(MachineFunction &MF,
+                                        MachineFunctionAnalysisManager &MFAM) {
+  auto &ORE = MFAM.getResult<MachineOptimizationRemarkEmitterAnalysis>(MF);
+  StackFrameLayoutAnalysis(ORE).run(MF);
+  return PreservedAnalyses::all();
+}
+
+char &llvm::StackFrameLayoutAnalysisPassID = StackFrameLayoutAnalysisLegacy::ID;
+INITIALIZE_PASS(StackFrameLayoutAnalysisLegacy, "stack-frame-layout",
                 "Stack Frame Layout", false, false)
 
 namespace llvm {
 /// Returns a newly-created StackFrameLayout pass.
 MachineFunctionPass *createStackFrameLayoutAnalysisPass() {
-  return new StackFrameLayoutAnalysisPass();
+  return new StackFrameLayoutAnalysisLegacy();
 }
 
 } // namespace llvm
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index d5c5098725972..a5c624b96304b 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -160,6 +160,7 @@
 #include "llvm/CodeGen/SlotIndexes.h"
 #include "llvm/CodeGen/SpillPlacement.h"
 #include "llvm/CodeGen/StackColoring.h"
+#include "llvm/CodeGen/StackFrameLayoutAnalysisPass.h"
 #include "llvm/CodeGen/StackProtector.h"
 #include "llvm/CodeGen/StackSlotColoring.h"
 #include "llvm/CodeGen/TailDuplication.h"



More information about the llvm-commits mailing list