1717typedef void *omp_depend_t ;
1818
1919void 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+ }
2029
2130template <class T >
2231T tmain (T argc) {
@@ -35,10 +44,25 @@ int main(int argc, char **argv) {
3544#pragma omp depobj(b) destroy
3645#pragma omp depobj(b) update(mutexinoutset)
3746#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 ();
3949 return 0 ;
4050}
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
4266// CHECK-LABEL: @main
4367// CHECK: [[B_ADDR:%b]] = alloca ptr,
4468// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
@@ -69,6 +93,8 @@ int main(int argc, char **argv) {
6993// CHECK: [[NUMDEPS_ADDR:%.+]] = getelementptr inbounds nuw %struct.kmp_depend_info, ptr [[NUMDEPS_BASE]], i{{.+}} 0, i{{.+}} 0
7094// CHECK: [[NUMDEPS:%.+]] = load i64, ptr [[NUMDEPS_ADDR]], align 8
7195// CHECK: [[END:%.+]] = getelementptr %struct.kmp_depend_info, ptr [[B_BASE]], i64 [[NUMDEPS]]
96+
97+
7298// CHECK: br label %[[BODY:.+]]
7399// CHECK: [[BODY]]:
74100// CHECK: [[EL:%.+]] = phi ptr [ [[B_BASE]], %{{.+}} ], [ [[EL_NEXT:%.+]], %[[BODY]] ]
@@ -228,6 +254,8 @@ int main(int argc, char **argv) {
228254// CHECK: [[EL_NEXT]] = getelementptr %struct.kmp_depend_info, ptr [[EL]], i{{.+}} 1
229255// CHECK: [[IS_DONE:%.+]] = icmp eq ptr [[EL_NEXT]], [[END]]
230256// CHECK: br i1 [[IS_DONE]], label %[[DONE:.+]], label %[[BODY]]
257+
231258// CHECK: [[DONE]]:
232259
260+
233261#endif
0 commit comments