[Frontend] Remove unused includes (NFC) (#116927)
[llvm-project.git] / llvm / test / CodeGen / SPIRV / transcoding / global_block.ll
blobff1bec4497ba2ae4738fcb7406291f9779a795a0
1 ; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV1_4
2 ; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
4 ; TODO(#60133): Requires updates following opaque pointer migration.
5 ; XFAIL: *
7 ;; There are no blocks in SPIR-V. Therefore they are translated into regular
8 ;; functions. An LLVM module which uses blocks, also contains some auxiliary
9 ;; block-specific instructions, which are redundant in SPIR-V and should be
10 ;; removed
12 ;; kernel void block_kernel(__global int* res) {
13 ;;   typedef int (^block_t)(int);
14 ;;   constant block_t b1 = ^(int i) { return i + 1; };
15 ;;   *res = b1(5);
16 ;; }
18 ; CHECK-SPIRV1_4:   OpEntryPoint Kernel %[[#]] "block_kernel" %[[#InterfaceId:]]
19 ; CHECK-SPIRV1_4:   OpName %[[#InterfaceId]] "__block_literal_global"
20 ; CHECK-SPIRV:      OpName %[[#block_invoke:]] "_block_invoke"
21 ; CHECK-SPIRV:      %[[#int:]] = OpTypeInt 32
22 ; CHECK-SPIRV:      %[[#int8:]] = OpTypeInt 8
23 ; CHECK-SPIRV:      %[[#int8Ptr:]] = OpTypePointer Generic %[[#int8]]
24 ; CHECK-SPIRV:      %[[#block_invoke_type:]] = OpTypeFunction %[[#int]] %[[#int8Ptr]] %[[#int]]
25 ; CHECK-SPIRV:      %[[#five:]] = OpConstant %[[#int]] 5
27 ; CHECK-SPIRV:      %[[#]] = OpFunctionCall %[[#int]] %[[#block_invoke]] %[[#]] %[[#five]]
29 ; CHECK-SPIRV:      %[[#block_invoke]] = OpFunction %[[#int]] DontInline %[[#block_invoke_type]]
30 ; CHECK-SPIRV-NEXT: %[[#]] = OpFunctionParameter %[[#int8Ptr]]
31 ; CHECK-SPIRV-NEXT: %[[#]] = OpFunctionParameter %[[#int]]
33 %struct.__opencl_block_literal_generic = type { i32, i32, i8 addrspace(4)* }
35 @block_kernel.b1 = internal addrspace(2) constant %struct.__opencl_block_literal_generic addrspace(4)* addrspacecast (%struct.__opencl_block_literal_generic addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* @__block_literal_global to %struct.__opencl_block_literal_generic addrspace(1)*) to %struct.__opencl_block_literal_generic addrspace(4)*), align 4
36 @__block_literal_global = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 12, i32 4, i8 addrspace(4)* addrspacecast (i8* bitcast (i32 (i8 addrspace(4)*, i32)* @_block_invoke to i8*) to i8 addrspace(4)*) }, align 4
38 define dso_local spir_kernel void @block_kernel(i32 addrspace(1)* noundef %res) {
39 entry:
40   %res.addr = alloca i32 addrspace(1)*, align 4
41   store i32 addrspace(1)* %res, i32 addrspace(1)** %res.addr, align 4
42   %call = call spir_func i32 @_block_invoke(i8 addrspace(4)* noundef addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* @__block_literal_global to i8 addrspace(1)*) to i8 addrspace(4)*), i32 noundef 5)
43   %0 = load i32 addrspace(1)*, i32 addrspace(1)** %res.addr, align 4
44   store i32 %call, i32 addrspace(1)* %0, align 4
45   ret void
48 define internal spir_func i32 @_block_invoke(i8 addrspace(4)* noundef %.block_descriptor, i32 noundef %i) #0 {
49 entry:
50   %.block_descriptor.addr = alloca i8 addrspace(4)*, align 4
51   %i.addr = alloca i32, align 4
52   %block.addr = alloca <{ i32, i32, i8 addrspace(4)* }> addrspace(4)*, align 4
53   store i8 addrspace(4)* %.block_descriptor, i8 addrspace(4)** %.block_descriptor.addr, align 4
54   %block = bitcast i8 addrspace(4)* %.block_descriptor to <{ i32, i32, i8 addrspace(4)* }> addrspace(4)*
55   store i32 %i, i32* %i.addr, align 4
56   store <{ i32, i32, i8 addrspace(4)* }> addrspace(4)* %block, <{ i32, i32, i8 addrspace(4)* }> addrspace(4)** %block.addr, align 4
57   %0 = load i32, i32* %i.addr, align 4
58   %add = add nsw i32 %0, 1
59   ret i32 %add
62 attributes #0 = { noinline }