diff --git a/llvm/include/llvm/CodeGen/FinalizeISel.h b/llvm/include/llvm/CodeGen/FinalizeISel.h new file mode 100644 --- /dev/null +++ b/llvm/include/llvm/CodeGen/FinalizeISel.h @@ -0,0 +1,30 @@ +//===-- llvm/CodeGen/FinalizeISel.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 +// +//===----------------------------------------------------------------------===// +// +/// This pass expands Pseudo-instructions produced by ISel, fixes register +/// reservations and may do machine frame information adjustments. +/// The pseudo instructions are used to allow the expansion to contain control +/// flow, such as a conditional move implemented with a conditional branch and a +/// phi, or an atomic operation implemented with a loop. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CODEGEN_FINALIZE_ISEL_H +#define LLVM_CODEGEN_FINALIZE_ISEL_H + +#include "llvm/CodeGen/PassManager.h" +#include "llvm/IR/PassManager.h" + +namespace llvm { + +struct FinalizeISelPass : PassInfoMixin { + PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &); +}; +} // namespace llvm + +#endif // LLVM_CODEGEN_FINALIZE_ISEL_H diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -143,7 +143,7 @@ void initializeMakeGuardsExplicitLegacyPassPass(PassRegistry&); void initializeExternalAAWrapperPassPass(PassRegistry&); void initializeFEntryInserterPass(PassRegistry&); -void initializeFinalizeISelPass(PassRegistry&); +void initializeFinalizeISelLegacyPassPass(PassRegistry&); void initializeFinalizeMachineBundlesPass(PassRegistry&); void initializeFlattenCFGPassPass(PassRegistry&); void initializeFloat2IntLegacyPassPass(PassRegistry&); diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -33,7 +33,7 @@ initializeExpandMemCmpPassPass(Registry); initializeExpandPostRAPass(Registry); initializeFEntryInserterPass(Registry); - initializeFinalizeISelPass(Registry); + initializeFinalizeISelLegacyPassPass(Registry); initializeFinalizeMachineBundlesPass(Registry); initializeFuncletLayoutPass(Registry); initializeGCMachineCodeAnalysisPass(Registry); diff --git a/llvm/lib/CodeGen/FinalizeISel.cpp b/llvm/lib/CodeGen/FinalizeISel.cpp --- a/llvm/lib/CodeGen/FinalizeISel.cpp +++ b/llvm/lib/CodeGen/FinalizeISel.cpp @@ -14,6 +14,8 @@ // //===----------------------------------------------------------------------===// +#include "llvm/CodeGen/FinalizeISel.h" + #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/Passes.h" @@ -25,10 +27,10 @@ #define DEBUG_TYPE "finalize-isel" namespace { - class FinalizeISel : public MachineFunctionPass { - public: - static char ID; // Pass identification, replacement for typeid - FinalizeISel() : MachineFunctionPass(ID) {} +class FinalizeISelLegacyPass : public MachineFunctionPass { +public: + static char ID; // Pass identification, replacement for typeid + FinalizeISelLegacyPass() : MachineFunctionPass(ID) {} private: bool runOnMachineFunction(MachineFunction &MF) override; @@ -39,12 +41,12 @@ }; } // end anonymous namespace -char FinalizeISel::ID = 0; -char &llvm::FinalizeISelID = FinalizeISel::ID; -INITIALIZE_PASS(FinalizeISel, DEBUG_TYPE, +char FinalizeISelLegacyPass::ID = 0; +char &llvm::FinalizeISelID = FinalizeISelLegacyPass::ID; +INITIALIZE_PASS(FinalizeISelLegacyPass, DEBUG_TYPE, "Finalize ISel and expand pseudo-instructions", false, false) -bool FinalizeISel::runOnMachineFunction(MachineFunction &MF) { +static bool finalizeISel(MachineFunction &MF) { bool Changed = false; const TargetLowering *TLI = MF.getSubtarget().getTargetLowering(); @@ -74,3 +76,13 @@ return Changed; } + +PreservedAnalyses FinalizeISelPass::run(MachineFunction &MF, + MachineFunctionAnalysisManager &) { + return finalizeISel(MF) ? PreservedAnalyses::all() + : PreservedAnalyses::none(); +} + +bool FinalizeISelLegacyPass::runOnMachineFunction(MachineFunction &MF) { + return finalizeISel(MF); +} diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -317,4 +317,5 @@ #define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) #endif MACHINE_FUNCTION_PASS("machine-cp", MachineCopyPropagationPass()) +MACHINE_FUNCTION_PASS("finalize-isel", FinalizeISelPass()) #undef MACHINE_FUNCTION_PASS