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 { +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::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>; - 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(); - } - - bool runOnMachineFunction(MachineFunction &MF) override { + bool run(MachineFunction &MF) { // TODO: We should implement a similar filter for remarks: // -Rpass-func-filter= if (!isFunctionInPrintList(MF.getName())) @@ -126,7 +117,7 @@ struct StackFrameLayoutAnalysisPass : public MachineFunctionPass { &MF.front()); Rem << ("\nFunction: " + MF.getName()).str(); emitStackFrameLayoutRemarks(MF, Rem); - getAnalysis().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(); + } + + bool runOnMachineFunction(MachineFunction &MF) override { + auto &ORE = getAnalysis().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(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"