Due to limitations in GISel / IRTranslator, the SPIR-V BE replaces aggregate function args with `i32` placeholders, which are subsequently used to retrieve the original type after IR translation, from metadata. Due to what appears to be an oversight, the current implementation only handles a single mutation, as it does not traverse the metadata, but rather only takes the first operand. This patch addresses that limitation by correctly iterating the metadata.
56 lines
2.3 KiB
LLVM
56 lines
2.3 KiB
LLVM
; 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: %[[#Float:]] = OpTypeFloat 32
|
|
; 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-DAG: %[[#BazType:]] = OpTypeFunction %[[#Void]] %[[#PtrInt8]] %[[#Struct]] %[[#Int8]] %[[#Struct]] %[[#Float]] %[[#Struct]]
|
|
; CHECK: OpFunction %[[#Void]] None %[[#FooType]]
|
|
; CHECK: OpFunctionParameter %[[#PtrInt8]]
|
|
; CHECK: OpFunctionParameter %[[#Struct]]
|
|
; CHECK: OpFunction %[[#Void]] None %[[#BarType]]
|
|
; CHECK: OpFunctionParameter %[[#PtrInt64]]
|
|
; CHECK: OpFunctionParameter %[[#Struct]]
|
|
; CHECK: OpFunction %[[#Void]] None %[[#BazType]]
|
|
; CHECK: OpFunctionParameter %[[#PtrInt8]]
|
|
; CHECK: OpFunctionParameter %[[#Struct]]
|
|
; CHECK: OpFunctionParameter %[[#Int8]]
|
|
; CHECK: OpFunctionParameter %[[#Struct]]
|
|
; CHECK: OpFunctionParameter %[[#Float]]
|
|
; 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
|
|
}
|
|
|
|
define spir_kernel void @baz(ptr addrspace(1) %a, %t_half %b, i8 %c, %t_half %d, float %e, %t_half %f) {
|
|
entry:
|
|
ret void
|
|
}
|
|
|
|
declare spir_func %t_half @_Z29__spirv_SpecConstantComposite(half)
|