17
17
typedef void *omp_depend_t ;
18
18
19
19
void foo () {}
20
+ void tmainc (){
21
+ omp_depend_t obj;
22
+ #pragma omp depobj(obj) depend(inout: omp_all_memory)
23
+ {
24
+ volatile omp_depend_t temp = obj;
25
+ char * char_ptr = reinterpret_cast <char *>(temp);
26
+ char_ptr[0 ] = 1 ;
27
+ }
28
+ }
20
29
21
30
template <class T >
22
31
T tmain (T argc) {
@@ -35,10 +44,25 @@ int main(int argc, char **argv) {
35
44
#pragma omp depobj(b) destroy
36
45
#pragma omp depobj(b) update(mutexinoutset)
37
46
#pragma omp depobj(a) depend(iterator(char *p = argv[argc]:argv[0]:-1), out: p[0])
38
- (void )tmain (a), tmain (b);
47
+ (void )tmain (a), tmain (b);
48
+ tmainc ();
39
49
return 0 ;
40
50
}
41
-
51
+ // CHECK-LABEL: tmainc
52
+ // CHECK: [[D_ADDR:%obj]] = alloca ptr,
53
+ // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
54
+ // CHECK: [[DEP_ADDR_ADDR2:%.+]] = call ptr @__kmpc_alloc(i32 [[GTID]], i64 48, ptr null)
55
+ // CHECK: [[SZ_DEOOBJ:%.+]] = getelementptr inbounds nuw %struct.kmp_depend_info, ptr [[DEP_ADDR_ADDR2]], i{{.+}} 0, i{{.+}} 0
56
+ // CHECK: store i64 1, ptr [[SZ_DEOOBJ]], align 8
57
+ // CHECK: [[DEPOBJ_BASE_ADDR:%.+]] = getelementptr %struct.kmp_depend_info, ptr [[DEP_ADDR_ADDR2]], i{{.+}} 1
58
+ // CHECK: [[ADDR_ONE:%.+]] = getelementptr inbounds nuw %struct.kmp_depend_info, ptr [[DEPOBJ_BASE_ADDR]], i{{.+}} 0, i{{.+}} 0
59
+ // CHECK: store i64 0, ptr [[ADDR_ONE]], align 8
60
+ // CHECK: [[SZ_ADDR:%.+]] = getelementptr inbounds nuw %struct.kmp_depend_info, ptr [[DEPOBJ_BASE_ADDR]], i{{.+}} 0, i{{.+}} 1
61
+ // CHECK: store i64 0, ptr [[SZ_ADDR]], align 8
62
+ // CHECK: [[SZ_ADDR_NEW:%.+]] = getelementptr inbounds nuw %struct.kmp_depend_info, ptr [[DEPOBJ_BASE_ADDR]], i{{.+}} 0, i{{.+}} 2
63
+ // CHECK: store {{i[0-9]+}} {{-?[0-9]+}}, ptr [[SZ_ADDR_NEW]], align 8
64
+ // CHECK: [[DEP_NEW:%.+]] = getelementptr %struct.kmp_depend_info, ptr [[DEP_ADDR_ADDR2]], i{{.+}} 1
65
+ // CHECK: store ptr [[DEP_NEW]], ptr [[D_ADDR]], align 8
42
66
// CHECK-LABEL: @main
43
67
// CHECK: [[B_ADDR:%b]] = alloca ptr,
44
68
// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
@@ -69,6 +93,8 @@ int main(int argc, char **argv) {
69
93
// CHECK: [[NUMDEPS_ADDR:%.+]] = getelementptr inbounds nuw %struct.kmp_depend_info, ptr [[NUMDEPS_BASE]], i{{.+}} 0, i{{.+}} 0
70
94
// CHECK: [[NUMDEPS:%.+]] = load i64, ptr [[NUMDEPS_ADDR]], align 8
71
95
// CHECK: [[END:%.+]] = getelementptr %struct.kmp_depend_info, ptr [[B_BASE]], i64 [[NUMDEPS]]
96
+
97
+
72
98
// CHECK: br label %[[BODY:.+]]
73
99
// CHECK: [[BODY]]:
74
100
// CHECK: [[EL:%.+]] = phi ptr [ [[B_BASE]], %{{.+}} ], [ [[EL_NEXT:%.+]], %[[BODY]] ]
@@ -228,6 +254,8 @@ int main(int argc, char **argv) {
228
254
// CHECK: [[EL_NEXT]] = getelementptr %struct.kmp_depend_info, ptr [[EL]], i{{.+}} 1
229
255
// CHECK: [[IS_DONE:%.+]] = icmp eq ptr [[EL_NEXT]], [[END]]
230
256
// CHECK: br i1 [[IS_DONE]], label %[[DONE:.+]], label %[[BODY]]
257
+
231
258
// CHECK: [[DONE]]:
232
259
260
+
233
261
#endif
0 commit comments