diff --git a/llvm/lib/Target/SPIRV/SPIRV.h b/llvm/lib/Target/SPIRV/SPIRV.h index 384133e7b4bd1..81b5720264425 100644 --- a/llvm/lib/Target/SPIRV/SPIRV.h +++ b/llvm/lib/Target/SPIRV/SPIRV.h @@ -37,6 +37,7 @@ void initializeSPIRVModuleAnalysisPass(PassRegistry &); void initializeSPIRVConvergenceRegionAnalysisWrapperPassPass(PassRegistry &); void initializeSPIRVPreLegalizerPass(PassRegistry &); void initializeSPIRVPostLegalizerPass(PassRegistry &); +void initializeSPIRVStructurizerPass(PassRegistry &); void initializeSPIRVEmitIntrinsicsPass(PassRegistry &); void initializeSPIRVEmitNonSemanticDIPass(PassRegistry &); } // namespace llvm diff --git a/llvm/lib/Target/SPIRV/SPIRVPassRegistry.def b/llvm/lib/Target/SPIRV/SPIRVPassRegistry.def new file mode 100644 index 0000000000000..e4f6c71d5d791 --- /dev/null +++ b/llvm/lib/Target/SPIRV/SPIRVPassRegistry.def @@ -0,0 +1,21 @@ +//===- SPIRVPassRegistry.def - Registry of SPIRV passes -----*- 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 file is used as the registry of passes that are part of the +// SPIRV backend. +// +//===----------------------------------------------------------------------===// + +// NOTE: NO INCLUDE GUARD DESIRED! + + +#ifndef FUNCTION_PASS +#define FUNCTION_PASS(NAME, CREATE_PASS) +#endif +FUNCTION_PASS("spirv-structurizer", SPIRVStructurizerWrapper()) +#undef FUNCTION_PASS diff --git a/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp b/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp index 13e05b6792751..336cde4e78224 100644 --- a/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp @@ -10,6 +10,7 @@ #include "Analysis/SPIRVConvergenceRegionAnalysis.h" #include "SPIRV.h" +#include "SPIRVStructurizerWrapper.h" #include "SPIRVSubtarget.h" #include "SPIRVTargetMachine.h" #include "SPIRVUtils.h" @@ -17,6 +18,7 @@ #include "llvm/ADT/SmallPtrSet.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/CodeGen/IntrinsicLowering.h" +#include "llvm/IR/Analysis.h" #include "llvm/IR/CFG.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/IRBuilder.h" @@ -1211,16 +1213,26 @@ class SPIRVStructurizer : public FunctionPass { char SPIRVStructurizer::ID = 0; -INITIALIZE_PASS_BEGIN(SPIRVStructurizer, "structurizer", "structurize SPIRV", - false, false) +INITIALIZE_PASS_BEGIN(SPIRVStructurizer, "spirv-structurizer", + "structurize SPIRV", false, false) INITIALIZE_PASS_DEPENDENCY(LoopSimplify) INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) INITIALIZE_PASS_DEPENDENCY(SPIRVConvergenceRegionAnalysisWrapperPass) -INITIALIZE_PASS_END(SPIRVStructurizer, "structurize", "structurize SPIRV", - false, false) +INITIALIZE_PASS_END(SPIRVStructurizer, "spirv-structurizer", + "structurize SPIRV", false, false) FunctionPass *llvm::createSPIRVStructurizerPass() { return new SPIRVStructurizer(); } + +PreservedAnalyses SPIRVStructurizerWrapper::run(Function &F, + FunctionAnalysisManager &AF) { + FunctionPass *StructurizerPass = createSPIRVStructurizerPass(); + if (!StructurizerPass->runOnFunction(F)) + return PreservedAnalyses::all(); + PreservedAnalyses PA; + PA.preserveSet(); + return PA; +} diff --git a/llvm/lib/Target/SPIRV/SPIRVStructurizerWrapper.h b/llvm/lib/Target/SPIRV/SPIRVStructurizerWrapper.h new file mode 100644 index 0000000000000..cc69e20847c19 --- /dev/null +++ b/llvm/lib/Target/SPIRV/SPIRVStructurizerWrapper.h @@ -0,0 +1,29 @@ +//===- SPIRVStructurizerWrapper.h - New pass manager wrapper from SPIRV +// Structurizer -----------*- 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 +// +//===----------------------------------------------------------------------===// +// +// \file New pass manager wrapper from SPIRV Structurizer. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIB_TARGET_DIRECTX_SPIRVSTRUCTURIZER_H +#define LLVM_LIB_TARGET_DIRECTX_SPIRVSTRUCTURIZER_H + +#include "llvm/IR/PassManager.h" + +namespace llvm { + +class SPIRVStructurizerWrapper + : public PassInfoMixin { +public: + PreservedAnalyses run(Function &M, FunctionAnalysisManager &AM); +}; + +} // namespace llvm + +#endif // LLVM_LIB_TARGET_DIRECTX_SPIRVSTRUCTURIZER_H diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp index d9d0d00cc71e4..dca67cb6c632b 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp @@ -15,6 +15,7 @@ #include "SPIRVCallLowering.h" #include "SPIRVGlobalRegistry.h" #include "SPIRVLegalizerInfo.h" +#include "SPIRVStructurizerWrapper.h" #include "SPIRVTargetObjectFile.h" #include "SPIRVTargetTransformInfo.h" #include "TargetInfo/SPIRVTargetInfo.h" @@ -28,6 +29,7 @@ #include "llvm/InitializePasses.h" #include "llvm/MC/TargetRegistry.h" #include "llvm/Pass.h" +#include "llvm/Passes/PassBuilder.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Transforms/Scalar/Reg2Mem.h" #include "llvm/Transforms/Utils.h" @@ -45,6 +47,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSPIRVTarget() { initializeGlobalISel(PR); initializeSPIRVModuleAnalysisPass(PR); initializeSPIRVConvergenceRegionAnalysisWrapperPassPass(PR); + initializeSPIRVStructurizerPass(PR); } static std::string computeDataLayout(const Triple &TT) { @@ -92,6 +95,11 @@ SPIRVTargetMachine::SPIRVTargetMachine(const Target &T, const Triple &TT, setRequiresStructuredCFG(false); } +void SPIRVTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) { +#define GET_PASS_REGISTRY "SPIRVPassRegistry.def" +#include "llvm/Passes/TargetPassRegistry.inc" +} + namespace { // SPIR-V Code Generator Pass Configuration Options. class SPIRVPassConfig : public TargetPassConfig { diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.h b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.h index 3ea0f671ff6d8..9c59d021dfc1b 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.h +++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.h @@ -43,6 +43,8 @@ class SPIRVTargetMachine : public CodeGenTargetMachineImpl { TargetLoweringObjectFile *getObjFileLowering() const override { return TLOF.get(); } + + void registerPassBuilderCallbacks(PassBuilder &PB) override; }; } // namespace llvm