https://github.com/optimisan updated https://github.com/llvm/llvm-project/pull/130070
>From d4ed8c036554f66384ab9578c32f00a50426a88e Mon Sep 17 00:00:00 2001 From: Akshat Oke <akshat....@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 c7bc4320cf8f0..9068aee8f8193 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -290,7 +290,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 74cdc7d66810b..8cba36b36fbb2 100644 --- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h +++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h @@ -80,6 +80,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" @@ -1015,6 +1016,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 8fa21751392f3..01dd423de6955 100644 --- a/llvm/include/llvm/Passes/MachinePassRegistry.def +++ b/llvm/include/llvm/Passes/MachinePassRegistry.def @@ -187,6 +187,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()) @@ -295,7 +296,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 b2c9202cd6fe1..2dc8890aab702 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 e73c0e91e8578..01949a2bab8ff 100644 --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -155,6 +155,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" _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits