| Vyacheslav Levytskyy | 1ed1ec9 | 2024-04-26 12:17:47 +0200 | [diff] [blame] | 1 | ; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s |
| 2 | ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %} |
| 3 | |
| 4 | ; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s |
| 5 | ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %} |
| 6 | |
| 7 | ; CHECK-DAG: %[[#TyEvent:]] = OpTypeEvent |
| 8 | ; CHECK-DAG: %[[#TyStruct:]] = OpTypeStruct %[[#TyEvent]] |
| 9 | ; CHECK-DAG: %[[#ConstEvent:]] = OpConstantNull %[[#TyEvent]] |
| 10 | ; CHECK-DAG: %[[#TyEventPtr:]] = OpTypePointer Function %[[#TyEvent]] |
| Vyacheslav Levytskyy | bf9e9e5 | 2024-07-03 17:56:41 +0200 | [diff] [blame] | 11 | ; CHECK-DAG: %[[#TyEventPtrGen:]] = OpTypePointer Generic %[[#TyEvent]] |
| Vyacheslav Levytskyy | 1ed1ec9 | 2024-04-26 12:17:47 +0200 | [diff] [blame] | 12 | ; CHECK-DAG: %[[#TyStructPtr:]] = OpTypePointer Function %[[#TyStruct]] |
| Vyacheslav Levytskyy | bf9e9e5 | 2024-07-03 17:56:41 +0200 | [diff] [blame] | 13 | ; CHECK-DAG: %[[#TyChar:]] = OpTypeInt 8 0 |
| 14 | ; CHECK-DAG: %[[#TyV4:]] = OpTypeVector %[[#TyChar]] 4 |
| 15 | ; CHECK-DAG: %[[#TyStructV4:]] = OpTypeStruct %[[#TyV4]] |
| Vyacheslav Levytskyy | bf9e9e5 | 2024-07-03 17:56:41 +0200 | [diff] [blame] | 16 | ; CHECK-DAG: %[[#TyPtrSV4_CW:]] = OpTypePointer CrossWorkgroup %[[#TyStructV4]] |
| 17 | ; CHECK-DAG: %[[#TyPtrV4_W:]] = OpTypePointer Workgroup %[[#TyV4]] |
| 18 | ; CHECK-DAG: %[[#TyPtrV4_CW:]] = OpTypePointer CrossWorkgroup %[[#TyV4]] |
| Vyacheslav Levytskyy | 489db65 | 2024-12-06 09:59:33 +0100 | [diff] [blame] | 19 | ; CHECK-DAG: %[[#TyHalf:]] = OpTypeFloat 16 |
| 20 | ; CHECK-DAG: %[[#TyHalfV2:]] = OpTypeVector %[[#TyHalf]] 2 |
| 21 | ; CHECK-DAG: %[[#TyHalfV2_W:]] = OpTypePointer Workgroup %[[#TyHalfV2]] |
| 22 | ; CHECK-DAG: %[[#TyHalfV2_CW:]] = OpTypePointer CrossWorkgroup %[[#TyHalfV2]] |
| Vyacheslav Levytskyy | bf9e9e5 | 2024-07-03 17:56:41 +0200 | [diff] [blame] | 23 | |
| 24 | ; Check correct translation of __spirv_GroupAsyncCopy and target("spirv.Event") zeroinitializer |
| 25 | |
| Vyacheslav Levytskyy | 1ed1ec9 | 2024-04-26 12:17:47 +0200 | [diff] [blame] | 26 | ; CHECK: OpFunction |
| Vyacheslav Levytskyy | 489db65 | 2024-12-06 09:59:33 +0100 | [diff] [blame] | 27 | ; CHECK: %[[#HalfA1:]] = OpFunctionParameter %[[#TyHalfV2_W:]] |
| 28 | ; CHECK: %[[#HalfA2:]] = OpFunctionParameter %[[#TyHalfV2_CW:]] |
| 29 | ; CHECK: OpGroupAsyncCopy %[[#TyEvent]] %[[#]] %[[#HalfA1]] %[[#HalfA2]] %[[#]] %[[#]] %[[#ConstEvent]] |
| 30 | ; CHECK: OpFunctionEnd |
| 31 | |
| 32 | %StructEvent = type { target("spirv.Event") } |
| 33 | |
| 34 | define spir_kernel void @test_half(ptr addrspace(3) %_arg1, ptr addrspace(1) %_arg2) { |
| 35 | entry: |
| 36 | %r = tail call spir_func target("spirv.Event") @_Z22__spirv_GroupAsyncCopyjPU3AS3Dv2_DF16_PU3AS1KS_mm9ocl_event(i32 2, ptr addrspace(3) %_arg1, ptr addrspace(1) %_arg2, i64 16, i64 10, target("spirv.Event") zeroinitializer) |
| 37 | ret void |
| 38 | } |
| 39 | |
| 40 | declare dso_local spir_func target("spirv.Event") @_Z22__spirv_GroupAsyncCopyjPU3AS3Dv2_DF16_PU3AS1KS_mm9ocl_event(i32 noundef, ptr addrspace(3) noundef, ptr addrspace(1) noundef, i64 noundef, i64 noundef, target("spirv.Event")) |
| 41 | |
| 42 | ; CHECK: OpFunction |
| Vyacheslav Levytskyy | 1ed1ec9 | 2024-04-26 12:17:47 +0200 | [diff] [blame] | 43 | ; CHECK: OpFunctionParameter |
| 44 | ; CHECK: %[[#Src:]] = OpFunctionParameter |
| 45 | ; CHECK: OpVariable %[[#TyStructPtr]] Function |
| 46 | ; CHECK: %[[#EventVar:]] = OpVariable %[[#TyEventPtr]] Function |
| 47 | ; CHECK: %[[#Dest:]] = OpInBoundsPtrAccessChain |
| 48 | ; CHECK: %[[#CopyRes:]] = OpGroupAsyncCopy %[[#TyEvent]] %[[#]] %[[#Dest]] %[[#Src]] %[[#]] %[[#]] %[[#ConstEvent]] |
| 49 | ; CHECK: OpStore %[[#EventVar]] %[[#CopyRes]] |
| Vyacheslav Levytskyy | bf9e9e5 | 2024-07-03 17:56:41 +0200 | [diff] [blame] | 50 | ; CHECK: OpFunctionEnd |
| Vyacheslav Levytskyy | 1ed1ec9 | 2024-04-26 12:17:47 +0200 | [diff] [blame] | 51 | |
| Vyacheslav Levytskyy | bf9e9e5 | 2024-07-03 17:56:41 +0200 | [diff] [blame] | 52 | define spir_kernel void @foo(ptr addrspace(1) %_arg_out_ptr, ptr addrspace(3) %_arg_local_acc) { |
| Vyacheslav Levytskyy | 1ed1ec9 | 2024-04-26 12:17:47 +0200 | [diff] [blame] | 53 | entry: |
| Vyacheslav Levytskyy | bf9e9e5 | 2024-07-03 17:56:41 +0200 | [diff] [blame] | 54 | %var = alloca %StructEvent |
| Vyacheslav Levytskyy | 1ed1ec9 | 2024-04-26 12:17:47 +0200 | [diff] [blame] | 55 | %dev_event.i.sroa.0 = alloca target("spirv.Event") |
| 56 | %add.ptr.i26 = getelementptr inbounds i32, ptr addrspace(1) %_arg_out_ptr, i64 0 |
| 57 | %call3.i = tail call spir_func target("spirv.Event") @_Z22__spirv_GroupAsyncCopyjPU3AS1iPU3AS3Kimm9ocl_event(i32 2, ptr addrspace(1) %add.ptr.i26, ptr addrspace(3) %_arg_local_acc, i64 16, i64 10, target("spirv.Event") zeroinitializer) |
| 58 | store target("spirv.Event") %call3.i, ptr %dev_event.i.sroa.0 |
| 59 | ret void |
| 60 | } |
| 61 | |
| 62 | declare dso_local spir_func target("spirv.Event") @_Z22__spirv_GroupAsyncCopyjPU3AS1iPU3AS3Kimm9ocl_event(i32, ptr addrspace(1), ptr addrspace(3), i64, i64, target("spirv.Event")) |
| Vyacheslav Levytskyy | bf9e9e5 | 2024-07-03 17:56:41 +0200 | [diff] [blame] | 63 | |
| 64 | ; Check correct type inference when calling __spirv_GroupAsyncCopy: |
| 65 | ; we expect that the Backend is able to deduce a type of the %_arg_Local |
| 66 | ; given facts that it's possible to deduce a type of the %_arg |
| 67 | ; and %_arg_Local and %_arg are source/destination arguments in OpGroupAsyncCopy |
| 68 | |
| 69 | ; CHECK: OpFunction |
| Vyacheslav Levytskyy | 489db65 | 2024-12-06 09:59:33 +0100 | [diff] [blame] | 70 | ; CHECK: %[[#BarArg1:]] = OpFunctionParameter %[[#TyPtrV4_W]] |
| Vyacheslav Levytskyy | bf9e9e5 | 2024-07-03 17:56:41 +0200 | [diff] [blame] | 71 | ; CHECK: %[[#BarArg2:]] = OpFunctionParameter %[[#TyPtrSV4_CW]] |
| 72 | ; CHECK: %[[#EventVarBar:]] = OpVariable %[[#TyStructPtr]] Function |
| Vyacheslav Levytskyy | dbd00a5 | 2024-07-11 07:16:29 +0200 | [diff] [blame] | 73 | ; CHECK: %[[#EventVarBarCasted2:]] = OpBitcast %[[#TyEventPtr]] %[[#EventVarBar]] |
| Vyacheslav Levytskyy | 489db65 | 2024-12-06 09:59:33 +0100 | [diff] [blame] | 74 | ; CHECK: %[[#ResBar:]] = OpGroupAsyncCopy %[[#TyEvent]] %[[#]] %[[#BarArg1]] %[[#]] %[[#]] %[[#]] %[[#ConstEvent]] |
| Vyacheslav Levytskyy | bf9e9e5 | 2024-07-03 17:56:41 +0200 | [diff] [blame] | 75 | ; CHECK: %[[#EventVarBarCasted:]] = OpBitcast %[[#TyEventPtr]] %[[#EventVarBar]] |
| 76 | ; CHECK: OpStore %[[#EventVarBarCasted]] %[[#ResBar]] |
| Vyacheslav Levytskyy | bf9e9e5 | 2024-07-03 17:56:41 +0200 | [diff] [blame] | 77 | ; CHECK: %[[#EventVarBarGen:]] = OpPtrCastToGeneric %[[#TyEventPtrGen]] %[[#EventVarBarCasted2]] |
| 78 | ; CHECK: OpGroupWaitEvents %[[#]] %[[#]] %[[#EventVarBarGen]] |
| 79 | ; CHECK: OpFunctionEnd |
| 80 | |
| 81 | %Vec4 = type { <4 x i8> } |
| 82 | |
| 83 | define spir_kernel void @bar(ptr addrspace(3) %_arg_Local, ptr addrspace(1) readonly %_arg) { |
| 84 | entry: |
| 85 | %E1 = alloca %StructEvent |
| 86 | %srcptr = getelementptr inbounds %Vec4, ptr addrspace(1) %_arg, i64 0 |
| 87 | %r1 = tail call spir_func target("spirv.Event") @_Z22__spirv_GroupAsyncCopyjPU3AS3Dv4_aPU3AS1KS_mm9ocl_event(i32 2, ptr addrspace(3) %_arg_Local, ptr addrspace(1) %srcptr, i64 16, i64 10, target("spirv.Event") zeroinitializer) |
| 88 | store target("spirv.Event") %r1, ptr %E1 |
| 89 | %E.ascast.i = addrspacecast ptr %E1 to ptr addrspace(4) |
| 90 | call spir_func void @_Z23__spirv_GroupWaitEventsjiP9ocl_event(i32 2, i32 1, ptr addrspace(4) %E.ascast.i) |
| 91 | ret void |
| 92 | } |
| 93 | |
| 94 | declare dso_local spir_func target("spirv.Event") @_Z22__spirv_GroupAsyncCopyjPU3AS3Dv4_aPU3AS1KS_mm9ocl_event(i32, ptr addrspace(3), ptr addrspace(1), i64, i64, target("spirv.Event")) |
| 95 | declare dso_local spir_func void @_Z23__spirv_GroupWaitEventsjiP9ocl_event(i32, i32, ptr addrspace(4)) |