diff options
author | Akshat Oke <Akshat.Oke@amd.com> | 2025-04-15 12:37:19 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-04-15 12:37:19 +0530 |
commit | a388395b869ada3a4d104aa9963fa233b45522ea (patch) | |
tree | c6e6f97e59c8c5d56661c10e655b8b91860efe94 | |
parent | f46cea5b42ed4d05fd11dc1e693ddc6153769cde (diff) | |
download | llvm-a388395b869ada3a4d104aa9963fa233b45522ea.zip llvm-a388395b869ada3a4d104aa9963fa233b45522ea.tar.gz llvm-a388395b869ada3a4d104aa9963fa233b45522ea.tar.bz2 |
[CodeGen][NPM] Port StackFrameLayoutAnalysisPass to NPM (#130070)
-rw-r--r-- | llvm/include/llvm/CodeGen/StackFrameLayoutAnalysisPass.h | 26 | ||||
-rw-r--r-- | llvm/include/llvm/InitializePasses.h | 2 | ||||
-rw-r--r-- | llvm/include/llvm/Passes/CodeGenPassBuilder.h | 3 | ||||
-rw-r--r-- | llvm/include/llvm/Passes/MachinePassRegistry.def | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/CodeGen.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/StackFrameLayoutAnalysisPass.cpp | 61 | ||||
-rw-r--r-- | llvm/lib/Passes/PassBuilder.cpp | 1 |
7 files changed, 74 insertions, 23 deletions
diff --git a/llvm/include/llvm/CodeGen/StackFrameLayoutAnalysisPass.h b/llvm/include/llvm/CodeGen/StackFrameLayoutAnalysisPass.h new file mode 100644 index 0000000..5283cda --- /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 71486ab..ea6afbf 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 ab9e7b2..d092049 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 076daf0..3ba2d25 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 0581598..dd04b2e 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 aa71be1..096a33c 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 d5c5098..a5c624b 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" |