From 3dad8697772fed45b884dc61b7f78d96aa6e442f Mon Sep 17 00:00:00 2001 From: Joao Saffran Date: Tue, 10 Dec 2024 00:22:18 +0000 Subject: [PATCH 1/4] adding opt flag to run spirv structurizer --- llvm/lib/Target/SPIRV/SPIRV.h | 1 + llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp | 2 +- llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp | 1 + llvm/tools/opt/optdriver.cpp | 2 +- 4 files changed, 4 insertions(+), 2 deletions(-) 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/SPIRVStructurizer.cpp b/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp index 13e05b6792751..641e6caa23f95 100644 --- a/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp @@ -1218,7 +1218,7 @@ INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) INITIALIZE_PASS_DEPENDENCY(SPIRVConvergenceRegionAnalysisWrapperPass) -INITIALIZE_PASS_END(SPIRVStructurizer, "structurize", "structurize SPIRV", +INITIALIZE_PASS_END(SPIRVStructurizer, "structurizer", "structurize SPIRV", false, false) FunctionPass *llvm::createSPIRVStructurizerPass() { diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp index d9d0d00cc71e4..744d4834b825c 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp @@ -45,6 +45,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSPIRVTarget() { initializeGlobalISel(PR); initializeSPIRVModuleAnalysisPass(PR); initializeSPIRVConvergenceRegionAnalysisWrapperPassPass(PR); + initializeSPIRVStructurizerPass(PR); } static std::string computeDataLayout(const Triple &TT) { diff --git a/llvm/tools/opt/optdriver.cpp b/llvm/tools/opt/optdriver.cpp index 8ef249e1708b9..d60000e8889a0 100644 --- a/llvm/tools/opt/optdriver.cpp +++ b/llvm/tools/opt/optdriver.cpp @@ -376,7 +376,7 @@ static bool shouldPinPassToLegacyPM(StringRef Pass) { "expand-large-fp-convert", "callbrprepare", "scalarizer", - }; + "structurizer"}; for (const auto &P : PassNamePrefix) if (Pass.starts_with(P)) return true; From 1cfd9fdba62d7952fd137121d24705c76a8b3246 Mon Sep 17 00:00:00 2001 From: Joao Saffran Date: Tue, 10 Dec 2024 17:29:18 +0000 Subject: [PATCH 2/4] fixing pass names --- llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp | 8 ++++---- llvm/tools/opt/optdriver.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp b/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp index 641e6caa23f95..a1d4a960f314a 100644 --- a/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp @@ -1211,15 +1211,15 @@ 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, "structurizer", "structurize SPIRV", - false, false) +INITIALIZE_PASS_END(SPIRVStructurizer, "spirv-structurizer", + "structurize SPIRV", false, false) FunctionPass *llvm::createSPIRVStructurizerPass() { return new SPIRVStructurizer(); diff --git a/llvm/tools/opt/optdriver.cpp b/llvm/tools/opt/optdriver.cpp index d60000e8889a0..58135d4695d52 100644 --- a/llvm/tools/opt/optdriver.cpp +++ b/llvm/tools/opt/optdriver.cpp @@ -376,7 +376,7 @@ static bool shouldPinPassToLegacyPM(StringRef Pass) { "expand-large-fp-convert", "callbrprepare", "scalarizer", - "structurizer"}; + "spirv-structurizer"}; for (const auto &P : PassNamePrefix) if (Pass.starts_with(P)) return true; From aaa5e52d3912dc2a102f34c5c3a8e3e75c0c380a Mon Sep 17 00:00:00 2001 From: Joao Saffran Date: Tue, 10 Dec 2024 19:01:56 +0000 Subject: [PATCH 3/4] adding new pass registry to spirv --- llvm/lib/Target/SPIRV/SPIRVPassRegistry.def | 21 +++++++++++++++ llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp | 11 ++++++++ .../Target/SPIRV/SPIRVStructurizerWrapper.h | 27 +++++++++++++++++++ llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp | 7 +++++ llvm/lib/Target/SPIRV/SPIRVTargetMachine.h | 2 ++ llvm/tools/opt/optdriver.cpp | 2 +- 6 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 llvm/lib/Target/SPIRV/SPIRVPassRegistry.def create mode 100644 llvm/lib/Target/SPIRV/SPIRVStructurizerWrapper.h 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 a1d4a960f314a..f0a427a45ed1e 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" @@ -1224,3 +1226,12 @@ INITIALIZE_PASS_END(SPIRVStructurizer, "spirv-structurizer", 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..3148be2ccda94 --- /dev/null +++ b/llvm/lib/Target/SPIRV/SPIRVStructurizerWrapper.h @@ -0,0 +1,27 @@ +//===- 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 744d4834b825c..d0bbc7697d24a 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp @@ -12,6 +12,7 @@ #include "SPIRVTargetMachine.h" #include "SPIRV.h" +#include "SPIRVStructurizerWrapper.h" #include "SPIRVCallLowering.h" #include "SPIRVGlobalRegistry.h" #include "SPIRVLegalizerInfo.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" @@ -93,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..034fd47e89e9b 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 diff --git a/llvm/tools/opt/optdriver.cpp b/llvm/tools/opt/optdriver.cpp index 58135d4695d52..20be267f0c29b 100644 --- a/llvm/tools/opt/optdriver.cpp +++ b/llvm/tools/opt/optdriver.cpp @@ -376,7 +376,7 @@ static bool shouldPinPassToLegacyPM(StringRef Pass) { "expand-large-fp-convert", "callbrprepare", "scalarizer", - "spirv-structurizer"}; + }; for (const auto &P : PassNamePrefix) if (Pass.starts_with(P)) return true; From 2d9f02d6d3f598fbe68a83377bb05d6b5c52c55d Mon Sep 17 00:00:00 2001 From: Joao Saffran Date: Tue, 10 Dec 2024 19:03:55 +0000 Subject: [PATCH 4/4] fix white space --- llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp | 3 ++- llvm/lib/Target/SPIRV/SPIRVStructurizerWrapper.h | 6 ++++-- llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp | 2 +- llvm/lib/Target/SPIRV/SPIRVTargetMachine.h | 2 +- llvm/tools/opt/optdriver.cpp | 2 +- 5 files changed, 9 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp b/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp index f0a427a45ed1e..336cde4e78224 100644 --- a/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVStructurizer.cpp @@ -1227,7 +1227,8 @@ FunctionPass *llvm::createSPIRVStructurizerPass() { return new SPIRVStructurizer(); } -PreservedAnalyses SPIRVStructurizerWrapper::run(Function &F, FunctionAnalysisManager &AF){ +PreservedAnalyses SPIRVStructurizerWrapper::run(Function &F, + FunctionAnalysisManager &AF) { FunctionPass *StructurizerPass = createSPIRVStructurizerPass(); if (!StructurizerPass->runOnFunction(F)) return PreservedAnalyses::all(); diff --git a/llvm/lib/Target/SPIRV/SPIRVStructurizerWrapper.h b/llvm/lib/Target/SPIRV/SPIRVStructurizerWrapper.h index 3148be2ccda94..cc69e20847c19 100644 --- a/llvm/lib/Target/SPIRV/SPIRVStructurizerWrapper.h +++ b/llvm/lib/Target/SPIRV/SPIRVStructurizerWrapper.h @@ -1,4 +1,5 @@ -//===- SPIRVStructurizerWrapper.h - New pass manager wrapper from SPIRV Structurizer -----------*- C++ -*-===// +//===- 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. @@ -17,7 +18,8 @@ namespace llvm { -class SPIRVStructurizerWrapper : public PassInfoMixin { +class SPIRVStructurizerWrapper + : public PassInfoMixin { public: PreservedAnalyses run(Function &M, FunctionAnalysisManager &AM); }; diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp index d0bbc7697d24a..dca67cb6c632b 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp +++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp @@ -12,10 +12,10 @@ #include "SPIRVTargetMachine.h" #include "SPIRV.h" -#include "SPIRVStructurizerWrapper.h" #include "SPIRVCallLowering.h" #include "SPIRVGlobalRegistry.h" #include "SPIRVLegalizerInfo.h" +#include "SPIRVStructurizerWrapper.h" #include "SPIRVTargetObjectFile.h" #include "SPIRVTargetTransformInfo.h" #include "TargetInfo/SPIRVTargetInfo.h" diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.h b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.h index 034fd47e89e9b..9c59d021dfc1b 100644 --- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.h +++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.h @@ -43,7 +43,7 @@ class SPIRVTargetMachine : public CodeGenTargetMachineImpl { TargetLoweringObjectFile *getObjFileLowering() const override { return TLOF.get(); } - + void registerPassBuilderCallbacks(PassBuilder &PB) override; }; } // namespace llvm diff --git a/llvm/tools/opt/optdriver.cpp b/llvm/tools/opt/optdriver.cpp index 20be267f0c29b..8ef249e1708b9 100644 --- a/llvm/tools/opt/optdriver.cpp +++ b/llvm/tools/opt/optdriver.cpp @@ -376,7 +376,7 @@ static bool shouldPinPassToLegacyPM(StringRef Pass) { "expand-large-fp-convert", "callbrprepare", "scalarizer", - }; + }; for (const auto &P : PassNamePrefix) if (Pass.starts_with(P)) return true;