Skip to content

Commit 1fc0e4f

Browse files
[SYCL] Fix crash on array of pointers (#2413)
The crash happens when address space of pointer element is checked using array type. The type of 'array element' should be checked, not the 'array type' itself. Add missing LValueToRValue cast for pointers. Also added test for array of pointers not inside a struct. Signed-off-by: Elizabeth Andrews <[email protected]>
1 parent 6744364 commit 1fc0e4f

File tree

5 files changed

+88
-7
lines changed

5 files changed

+88
-7
lines changed

clang/lib/Sema/SemaSYCL.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1847,6 +1847,10 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
18471847
ParamType = Pointer->getType();
18481848
}
18491849

1850+
DRE =
1851+
ImplicitCastExpr::Create(SemaRef.Context, ParamType, CK_LValueToRValue,
1852+
DRE, /*BasePath=*/nullptr, VK_RValue);
1853+
18501854
if (PointerTy->getPointeeType().getAddressSpace() !=
18511855
ParamType->getPointeeType().getAddressSpace())
18521856
DRE = ImplicitCastExpr::Create(SemaRef.Context, PointerTy,
@@ -2102,7 +2106,7 @@ class SyclKernelBodyCreator : public SyclKernelFieldHandler {
21022106

21032107
bool handlePointerType(FieldDecl *FD, QualType FieldTy) final {
21042108
Expr *PointerRef =
2105-
createPointerParamReferenceExpr(FD->getType(), StructDepth != 0);
2109+
createPointerParamReferenceExpr(FieldTy, StructDepth != 0);
21062110
addFieldInit(FD, FieldTy, PointerRef);
21072111
return true;
21082112
}

clang/test/CodeGenSYCL/pointers-in-structs.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ struct B {
1313
int *F1;
1414
float *F2;
1515
A F3;
16+
int *F4[2];
1617
};
1718

1819
int main() {
@@ -35,9 +36,13 @@ int main() {
3536
// CHECK: %[[WRAPPER_F1:[a-zA-Z0-9_.]+]] = type { i32 addrspace(1)* }
3637
// CHECK: %[[WRAPPER_F2:[a-zA-Z0-9_.]+]] = type { float addrspace(1)* }
3738
// CHECK: %[[WRAPPER_F:[a-zA-Z0-9_.]+]] = type { float addrspace(1)* }
39+
// CHECK: %[[WRAPPER_F4_1:[a-zA-Z0-9_.]+]] = type { i32 addrspace(1)* }
40+
// CHECK: %[[WRAPPER_F4_2:[a-zA-Z0-9_.]+]] = type { i32 addrspace(1)* }
3841
// CHECK: %[[WRAPPER_LAMBDA_PTR:[a-zA-Z0-9_.]+]] = type { float addrspace(1)* }
3942
// CHECK: define spir_kernel void @{{.*}}structs
4043
// CHECK-SAME: %[[WRAPPER_F1]]* byval(%[[WRAPPER_F1]]) align 8 %_arg_F1,
4144
// CHECK-SAME: %[[WRAPPER_F2]]* byval(%[[WRAPPER_F2]]) align 8 %_arg_F2,
42-
// CHECK-SAME: %[[WRAPPER_F]]* byval(%[[WRAPPER_F]]) align 8 %_arg_F
45+
// CHECK-SAME: %[[WRAPPER_F]]* byval(%[[WRAPPER_F]]) align 8 %_arg_F,
46+
// CHECK-SAME: %[[WRAPPER_F4_1]]* byval(%[[WRAPPER_F4_1]]) align 8 %_arg_F4
47+
// CHECK-SAME: %[[WRAPPER_F4_2]]* byval(%[[WRAPPER_F4_2]]) align 8 %_arg_F41
4348
// CHECK: define spir_kernel void @{{.*}}lambdas{{.*}}(%[[WRAPPER_LAMBDA_PTR]]* byval(%[[WRAPPER_LAMBDA_PTR]]) align 8 %_arg_)

clang/test/CodeGenSYCL/pointers-int-header.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
struct struct_with_pointer {
1111
int data_in_struct;
1212
int *ptr_in_struct;
13+
int *ptr_array_in_struct1[2];
14+
int *ptr_array_in_struct2[2][3];
1315
};
1416

1517
int main() {
@@ -27,3 +29,11 @@ int main() {
2729
// CHECK:{ kernel_param_kind_t::kind_pointer, 8, 0 },
2830
// CHECK:{ kernel_param_kind_t::kind_std_layout, 4, 8 },
2931
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 16 },
32+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 24 },
33+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 32 },
34+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 40 },
35+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 48 },
36+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 56 },
37+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 64 },
38+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 72 },
39+
// CHECK:{ kernel_param_kind_t::kind_std_layout, 8, 80 },

