|
1 |
| -// RUN: %clang_cc1 -fsycl-is-device -triple spir64-unknown-unknown -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s |
| 1 | +// RUN: %clang_cc1 -fsycl-is-device -triple spir64-unknown-unknown -disable-llvm-passes -opaque-pointers -emit-llvm %s -o - | FileCheck %s |
2 | 2 | #include "Inputs/sycl.hpp"
|
3 | 3 |
|
4 | 4 | struct Base {
|
@@ -26,72 +26,67 @@ int main() {
|
26 | 26 | // CHECK: define {{.*}}spir_kernel void @_ZTSZ4mainE6kernel
|
27 | 27 | // CHECK-SAME: i32 noundef [[ARG_A:%[a-zA-Z0-9_]+]],
|
28 | 28 | // CHECK-SAME: i32 noundef [[ARG_B:%[a-zA-Z0-9_]+]],
|
29 |
| -// CHECK-SAME: i8 addrspace(1)* noundef readonly align 1 [[ACC1_DATA:%[a-zA-Z0-9_]+]], |
30 |
| -// CHECK-SAME: %[[RANGE_TYPE]]* noundef byval(%[[RANGE_TYPE]]) align 4 [[ACC1_RANGE1:%[a-zA-Z0-9_]+]], |
31 |
| -// CHECK-SAME: %[[RANGE_TYPE]]* noundef byval(%[[RANGE_TYPE]]) align 4 [[ACC1_RANGE2:%[a-zA-Z0-9_]+]], |
32 |
| -// CHECK-SAME: %[[ID_TYPE]]* noundef byval(%[[ID_TYPE]]) align 4 [[ACC1_ID:%[a-zA-Z0-9_]+]], |
33 |
| -// CHECK-SAME: i8 addrspace(1)* noundef readonly align 1 [[ACC2_DATA:%[a-zA-Z0-9_]+]], |
34 |
| -// CHECK-SAME: %[[RANGE_TYPE]]* noundef byval(%[[RANGE_TYPE]]) align 4 [[ACC2_RANGE1:%[a-zA-Z0-9_]+]], |
35 |
| -// CHECK-SAME: %[[RANGE_TYPE]]* noundef byval(%[[RANGE_TYPE]]) align 4 [[ACC2_RANGE2:%[a-zA-Z0-9_]+]], |
36 |
| -// CHECK-SAME: %[[ID_TYPE]]* noundef byval(%[[ID_TYPE]]) align 4 [[ACC2_ID:%[a-zA-Z0-9_]+]], |
| 29 | +// CHECK-SAME: ptr addrspace(1) noundef readonly align 1 [[ACC1_DATA:%[a-zA-Z0-9_]+]], |
| 30 | +// CHECK-SAME: ptr noundef byval(%[[RANGE_TYPE]]) align 4 [[ACC1_RANGE1:%[a-zA-Z0-9_]+]], |
| 31 | +// CHECK-SAME: ptr noundef byval(%[[RANGE_TYPE]]) align 4 [[ACC1_RANGE2:%[a-zA-Z0-9_]+]], |
| 32 | +// CHECK-SAME: ptr noundef byval(%[[ID_TYPE]]) align 4 [[ACC1_ID:%[a-zA-Z0-9_]+]], |
| 33 | +// CHECK-SAME: ptr addrspace(1) noundef readonly align 1 [[ACC2_DATA:%[a-zA-Z0-9_]+]], |
| 34 | +// CHECK-SAME: ptr noundef byval(%[[RANGE_TYPE]]) align 4 [[ACC2_RANGE1:%[a-zA-Z0-9_]+]], |
| 35 | +// CHECK-SAME: ptr noundef byval(%[[RANGE_TYPE]]) align 4 [[ACC2_RANGE2:%[a-zA-Z0-9_]+]], |
| 36 | +// CHECK-SAME: ptr noundef byval(%[[ID_TYPE]]) align 4 [[ACC2_ID:%[a-zA-Z0-9_]+]], |
37 | 37 | // CHECK-SAME: i32 noundef [[ARG_C:%[a-zA-Z0-9_]+]])
|
38 | 38 |
|
39 | 39 | // Allocas and addrspacecasts for kernel parameters
|
40 | 40 | // CHECK: [[ARG_A]].addr = alloca i32
|
41 | 41 | // CHECK: [[ARG_B]].addr = alloca i32
|
42 |
| -// CHECK: [[ACC1_DATA]].addr = alloca i8 addrspace(1) |
43 |
| -// CHECK: [[ACC2_DATA]].addr = alloca i8 addrspace(1)* |
| 42 | +// CHECK: [[ACC1_DATA]].addr = alloca ptr addrspace(1) |
| 43 | +// CHECK: [[ACC2_DATA]].addr = alloca ptr addrspace(1) |
44 | 44 | // CHECK: [[ARG_C]].addr = alloca i32
|
45 | 45 | // CHECK: [[KERNEL:%[a-zA-Z0-9_]+]] = alloca %class{{.*}}.anon
|
46 |
| -// CHECK: [[ARG_A]].addr.ascast = addrspacecast i32* [[ARG_A]].addr to i32 addrspace(4)* |
47 |
| -// CHECK: [[ARG_B]].addr.ascast = addrspacecast i32* [[ARG_B]].addr to i32 addrspace(4)* |
48 |
| -// CHECK: [[ACC1_DATA]].addr.ascast = addrspacecast i8 addrspace(1)** [[ACC1_DATA]].addr to i8 addrspace(1)* addrspace(4)* |
49 |
| -// CHECK: [[ACC2_DATA]].addr.ascast = addrspacecast i8 addrspace(1)** [[ACC2_DATA]].addr to i8 addrspace(1)* addrspace(4)* |
50 |
| -// CHECK: [[ARG_C]].addr.ascast = addrspacecast i32* [[ARG_C]].addr to i32 addrspace(4)* |
| 46 | +// CHECK: [[ARG_A]].addr.ascast = addrspacecast ptr [[ARG_A]].addr to ptr addrspace(4) |
| 47 | +// CHECK: [[ARG_B]].addr.ascast = addrspacecast ptr [[ARG_B]].addr to ptr addrspace(4) |
| 48 | +// CHECK: [[ACC1_DATA]].addr.ascast = addrspacecast ptr [[ACC1_DATA]].addr to ptr addrspace(4) |
| 49 | +// CHECK: [[ACC2_DATA]].addr.ascast = addrspacecast ptr [[ACC2_DATA]].addr to ptr addrspace(4) |
| 50 | +// CHECK: [[ARG_C]].addr.ascast = addrspacecast ptr [[ARG_C]].addr to ptr addrspace(4) |
51 | 51 | //
|
52 | 52 | // Lambda object alloca
|
53 |
| -// CHECK: [[KERNEL_OBJ:%[a-zA-Z0-9_]+]] = addrspacecast %class{{.*}}.anon* [[KERNEL]] to %class{{.*}}.anon addrspace(4)* |
| 53 | +// CHECK: [[KERNEL_OBJ:%[a-zA-Z0-9_]+]] = addrspacecast ptr [[KERNEL]] to ptr addrspace(4) |
54 | 54 | //
|
55 | 55 | // Kernel argument stores
|
56 |
| -// CHECK: store i32 [[ARG_A]], i32 addrspace(4)* [[ARG_A]].addr.ascast |
57 |
| -// CHECK: store i32 [[ARG_B]], i32 addrspace(4)* [[ARG_B]].addr.ascast |
58 |
| -// CHECK: store i8 addrspace(1)* [[ACC1_DATA]], i8 addrspace(1)* addrspace(4)* [[ACC1_DATA]].addr.ascast |
59 |
| -// CHECK: store i8 addrspace(1)* [[ACC2_DATA]], i8 addrspace(1)* addrspace(4)* [[ACC2_DATA]].addr.ascast |
60 |
| -// CHECK: store i32 [[ARG_C]], i32 addrspace(4)* [[ARG_C]].addr.ascast |
| 56 | +// CHECK: store i32 [[ARG_A]], ptr addrspace(4) [[ARG_A]].addr.ascast |
| 57 | +// CHECK: store i32 [[ARG_B]], ptr addrspace(4) [[ARG_B]].addr.ascast |
| 58 | +// CHECK: store ptr addrspace(1) [[ACC1_DATA]], ptr addrspace(4) [[ACC1_DATA]].addr.ascast |
| 59 | +// CHECK: store ptr addrspace(1) [[ACC2_DATA]], ptr addrspace(4) [[ACC2_DATA]].addr.ascast |
| 60 | +// CHECK: store i32 [[ARG_C]], ptr addrspace(4) [[ARG_C]].addr.ascast |
61 | 61 | //
|
62 | 62 | // Check A and B scalar fields initialization
|
63 |
| -// CHECK: [[GEP:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class{{.*}}.anon, %class{{.*}}.anon addrspace(4)* [[KERNEL_OBJ]], i32 0, i32 0 |
64 |
| -// CHECK: [[BITCAST:%[a-zA-Z0-9_]+]] = bitcast %struct{{.*}}Captured addrspace(4)* [[GEP]] to %struct{{.*}}Base addrspace(4)* |
65 |
| -// CHECK: [[FIELD_A:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Base, %struct{{.*}}Base addrspace(4)* [[BITCAST]], i32 0, i32 0 |
66 |
| -// CHECK: [[ARG_A_LOAD:%[a-zA-Z0-9_]+]] = load i32, i32 addrspace(4)* [[ARG_A]].addr.ascast |
67 |
| -// CHECK: store i32 [[ARG_A_LOAD]], i32 addrspace(4)* [[FIELD_A]] |
68 |
| -// CHECK: [[FIELD_B:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Base, %struct{{.*}}Base addrspace(4)* [[BITCAST]], i32 0, i32 1 |
69 |
| -// CHECK: [[ARG_B_LOAD:%[a-zA-Z0-9_]+]] = load i32, i32 addrspace(4)* [[ARG_B]].addr.ascast |
70 |
| -// CHECK: store i32 [[ARG_B_LOAD]], i32 addrspace(4)* [[FIELD_B]] |
| 63 | +// CHECK: [[GEP:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class{{.*}}.anon, ptr addrspace(4) [[KERNEL_OBJ]], i32 0, i32 0 |
| 64 | +// CHECK: [[FIELD_A:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Base, ptr addrspace(4) [[GEP]], i32 0, i32 0 |
| 65 | +// CHECK: [[ARG_A_LOAD:%[a-zA-Z0-9_]+]] = load i32, ptr addrspace(4) [[ARG_A]].addr.ascast |
| 66 | +// CHECK: store i32 [[ARG_A_LOAD]], ptr addrspace(4) [[FIELD_A]] |
| 67 | +// CHECK: [[FIELD_B:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Base, ptr addrspace(4) [[GEP]], i32 0, i32 1 |
| 68 | +// CHECK: [[ARG_B_LOAD:%[a-zA-Z0-9_]+]] = load i32, ptr addrspace(4) [[ARG_B]].addr.ascast |
| 69 | +// CHECK: store i32 [[ARG_B_LOAD]], ptr addrspace(4) [[FIELD_B]] |
71 | 70 | //
|
72 | 71 | // Check accessors initialization
|
73 |
| -// CHECK: [[ACC_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Base, %struct{{.*}}Base addrspace(4)* [[BITCAST]], i32 0, i32 2 |
| 72 | +// CHECK: [[ACC_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Base, ptr addrspace(4) [[GEP]], i32 0, i32 2 |
74 | 73 | // Default constructor call
|
75 |
| -// CHECK: call spir_func void @_ZN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0ENS0_3ext6oneapi22accessor_property_listIJEEEEC1Ev(%"class{{.*}}cl::sycl::accessor" addrspace(4)* {{[^,]*}} [[ACC_FIELD]]) |
76 |
| -// CHECK: [[BITCAST1:%[a-zA-Z0-9_]+]] = bitcast %struct{{.*}}Captured addrspace(4)* [[GEP]] to i8 addrspace(4)* |
77 |
| -// CHECK: [[GEP1:%[a-zA-Z0-9_]+]] = getelementptr inbounds i8, i8 addrspace(4)* [[BITCAST1]], i64 20 |
78 |
| -// CHECK: [[BITCAST2:%[a-zA-Z0-9_]+]] = bitcast i8 addrspace(4)* [[GEP1]] to %"class{{.*}}cl::sycl::accessor" addrspace(4)* |
| 74 | +// CHECK: call spir_func void @_ZN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0ENS0_3ext6oneapi22accessor_property_listIJEEEEC1Ev(ptr addrspace(4) {{[^,]*}} [[ACC_FIELD]]) |
| 75 | +// CHECK: [[GEP1:%[a-zA-Z0-9_]+]] = getelementptr inbounds i8, ptr addrspace(4) [[GEP]], i64 20 |
79 | 76 | // Default constructor call
|
80 |
| -// CHECK: call spir_func void @_ZN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0ENS0_3ext6oneapi22accessor_property_listIJEEEEC2Ev(%"class{{.*}}cl::sycl::accessor" addrspace(4)* {{[^,]*}} [[BITCAST2]]) |
| 77 | +// CHECK: call spir_func void @_ZN2cl4sycl8accessorIcLi1ELNS0_6access4modeE1024ELNS2_6targetE2014ELNS2_11placeholderE0ENS0_3ext6oneapi22accessor_property_listIJEEEEC2Ev(ptr addrspace(4) {{[^,]*}} [[GEP1]]) |
81 | 78 |
|
82 | 79 | // CHECK C field initialization
|
83 |
| -// CHECK: [[FIELD_C:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Captured, %struct{{.*}}Captured addrspace(4)* [[GEP]], i32 0, i32 2 |
84 |
| -// CHECK: [[ARG_C_LOAD:%[a-zA-Z0-9_]+]] = load i32, i32 addrspace(4)* [[ARG_C]].addr.ascast |
85 |
| -// CHECK: store i32 [[ARG_C_LOAD]], i32 addrspace(4)* [[FIELD_C]] |
| 80 | +// CHECK: [[FIELD_C:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Captured, ptr addrspace(4) [[GEP]], i32 0, i32 2 |
| 81 | +// CHECK: [[ARG_C_LOAD:%[a-zA-Z0-9_]+]] = load i32, ptr addrspace(4) [[ARG_C]].addr.ascast |
| 82 | +// CHECK: store i32 [[ARG_C_LOAD]], ptr addrspace(4) [[FIELD_C]] |
86 | 83 | //
|
87 | 84 | // Check __init method calls
|
88 |
| -// CHECK: [[GEP2:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class{{.*}}.anon, %class{{.*}}.anon addrspace(4)* [[KERNEL_OBJ]], i32 0, i32 0 |
89 |
| -// CHECK: [[BITCAST3:%[a-zA-Z0-9_]+]] = bitcast %struct{{.*}}Captured addrspace(4)* [[GEP2]] to %struct{{.*}}Base addrspace(4)* |
90 |
| -// CHECK: [[ACC1_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Base, %struct{{.*}}Base addrspace(4)* [[BITCAST3]], i32 0, i32 2 |
91 |
| -// CHECK: [[ACC1_DATA_LOAD:%[a-zA-Z0-9_]+]] = load i8 addrspace(1)*, i8 addrspace(1)* addrspace(4)* [[ACC1_DATA]].addr.ascast |
92 |
| -// CHECK: call spir_func void @{{.*}}__init{{.*}}(%"class{{.*}}cl::sycl::accessor" addrspace(4)* {{[^,]*}} [[ACC1_FIELD]], i8 addrspace(1)* noundef [[ACC1_DATA_LOAD]] |
| 85 | +// CHECK: [[GEP2:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class{{.*}}.anon, ptr addrspace(4) [[KERNEL_OBJ]], i32 0, i32 0 |
| 86 | +// CHECK: [[ACC1_FIELD:%[a-zA-Z0-9_]+]] = getelementptr inbounds %struct{{.*}}Base, ptr addrspace(4) [[GEP2]], i32 0, i32 2 |
| 87 | +// CHECK: [[ACC1_DATA_LOAD:%[a-zA-Z0-9_]+]] = load ptr addrspace(1), ptr addrspace(4) [[ACC1_DATA]].addr.ascast |
| 88 | +// CHECK: call spir_func void @{{.*}}__init{{.*}}(ptr addrspace(4) {{[^,]*}} [[ACC1_FIELD]], ptr addrspace(1) noundef [[ACC1_DATA_LOAD]] |
93 | 89 | //
|
94 |
| -// CHECK: [[GEP3:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class{{.*}}.anon, %class{{.*}}.anon addrspace(4)* [[KERNEL_OBJ]], i32 0, i32 0 |
95 |
| -// CHECK: [[ACC2_DATA_LOAD:%[a-zA-Z0-9_]+]] = load i8 addrspace(1)*, i8 addrspace(1)* addrspace(4)* [[ACC2_DATA]].addr.ascast |
96 |
| -// CHECK: [[BITCAST4:%[a-zA-Z0-9_]+]] = bitcast %struct{{.*}}Captured addrspace(4)* [[GEP3]] to %"class{{.*}}cl::sycl::accessor" addrspace(4)* |
97 |
| -// CHECK: call spir_func void @{{.*}}__init{{.*}}(%"class{{.*}}cl::sycl::accessor" addrspace(4)* {{[^,]*}} [[BITCAST4]], i8 addrspace(1)* noundef [[ACC2_DATA_LOAD]] |
| 90 | +// CHECK: [[GEP3:%[a-zA-Z0-9_]+]] = getelementptr inbounds %class{{.*}}.anon, ptr addrspace(4) [[KERNEL_OBJ]], i32 0, i32 0 |
| 91 | +// CHECK: [[ACC2_DATA_LOAD:%[a-zA-Z0-9_]+]] = load ptr addrspace(1), ptr addrspace(4) [[ACC2_DATA]].addr.ascast |
| 92 | +// CHECK: call spir_func void @{{.*}}__init{{.*}}(ptr addrspace(4) {{[^,]*}}, ptr addrspace(1) noundef [[ACC2_DATA_LOAD]] |
0 commit comments