[llvm] [SPIR-V] Fix OpFunctionParameter vs. OpTypeFunction types for pointer arguments when there are functions with aggregate arguments (PR #115044)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 5 10:26:16 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-spir-v
Author: Vyacheslav Levytskyy (VyacheslavLevytskyy)
<details>
<summary>Changes</summary>
The goal of the PR is to ensure that if module contains functions with mutated signature (due to preprocessing of aggregate types), functions still are going through re-creating of function type to preserve pointee type information for arguments.
This fixes a bug when a module with (1) a function having aggregate arguments and/or return, and (2) at least two functions with signatures different only wrt. pointee types is translated so that one of two similar functions gets an incorrect OpFunctionParameter type that is different from the corresponding OpTypeFunction definition.
A reproducer is attached as a new test case.
---
Full diff: https://github.com/llvm/llvm-project/pull/115044.diff
2 Files Affected:
- (modified) llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp (-3)
- (added) llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll (+41)
``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
index f8ce02a13c0f67..98cf598a1f031a 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCallLowering.cpp
@@ -101,9 +101,6 @@ static FunctionType *
fixFunctionTypeIfPtrArgs(SPIRVGlobalRegistry *GR, const Function &F,
FunctionType *FTy, const SPIRVType *SRetTy,
const SmallVector<SPIRVType *, 4> &SArgTys) {
- if (F.getParent()->getNamedMetadata("spv.cloned_funcs"))
- return FTy;
-
bool hasArgPtrs = false;
for (auto &Arg : F.args()) {
// check if it's an instance of a non-typed PointerType
diff --git a/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll b/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll
new file mode 100644
index 00000000000000..73c46b18bfa787
--- /dev/null
+++ b/llvm/test/CodeGen/SPIRV/pointers/composite-fun-fix-ptr-arg.ll
@@ -0,0 +1,41 @@
+; The goal of the test case is to ensure that if module contains functions with mutated signature
+; (due to preprocessing of aggregate types), functions still are going through re-creating of
+; function type to preserve pointee type information for arguments.
+
+; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
+; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
+
+; RUN: llc -verify-machineinstrs -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-DAG: %[[#Int8:]] = OpTypeInt 8 0
+; CHECK-DAG: %[[#Half:]] = OpTypeFloat 16
+; CHECK-DAG: %[[#Struct:]] = OpTypeStruct %[[#Half]]
+; CHECK-DAG: %[[#Void:]] = OpTypeVoid
+; CHECK-DAG: %[[#PtrInt8:]] = OpTypePointer CrossWorkgroup %[[#Int8:]]
+; CHECK-DAG: %[[#FooType:]] = OpTypeFunction %[[#Void]] %[[#PtrInt8]] %[[#Struct]]
+; CHECK-DAG: %[[#Int64:]] = OpTypeInt 64 0
+; CHECK-DAG: %[[#PtrInt64:]] = OpTypePointer CrossWorkgroup %[[#Int64]]
+; CHECK-DAG: %[[#BarType:]] = OpTypeFunction %[[#Void]] %[[#PtrInt64]] %[[#Struct]]
+; CHECK: OpFunction %[[#Void]] None %[[#FooType]]
+; CHECK: OpFunctionParameter %[[#PtrInt8]]
+; CHECK: OpFunctionParameter %[[#Struct]]
+; CHECK: OpFunction %[[#Void]] None %[[#BarType]]
+; CHECK: OpFunctionParameter %[[#PtrInt64]]
+; CHECK: OpFunctionParameter %[[#Struct]]
+
+%t_half = type { half }
+
+define spir_kernel void @foo(ptr addrspace(1) %a, %t_half %b) {
+entry:
+ ret void
+}
+
+
+define spir_kernel void @bar(ptr addrspace(1) %a, %t_half %b) {
+entry:
+ %r = getelementptr inbounds i64, ptr addrspace(1) %a, i64 0
+ ret void
+}
+
+declare spir_func %t_half @_Z29__spirv_SpecConstantComposite(half)
``````````
</details>
https://github.com/llvm/llvm-project/pull/115044
More information about the llvm-commits
mailing list