[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