[llvm] [SPIRV][OPT] Adding flag to run spirv structurizer (PR #119301)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 10 11:04:29 PST 2024
https://github.com/joaosaffran updated https://github.com/llvm/llvm-project/pull/119301
>From 3dad8697772fed45b884dc61b7f78d96aa6e442f Mon Sep 17 00:00:00 2001
From: Joao Saffran <jderezende at microsoft.com>
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 384133e7b4bd18..81b57202644256 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 13e05b67927518..641e6caa23f95a 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 d9d0d00cc71e41..744d4834b825c4 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 8ef249e1708b95..d60000e8889a05 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 <jderezende at microsoft.com>
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 641e6caa23f95a..a1d4a960f314a4 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 d60000e8889a05..58135d4695d529 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 <jderezende at microsoft.com>
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 00000000000000..e4f6c71d5d7910
--- /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 a1d4a960f314a4..f0a427a45ed1e7 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<CFGAnalyses>();
+ return PA;
+}
diff --git a/llvm/lib/Target/SPIRV/SPIRVStructurizerWrapper.h b/llvm/lib/Target/SPIRV/SPIRVStructurizerWrapper.h
new file mode 100644
index 00000000000000..3148be2ccda944
--- /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<SPIRVStructurizerWrapper> {
+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 744d4834b825c4..d0bbc7697d24a8 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 3ea0f671ff6d81..034fd47e89e9b3 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 58135d4695d529..20be267f0c29b1 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 <jderezende at microsoft.com>
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 f0a427a45ed1e7..336cde4e782246 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 3148be2ccda944..cc69e20847c19a 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<SPIRVStructurizerWrapper> {
+class SPIRVStructurizerWrapper
+ : public PassInfoMixin<SPIRVStructurizerWrapper> {
public:
PreservedAnalyses run(Function &M, FunctionAnalysisManager &AM);
};
diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
index d0bbc7697d24a8..dca67cb6c632bd 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 034fd47e89e9b3..9c59d021dfc1ba 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 20be267f0c29b1..8ef249e1708b95 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;
More information about the llvm-commits
mailing list