@@ -11,13 +11,22 @@ struct S {
1111int main () {
1212 S v;
1313
14+ // &v, &v, sizeof(v), ALLOC | PARAM
15+ // &v, &v.x + sizeof(int), sizeof(v.arr to v.y), TO | FROM | MEMBER_OF_1
16+ // &v, &v.x, sizeof(v.x), TO | FROM | MEMBER_OF_1
17+ // &v, &v.z, sizeof(v.z), TO | FROM | MEMBER_OF_1
1418#pragma omp target map(tofrom: v, v.x, v.z)
1519 {
1620 v.x ++;
1721 v.y += 2 ;
1822 v.z += 3 ;
1923 }
2024
25+ // &v, &v, sizeof(v), ALLOC | PARAM
26+ // &v, &v.x + sizeof(int), sizeof(v.arr to v.z), TO | FROM | MEMBER_OF_1
27+ // &v, &v.x, sizeof(v.x), TO | FROM | MEMBER_OF_1
28+ // &v.arr[0], &v.arr[0], 4 * sizeof(int), TO | FROM
29+ // &v.arr, &v.arr[0], sizeof(void*), ATTACH
2130#pragma omp target map(tofrom: v, v.x, v.arr[:1])
2231 {
2332 v.x ++;
@@ -26,6 +35,9 @@ int main() {
2635 v.z += 4 ;
2736 }
2837
38+ // &v, &v, sizeof(v), TO | FROM | PARAM
39+ // &v.arr[0], &v.arr[0], 4 * sizeof(int), TO | FROM
40+ // &v.arr, &v.arr[0], sizeof(void*), ATTACH
2941#pragma omp target map(tofrom: v, v.arr[:1])
3042 {
3143 v.x ++;
@@ -40,11 +52,11 @@ int main() {
4052// CHECK: [[CSTSZ0:@.+]] = private {{.*}}constant [4 x i64] [i64 0, i64 0, i64 4, i64 4]
4153// CHECK: [[CSTTY0:@.+]] = private {{.*}}constant [4 x i64] [i64 [[#0x20]], i64 [[#0x1000000000003]], i64 [[#0x1000000000003]], i64 [[#0x1000000000003]]]
4254
43- // CHECK: [[CSTSZ1:@.+]] = private {{.*}}constant [4 x i64] [i64 0, i64 0, i64 4, i64 4]
44- // CHECK: [[CSTTY1:@.+]] = private {{.*}}constant [4 x i64] [i64 [[#0x20]], i64 [[#0x1000000000003]], i64 [[#0x1000000000003]], i64 [[#0x1000000000013 ]]]
55+ // CHECK: [[CSTSZ1:@.+]] = private {{.*}}constant [5 x i64] [i64 0, i64 0, i64 4, i64 4, i64 8 ]
56+ // CHECK: [[CSTTY1:@.+]] = private {{.*}}constant [5 x i64] [i64 [[#0x20]], i64 [[#0x1000000000003]], i64 [[#0x1000000000003]], i64 [[#0x3]], i64 [[#0x4000 ]]]
4557
46- // CHECK: [[CSTSZ2:@.+]] = private {{.*}}constant [3 x i64] [i64 0 , i64 24 , i64 4 ]
47- // CHECK: [[CSTTY2:@.+]] = private {{.*}}constant [3 x i64] [i64 [[#0x20 ]], i64 [[#0x1000000000003 ]], i64 [[#0x1000000000013 ]]]
58+ // CHECK: [[CSTSZ2:@.+]] = private {{.*}}constant [3 x i64] [i64 24 , i64 4 , i64 8 ]
59+ // CHECK: [[CSTTY2:@.+]] = private {{.*}}constant [3 x i64] [i64 [[#0x23 ]], i64 [[#0x3 ]], i64 [[#0x4000 ]]]
4860
4961// CHECK-DAG: call i32 @__tgt_target_kernel(ptr @{{.+}}, i64 -1, i32 -1, i32 0, ptr @.{{.+}}.region_id, ptr [[ARGS:%.+]])
5062// CHECK-DAG: [[KSIZE:%.+]] = getelementptr inbounds {{.+}}[[ARGS]], i32 0, i32 4
@@ -64,24 +76,19 @@ int main() {
6476// CHECK-DAG: call i32 @__tgt_target_kernel(ptr @{{.+}}, i64 -1, i32 -1, i32 0, ptr @.{{.+}}.region_id, ptr [[ARGS:%.+]])
6577// CHECK-DAG: [[KSIZE:%.+]] = getelementptr inbounds {{.+}}[[ARGS]], i32 0, i32 4
6678// CHECK-DAG: store ptr [[SZBASE:%.+]], ptr [[KSIZE]], align 8
67- // CHECK-DAG: [[SZBASE]] = getelementptr inbounds [4 x i64], ptr [[SIZES:%[^,]*]], i32 0, i32 0
79+ // CHECK-DAG: [[SZBASE]] = getelementptr inbounds [5 x i64], ptr [[SIZES:%[^,]*]], i32 0, i32 0
6880
6981// Fill two non-constant size elements here: the whole struct size, and the
7082// region covering v.arr, v.y and v.z.
7183
72- // CHECK-DAG: [[STR:%.+]] = getelementptr inbounds [4 x i64], ptr [[SIZES]], i32 0, i32 0
84+ // CHECK-DAG: [[STR:%.+]] = getelementptr inbounds [5 x i64], ptr [[SIZES]], i32 0, i32 0
7385// CHECK-DAG: store i64 %{{.+}}, ptr [[STR]], align 8
74- // CHECK-DAG: [[ARRYZ:%.+]] = getelementptr inbounds [4 x i64], ptr [[SIZES]], i32 0, i32 1
86+ // CHECK-DAG: [[ARRYZ:%.+]] = getelementptr inbounds [5 x i64], ptr [[SIZES]], i32 0, i32 1
7587// CHECK-DAG: store i64 %{{.+}}, ptr [[ARRYZ]], align 8
7688
7789// CHECK: call void
7890
7991// CHECK-DAG: call i32 @__tgt_target_kernel(ptr @{{.+}}, i64 -1, i32 -1, i32 0, ptr @.{{.+}}.region_id, ptr [[ARGS:%.+]])
8092// CHECK-DAG: [[KSIZE:%.+]] = getelementptr inbounds {{.+}}[[ARGS]], i32 0, i32 4
81- // CHECK-DAG: store ptr [[SZBASE:%.+]], ptr [[KSIZE]], align 8
82- // CHECK-DAG: [[SZBASE]] = getelementptr inbounds [3 x i64], ptr [[SIZES:%[^,]*]], i32 0, i32 0
83-
84- // Fill one non-constant size element here: the whole struct size.
85-
86- // CHECK-DAG: [[STR:%.+]] = getelementptr inbounds [3 x i64], ptr [[SIZES]], i32 0, i32 0
87- // CHECK-DAG: store i64 %{{.+}}, ptr [[STR]], align 8
93+ // No overlap, so no non-constant size element here.
94+ // CHECK-NOT: store ptr [[CSTSZ2]], ptr [[KSIZE]], align 8
0 commit comments