diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp index d10a0c0a08f89..7c8f101fa1538 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp @@ -41,6 +41,7 @@ #include "llvm/MC/MCTargetOptions.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Pass.h" +#include "llvm/Passes/CodeGenPassBuilder.h" #include "llvm/Passes/PassBuilder.h" #include "llvm/Support/CodeGen.h" #include "llvm/Support/CommandLine.h" @@ -562,8 +563,39 @@ class AArch64PassConfig : public TargetPassConfig { std::unique_ptr getCSEConfig() const override; }; +class AArch64CodeGenPassBuilder + : public CodeGenPassBuilder { + using Base = + CodeGenPassBuilder; + +public: + AArch64CodeGenPassBuilder(AArch64TargetMachine &TM, + const CGPassBuilderOption &Opts, + PassInstrumentationCallbacks *PIC) + : CodeGenPassBuilder(TM, Opts, PIC) {} + void addPreISel(AddIRPass &) const { + // TODO: Add pre-isel passes + } + void addAsmPrinter(AddMachinePass &addPass, CreateMCStreamer) const { + // TODO: Add asm printer passes + } + Error addInstSelector(AddMachinePass &) const { + // TODO: Add instruction selector passes + return Error::success(); + } +}; + } // end anonymous namespace +Error AArch64TargetMachine::buildCodeGenPipeline( + ModulePassManager &MPM, raw_pwrite_stream &Out, raw_pwrite_stream *DwoOut, + CodeGenFileType FileType, const CGPassBuilderOption &Opts, + PassInstrumentationCallbacks *PIC) { + AArch64CodeGenPassBuilder Builder(*this, Opts, PIC); + return Builder.buildPipeline(MPM, Out, DwoOut, FileType); +} + void AArch64TargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) { PB.registerLateLoopOptimizationsEPCallback( diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.h b/llvm/lib/Target/AArch64/AArch64TargetMachine.h index f8ba41f215430..4fb4581c63547 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetMachine.h +++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.h @@ -46,6 +46,12 @@ class AArch64TargetMachine : public CodeGenTargetMachineImpl { // Pass Pipeline Configuration TargetPassConfig *createPassConfig(PassManagerBase &PM) override; + Error buildCodeGenPipeline(ModulePassManager &MPM, raw_pwrite_stream &Out, + raw_pwrite_stream *DwoOut, + CodeGenFileType FileType, + const CGPassBuilderOption &Opts, + PassInstrumentationCallbacks *PIC) override; + void registerPassBuilderCallbacks(PassBuilder &PB) override; TargetTransformInfo getTargetTransformInfo(const Function &F) const override; diff --git a/llvm/lib/Target/AArch64/CMakeLists.txt b/llvm/lib/Target/AArch64/CMakeLists.txt index 2300e479bc110..e7acc08f6f1eb 100644 --- a/llvm/lib/Target/AArch64/CMakeLists.txt +++ b/llvm/lib/Target/AArch64/CMakeLists.txt @@ -105,6 +105,7 @@ add_llvm_target(AArch64CodeGen Core GlobalISel MC + Passes Scalar SelectionDAG Support diff --git a/llvm/test/CodeGen/AArch64/machine-latecleanup-inlineasm.mir b/llvm/test/CodeGen/AArch64/machine-latecleanup-inlineasm.mir index 9a8e5c6341bca..5ce0fca6cd179 100644 --- a/llvm/test/CodeGen/AArch64/machine-latecleanup-inlineasm.mir +++ b/llvm/test/CodeGen/AArch64/machine-latecleanup-inlineasm.mir @@ -1,6 +1,9 @@ # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2 # RUN: llc -start-before=machine-latecleanup -stop-after=machine-latecleanup \ # RUN: -o - %s | FileCheck %s + +# RUN: llc -enable-new-pm -passes=machine-latecleanup \ +# RUN: -o - %s | FileCheck %s --- | ; ModuleID = 'reduced5.ll' source_filename = "reduced5.ll"