[llvm] fix generation of unnecessary OpExecutionMode records (PR #81839)
Vyacheslav Levytskyy via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 15 01:55:12 PST 2024
https://github.com/VyacheslavLevytskyy updated https://github.com/llvm/llvm-project/pull/81839
>From 27ddf98338eca1537e61cfb36009ffa30d635075 Mon Sep 17 00:00:00 2001
From: "Levytskyy, Vyacheslav" <vyacheslav.levytskyy at intel.com>
Date: Thu, 15 Feb 2024 01:52:18 -0800
Subject: [PATCH 1/2] fix generation of unnecessary OpExecutionMode records
---
llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp | 4 +++-
llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp | 14 --------------
llvm/lib/Target/SPIRV/SPIRVUtils.cpp | 14 ++++++++++++++
llvm/lib/Target/SPIRV/SPIRVUtils.h | 3 +++
4 files changed, 20 insertions(+), 15 deletions(-)
diff --git a/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp b/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp
index 27da0f21f1571d..1fbf3c3e11aedc 100644
--- a/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVAsmPrinter.cpp
@@ -450,7 +450,9 @@ void SPIRVAsmPrinter::outputExecutionMode(const Module &M) {
}
for (auto FI = M.begin(), E = M.end(); FI != E; ++FI) {
const Function &F = *FI;
- if (F.isDeclaration())
+ // Only operands of OpEntryPoint instructions are allowed to be
+ // <Entry Point> operands of OpExecutionMode
+ if (F.isDeclaration() || !isEntryPoint(F))
continue;
Register FReg = MAI->getFuncReg(&F);
assert(FReg.isValid());
diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
index 8ac498e1556bec..4711cf67ffab6e 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
@@ -181,20 +181,6 @@ static SPIRVType *getArgSPIRVType(const Function &F, unsigned ArgIdx,
ArgAccessQual);
}
-static bool isEntryPoint(const Function &F) {
- // OpenCL handling: any function with the SPIR_KERNEL
- // calling convention will be a potential entry point.
- if (F.getCallingConv() == CallingConv::SPIR_KERNEL)
- return true;
-
- // HLSL handling: special attribute are emitted from the
- // front-end.
- if (F.getFnAttribute("hlsl.shader").isValid())
- return true;
-
- return false;
-}
-
static SPIRV::ExecutionModel::ExecutionModel
getExecutionModel(const SPIRVSubtarget &STI, const Function &F) {
if (STI.isOpenCLEnv())
diff --git a/llvm/lib/Target/SPIRV/SPIRVUtils.cpp b/llvm/lib/Target/SPIRV/SPIRVUtils.cpp
index d4f7d8e89af5e4..db5ae4e8c56c39 100644
--- a/llvm/lib/Target/SPIRV/SPIRVUtils.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVUtils.cpp
@@ -348,4 +348,18 @@ bool isSpecialOpaqueType(const Type *Ty) {
return false;
}
+
+bool isEntryPoint(const Function &F) {
+ // OpenCL handling: any function with the SPIR_KERNEL
+ // calling convention will be a potential entry point.
+ if (F.getCallingConv() == CallingConv::SPIR_KERNEL)
+ return true;
+
+ // HLSL handling: special attribute are emitted from the
+ // front-end.
+ if (F.getFnAttribute("hlsl.shader").isValid())
+ return true;
+
+ return false;
+}
} // namespace llvm
diff --git a/llvm/lib/Target/SPIRV/SPIRVUtils.h b/llvm/lib/Target/SPIRV/SPIRVUtils.h
index 60742e2f272808..a33dc02f854f58 100644
--- a/llvm/lib/Target/SPIRV/SPIRVUtils.h
+++ b/llvm/lib/Target/SPIRV/SPIRVUtils.h
@@ -97,5 +97,8 @@ bool hasBuiltinTypePrefix(StringRef Name);
// Check if given LLVM type is a special opaque builtin type.
bool isSpecialOpaqueType(const Type *Ty);
+
+// Check if the function is an SPIR-V entry point
+bool isEntryPoint(const Function &F);
} // namespace llvm
#endif // LLVM_LIB_TARGET_SPIRV_SPIRVUTILS_H
>From 10d6bd08b8bdd661fb1bb57796d8d2683fd4946e Mon Sep 17 00:00:00 2001
From: "Levytskyy, Vyacheslav" <vyacheslav.levytskyy at intel.com>
Date: Thu, 15 Feb 2024 01:55:01 -0800
Subject: [PATCH 2/2] add test
---
.../SPIRV/execution-mode-per-entry-point.ll | 39 +++++++++++++++++++
1 file changed, 39 insertions(+)
create mode 100644 llvm/test/CodeGen/SPIRV/execution-mode-per-entry-point.ll
diff --git a/llvm/test/CodeGen/SPIRV/execution-mode-per-entry-point.ll b/llvm/test/CodeGen/SPIRV/execution-mode-per-entry-point.ll
new file mode 100644
index 00000000000000..6fd1abd2be59ab
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/execution-mode-per-entry-point.ll
@@ -0,0 +1,39 @@
+; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
+
+; CHECK: OpMemoryModel
+; CHECK-DAG: OpEntryPoint Kernel %[[#ENTRY1:]] "foo1"
+; CHECK-DAG: OpEntryPoint Kernel %[[#ENTRY4:]] "foo4"
+; CHECK-NOT: OpSource
+; CHECK-DAG: OpExecutionMode %[[#ENTRY1]] {{[a-zA-Z]+}}
+; CHECK-DAG: OpExecutionMode %[[#ENTRY4]] {{[a-zA-Z]+}}
+; CHECK: OpSource
+
+; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECKN
+
+; CHECKN: OpMemoryModel
+; CHECKN-COUNT-2: OpEntryPoint Kernel
+; CHECKN-NOT: OpEntryPoint Kernel
+; CHECKN-COUNT-2: OpExecutionMode
+; CHECKN-NOT: OpExecutionMode
+; CHECKN: OpSource
+
+define spir_kernel void @foo1() {
+entry:
+ ret void
+}
+
+define void @foo2() {
+entry:
+ ret void
+}
+
+define dso_local spir_func void @foo3() {
+entry:
+ ret void
+}
+
+define spir_kernel void @foo4() {
+entry:
+ ret void
+}
More information about the llvm-commits
mailing list