clang/test/SemaSYCL/built-in-type-kernel-arg.cpp

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ __attribute__((sycl_kernel)) void kernel(const Func &kernelFunc) {
1212

1313
struct test_struct {
1414
int data;
15-
int *ptr; // Unused pointer in struct
15+
int *ptr;
16+
int *ptr_array1[2];
17+
int *ptr_array2[2][3];
1618
};
1719

1820
void test(const int some_const) {
@@ -26,6 +28,7 @@ int main() {
2628
int data = 5;
2729
int* data_addr = &data;
2830
int* new_data_addr = nullptr;
31+
int *ptr_array[2];
2932
test_struct s;
3033
s.data = data;
3134
kernel<class kernel_int>(
@@ -40,7 +43,9 @@ int main() {
4043
kernel<class kernel_pointer>(
4144
[=]() {
4245
new_data_addr[0] = data_addr[0];
46+
int *local = ptr_array[1];
4347
});
48+
4449
const int some_const = 10;
4550
test(some_const);
4651
return 0;
@@ -66,9 +71,18 @@ int main() {
6671
// CHECK-NEXT: DeclRefExpr {{.*}} 'int' lvalue ParmVar {{.*}} '_arg_' 'int'
6772

6873
// Check kernel parameters
69-
// CHECK: {{.*}}kernel_struct{{.*}} 'void (int, __wrapper_class)'
74+
// CHECK: {{.*}}kernel_struct{{.*}} 'void (int, __wrapper_class, __wrapper_class, __wrapper_class
75+
// CHECK-SAME: __wrapper_class, __wrapper_class, __wrapper_class, __wrapper_class, __wrapper_class, __wrapper_class)'
7076
// CHECK: ParmVarDecl {{.*}} used _arg_data 'int'
7177
// CHECK: ParmVarDecl {{.*}} used _arg_ptr '__wrapper_class'
78+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array1 '__wrapper_class'
79+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array1 '__wrapper_class'
80+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array2 '__wrapper_class'
81+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array2 '__wrapper_class'
82+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array2 '__wrapper_class'
83+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array2 '__wrapper_class'
84+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array2 '__wrapper_class'
85+
// CHECK: ParmVarDecl {{.*}} used _arg_ptr_array2 '__wrapper_class'
7286

7387
// Check that lambda field of struct type is initialized
7488
// CHECK: VarDecl {{.*}}'(lambda at {{.*}}built-in-type-kernel-arg.cpp{{.*}})'
@@ -77,20 +91,66 @@ int main() {
7791
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int' <LValueToRValue>
7892
// CHECK-NEXT: DeclRefExpr {{.*}} 'int' lvalue ParmVar {{.*}} '_arg_data' 'int'
7993
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
94+
// CHECK-NEXT: ImplicitCastExpr {{.*}} '__global int *' <LValueToRValue>
8095
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
8196
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr' '__wrapper_class'
97+
// CHECK-NEXT: InitListExpr {{.*}} 'int *[2]'
98+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
99+
// CHECK-NEXT: ImplicitCastExpr {{.*}} '__global int *' <LValueToRValue>
100+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
101+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array1' '__wrapper_class'
102+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
103+
// CHECK-NEXT: ImplicitCastExpr {{.*}} '__global int *' <LValueToRValue>
104+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
105+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array1' '__wrapper_class'
106+
// CHECK-NEXT: InitListExpr {{.*}} 'int *[2][3]'
107+
// CHECK-NEXT: InitListExpr {{.*}} 'int *[3]'
108+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
109+
// CHECK-NEXT: ImplicitCastExpr {{.*}} '__global int *' <LValueToRValue>
110+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
111+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array2' '__wrapper_class'
112+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
113+
// CHECK-NEXT: ImplicitCastExpr {{.*}} '__global int *' <LValueToRValue>
114+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
115+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array2' '__wrapper_class'
116+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
117+
// CHECK-NEXT: ImplicitCastExpr {{.*}} '__global int *' <LValueToRValue>
118+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
119+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array2' '__wrapper_class'
120+
// CHECK-NEXT: InitListExpr {{.*}} 'int *[3]'
121+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
122+
// CHECK-NEXT: ImplicitCastExpr {{.*}} '__global int *' <LValueToRValue>
123+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
124+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array2' '__wrapper_class'
125+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
126+
// CHECK-NEXT: ImplicitCastExpr {{.*}} '__global int *' <LValueToRValue>
127+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
128+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array2' '__wrapper_class'
129+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
130+
// CHECK-NEXT: ImplicitCastExpr {{.*}} '__global int *' <LValueToRValue>
131+
// CHECK-NEXT: MemberExpr {{.*}} '__global int *' lvalue . {{.*}}
132+
// CHECK-NEXT: DeclRefExpr {{.*}} '__wrapper_class' lvalue ParmVar {{.*}} '_arg_ptr_array2' '__wrapper_class'
82133

83134
// Check kernel parameters
84-
// CHECK: {{.*}}kernel_pointer{{.*}} 'void (__global int *, __global int *)'
135+
// CHECK: {{.*}}kernel_pointer{{.*}} 'void (__global int *, __global int *, __global int *, __global int *)'
136+
// CHECK: ParmVarDecl {{.*}} used _arg_ '__global int *'
137+
// CHECK: ParmVarDecl {{.*}} used _arg_ '__global int *'
85138
// CHECK: ParmVarDecl {{.*}} used _arg_ '__global int *'
86139
// CHECK: ParmVarDecl {{.*}} used _arg_ '__global int *'
87140
// CHECK: VarDecl {{.*}}'(lambda at {{.*}}built-in-type-kernel-arg.cpp{{.*}})'
88141

89142
// Check that lambda fields of pointer types are initialized
90143
// CHECK: InitListExpr
91144
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
145+
// CHECK-NEXT: ImplicitCastExpr {{.*}} '__global int *' <LValueToRValue>
92146
// CHECK-NEXT: DeclRefExpr {{.*}} '__global int *' lvalue ParmVar {{.*}} '_arg_' '__global int *'
93147
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
148+
// CHECK-NEXT: ImplicitCastExpr {{.*}} '__global int *' <LValueToRValue>
149+
// CHECK-NEXT: DeclRefExpr {{.*}} '__global int *' lvalue ParmVar {{.*}} '_arg_' '__global int *'
150+
// CHECK: InitListExpr {{.*}} 'int *[2]'
151+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
152+
// CHECK-NEXT: ImplicitCastExpr {{.*}} '__global int *' <LValueToRValue>
153+
// CHECK-NEXT: DeclRefExpr {{.*}} '__global int *' lvalue ParmVar {{.*}} '_arg_' '__global int *'
154+
// CHECK-NEXT: ImplicitCastExpr {{.*}} 'int *' <AddressSpaceConversion>
155+
// CHECK-NEXT: ImplicitCastExpr {{.*}} '__global int *' <LValueToRValue>
94156
// CHECK-NEXT: DeclRefExpr {{.*}} '__global int *' lvalue ParmVar {{.*}} '_arg_' '__global int *'
95-
96-
// Check kernel parameters

sycl/test/basic_tests/unused_pointer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ struct struct_with_pointer {
2121
int data;
2222
int *ptr1; // Unused pointer
2323
float *ptr2; // Unused pointer
24+
int *ptr_array1[2]; // Unused pointer array
25+
int *ptr_array2[2][3]; // Unused pointer array
2426
};
2527

2628
int main(int argc, char **argv) {

0 commit comments

Comments
 (0)