1*67e74705SXin Li // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -x c++ -emit-llvm %s -o - | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-apple-darwin10 -emit-pch -o %t %s
3*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
4*67e74705SXin Li // expected-no-diagnostics
5*67e74705SXin Li // REQUIRES: x86-registered-target
6*67e74705SXin Li #ifndef HEADER
7*67e74705SXin Li #define HEADER
8*67e74705SXin Li
9*67e74705SXin Li // CHECK-DAG: [[IDENT_T:%.+]] = type { i32, i32, i32, i32, i8* }
10*67e74705SXin Li // CHECK-DAG: [[STRUCT_SHAREDS:%.+]] = type { i8*, [2 x [[STRUCT_S:%.+]]]* }
11*67e74705SXin Li // CHECK-DAG: [[STRUCT_SHAREDS1:%.+]] = type { [2 x [[STRUCT_S:%.+]]]* }
12*67e74705SXin Li // CHECK-DAG: [[KMP_TASK_T:%.+]] = type { i8*, i32 (i32, i8*)*, i32, %union{{.+}}, %union{{.+}} }
13*67e74705SXin Li // CHECK-DAG: [[KMP_DEPEND_INFO:%.+]] = type { i64, i64, i8 }
14*67e74705SXin Li struct S {
15*67e74705SXin Li int a;
SS16*67e74705SXin Li S() : a(0) {}
SS17*67e74705SXin Li S(const S &s) : a(s.a) {}
~SS18*67e74705SXin Li ~S() {}
19*67e74705SXin Li };
20*67e74705SXin Li int a;
21*67e74705SXin Li // CHECK-LABEL: @main
main()22*67e74705SXin Li int main() {
23*67e74705SXin Li // CHECK: [[B:%.+]] = alloca i8
24*67e74705SXin Li // CHECK: [[S:%.+]] = alloca [2 x [[STRUCT_S]]]
25*67e74705SXin Li char b;
26*67e74705SXin Li S s[2];
27*67e74705SXin Li int arr[10][a];
28*67e74705SXin Li // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num([[IDENT_T]]* @{{.+}})
29*67e74705SXin Li // CHECK: [[B_REF:%.+]] = getelementptr inbounds [[STRUCT_SHAREDS]], [[STRUCT_SHAREDS]]* [[CAPTURES:%.+]], i32 0, i32 0
30*67e74705SXin Li // CHECK: store i8* [[B]], i8** [[B_REF]]
31*67e74705SXin Li // CHECK: [[S_REF:%.+]] = getelementptr inbounds [[STRUCT_SHAREDS]], [[STRUCT_SHAREDS]]* [[CAPTURES]], i32 0, i32 1
32*67e74705SXin Li // CHECK: store [2 x [[STRUCT_S]]]* [[S]], [2 x [[STRUCT_S]]]** [[S_REF]]
33*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i32 33, i64 40, i64 16, i32 (i32, i8*)* bitcast (i32 (i32, [[KMP_TASK_T]]{{.*}}*)* [[TASK_ENTRY1:@.+]] to i32 (i32, i8*)*))
34*67e74705SXin Li // CHECK: [[SHAREDS_REF_PTR:%.+]] = getelementptr inbounds [[KMP_TASK_T]], [[KMP_TASK_T]]* [[TASK_PTR:%.+]], i32 0, i32 0
35*67e74705SXin Li // CHECK: [[SHAREDS_REF:%.+]] = load i8*, i8** [[SHAREDS_REF_PTR]]
36*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast [[STRUCT_SHAREDS]]* [[CAPTURES]] to i8*
37*67e74705SXin Li // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[SHAREDS_REF]], i8* [[BITCAST]], i64 16, i32 8, i1 false)
38*67e74705SXin Li // CHECK: [[PRIORITY_REF_PTR:%.+]] = getelementptr inbounds [[KMP_TASK_T]], [[KMP_TASK_T]]* [[TASK_PTR]], i32 0, i32 4
39*67e74705SXin Li // CHECK: [[PRIORITY:%.+]] = bitcast %union{{.+}}* [[PRIORITY_REF_PTR]] to i32*
40*67e74705SXin Li // CHECK: store i32 {{.+}}, i32* [[PRIORITY]]
41*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
42*67e74705SXin Li #pragma omp task shared(a, b, s) priority(b)
43*67e74705SXin Li {
44*67e74705SXin Li a = 15;
45*67e74705SXin Li b = a;
46*67e74705SXin Li s[0].a = 10;
47*67e74705SXin Li }
48*67e74705SXin Li // CHECK: [[S_REF:%.+]] = getelementptr inbounds [[STRUCT_SHAREDS1]], [[STRUCT_SHAREDS1]]* [[CAPTURES:%.+]], i32 0, i32 0
49*67e74705SXin Li // CHECK: store [2 x [[STRUCT_S]]]* [[S]], [2 x [[STRUCT_S]]]** [[S_REF]]
50*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc([[IDENT_T]]* @{{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 8,
51*67e74705SXin Li // CHECK: [[SHAREDS_REF_PTR:%.+]] = getelementptr inbounds [[KMP_TASK_T]], [[KMP_TASK_T]]* [[TASK_PTR:%.+]], i32 0, i32 0
52*67e74705SXin Li // CHECK: [[SHAREDS_REF:%.+]] = load i8*, i8** [[SHAREDS_REF_PTR]]
53*67e74705SXin Li // CHECK: [[BITCAST:%.+]] = bitcast [[STRUCT_SHAREDS1]]* [[CAPTURES]] to i8*
54*67e74705SXin Li // CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[SHAREDS_REF]], i8* [[BITCAST]], i64 8, i32 8, i1 false)
55*67e74705SXin Li // CHECK: [[DEP:%.*]] = getelementptr inbounds [4 x [[KMP_DEPEND_INFO]]], [4 x [[KMP_DEPEND_INFO]]]* [[DEPENDENCIES:%.*]], i64 0, i64 0
56*67e74705SXin Li // CHECK: [[T0:%.*]] = getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* [[DEP]], i32 0, i32 0
57*67e74705SXin Li // CHECK: store i64 ptrtoint (i32* @{{.+}} to i64), i64* [[T0]]
58*67e74705SXin Li // CHECK: [[T0:%.*]] = getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* [[DEP]], i32 0, i32 1
59*67e74705SXin Li // CHECK: store i64 4, i64* [[T0]]
60*67e74705SXin Li // CHECK: [[T0:%.*]] = getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* [[DEP]], i32 0, i32 2
61*67e74705SXin Li // CHECK: store i8 1, i8* [[T0]]
62*67e74705SXin Li // CHECK: [[DEP:%.*]] = getelementptr inbounds [4 x [[KMP_DEPEND_INFO]]], [4 x [[KMP_DEPEND_INFO]]]* [[DEPENDENCIES]], i64 0, i64 1
63*67e74705SXin Li // CHECK: [[T0:%.*]] = getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* [[DEP]], i32 0, i32 0
64*67e74705SXin Li // CHECK: ptrtoint i8* [[B]] to i64
65*67e74705SXin Li // CHECK: store i64 %{{[^,]+}}, i64* [[T0]]
66*67e74705SXin Li // CHECK: [[T0:%.*]] = getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* [[DEP]], i32 0, i32 1
67*67e74705SXin Li // CHECK: store i64 1, i64* [[T0]]
68*67e74705SXin Li // CHECK: [[T0:%.*]] = getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* [[DEP]], i32 0, i32 2
69*67e74705SXin Li // CHECK: store i8 1, i8* [[T0]]
70*67e74705SXin Li // CHECK: [[DEP:%.*]] = getelementptr inbounds [4 x [[KMP_DEPEND_INFO]]], [4 x [[KMP_DEPEND_INFO]]]* [[DEPENDENCIES]], i64 0, i64 2
71*67e74705SXin Li // CHECK: [[T0:%.*]] = getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* [[DEP]], i32 0, i32 0
72*67e74705SXin Li // CHECK: ptrtoint [2 x [[STRUCT_S]]]* [[S]] to i64
73*67e74705SXin Li // CHECK: store i64 %{{[^,]+}}, i64* [[T0]]
74*67e74705SXin Li // CHECK: [[T0:%.*]] = getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* [[DEP]], i32 0, i32 1
75*67e74705SXin Li // CHECK: store i64 8, i64* [[T0]]
76*67e74705SXin Li // CHECK: [[T0:%.*]] = getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* [[DEP]], i32 0, i32 2
77*67e74705SXin Li // CHECK: store i8 1, i8* [[T0]]
78*67e74705SXin Li // CHECK: [[IDX1:%.+]] = mul nsw i64 0, [[A_VAL:%.+]]
79*67e74705SXin Li // CHECK: [[START:%.+]] = getelementptr inbounds i32, i32* %{{.+}}, i64 [[IDX1]]
80*67e74705SXin Li // CHECK: [[IDX1:%.+]] = mul nsw i64 9, [[A_VAL]]
81*67e74705SXin Li // CHECK: [[END:%.+]] = getelementptr inbounds i32, i32* %{{.+}}, i64 [[IDX1]]
82*67e74705SXin Li // CHECK: [[END1:%.+]] = getelementptr i32, i32* [[END]], i32 1
83*67e74705SXin Li // CHECK: [[START_INT:%.+]] = ptrtoint i32* [[START]] to i64
84*67e74705SXin Li // CHECK: [[END_INT:%.+]] = ptrtoint i32* [[END1]] to i64
85*67e74705SXin Li // CHECK: [[SIZEOF:%.+]] = sub nuw i64 [[END_INT]], [[START_INT]]
86*67e74705SXin Li // CHECK: [[DEP:%.*]] = getelementptr inbounds [4 x [[KMP_DEPEND_INFO]]], [4 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i64 0, i64 3
87*67e74705SXin Li // CHECK: [[T0:%.*]] = getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* [[DEP]], i32 0, i32 0
88*67e74705SXin Li // CHECK: [[T1:%.*]] = ptrtoint i32* [[START]] to i64
89*67e74705SXin Li // CHECK: store i64 [[T1]], i64* [[T0]]
90*67e74705SXin Li // CHECK: [[T0:%.*]] = getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 1
91*67e74705SXin Li // CHECK: store i64 [[SIZEOF]], i64* [[T0]]
92*67e74705SXin Li // CHECK: [[T0:%.*]] = getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2
93*67e74705SXin Li // CHECK: store i8 1, i8* [[T0]]
94*67e74705SXin Li // CHECK: [[DEPS:%.*]] = getelementptr inbounds [4 x [[KMP_DEPEND_INFO]]], [4 x [[KMP_DEPEND_INFO]]]* [[DEPENDENCIES]], i32 0, i32 0
95*67e74705SXin Li // CHECK: bitcast [[KMP_DEPEND_INFO]]* [[DEPS]] to i8*
96*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task_with_deps([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 4, i8* %{{[^,]+}}, i32 0, i8* null)
97*67e74705SXin Li #pragma omp task shared(a, s) depend(in : a, b, s, arr[:])
98*67e74705SXin Li {
99*67e74705SXin Li a = 15;
100*67e74705SXin Li s[1].a = 10;
101*67e74705SXin Li }
102*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i32 0, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, [[KMP_TASK_T]]{{.*}}*)* [[TASK_ENTRY2:@.+]] to i32 (i32, i8*)*))
103*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
104*67e74705SXin Li #pragma omp task untied
105*67e74705SXin Li {
106*67e74705SXin Li a = 1;
107*67e74705SXin Li }
108*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i32 0, i64 40, i64 1,
109*67e74705SXin Li // CHECK: getelementptr inbounds [2 x [[STRUCT_S]]], [2 x [[STRUCT_S]]]* [[S]], i64 0, i64 0
110*67e74705SXin Li // CHECK: getelementptr inbounds [2 x [[KMP_DEPEND_INFO]]], [2 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i64 0, i64 0
111*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0
112*67e74705SXin Li // CHECK: ptrtoint [[STRUCT_S]]* %{{.+}} to i64
113*67e74705SXin Li // CHECK: store i64 %{{[^,]+}}, i64*
114*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 1
115*67e74705SXin Li // CHECK: store i64 4, i64*
116*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2
117*67e74705SXin Li // CHECK: store i8 3, i8*
118*67e74705SXin Li // CHECK: [[B_VAL:%.+]] = load i8, i8* [[B]]
119*67e74705SXin Li // CHECK: [[IDX2:%.+]] = sext i8 [[B_VAL]] to i64
120*67e74705SXin Li // CHECK: [[IDX1:%.+]] = mul nsw i64 4, [[A_VAL]]
121*67e74705SXin Li // CHECK: [[START:%.+]] = getelementptr inbounds i32, i32* %{{.+}}, i64 [[IDX1]]
122*67e74705SXin Li // CHECK: [[START1:%.+]] = getelementptr inbounds i32, i32* [[START]], i64 [[IDX2]]
123*67e74705SXin Li // CHECK: [[B_VAL:%.+]] = load i8, i8* [[B]]
124*67e74705SXin Li // CHECK: [[IDX2:%.+]] = sext i8 [[B_VAL]] to i64
125*67e74705SXin Li // CHECK: [[IDX1:%.+]] = mul nsw i64 9, [[A_VAL]]
126*67e74705SXin Li // CHECK: [[END:%.+]] = getelementptr inbounds i32, i32* %{{.+}}, i64 [[IDX1]]
127*67e74705SXin Li // CHECK: [[END1:%.+]] = getelementptr inbounds i32, i32* [[END]], i64 [[IDX2]]
128*67e74705SXin Li // CHECK: [[END2:%.+]] = getelementptr i32, i32* [[END1]], i32 1
129*67e74705SXin Li // CHECK: [[START_INT:%.+]] = ptrtoint i32* [[START1]] to i64
130*67e74705SXin Li // CHECK: [[END_INT:%.+]] = ptrtoint i32* [[END2]] to i64
131*67e74705SXin Li // CHECK: [[SIZEOF:%.+]] = sub nuw i64 [[END_INT]], [[START_INT]]
132*67e74705SXin Li // CHECK: getelementptr inbounds [2 x [[KMP_DEPEND_INFO]]], [2 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i64 0, i64 1
133*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0
134*67e74705SXin Li // CHECK: ptrtoint i32* [[START1]] to i64
135*67e74705SXin Li // CHECK: store i64 %{{[^,]+}}, i64*
136*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 1
137*67e74705SXin Li // CHECK: store i64 [[SIZEOF]], i64*
138*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2
139*67e74705SXin Li // CHECK: store i8 3, i8*
140*67e74705SXin Li // CHECK: getelementptr inbounds [2 x [[KMP_DEPEND_INFO]]], [2 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0
141*67e74705SXin Li // CHECK: bitcast [[KMP_DEPEND_INFO]]* %{{.+}} to i8*
142*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task_with_deps([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 2, i8* %{{[^,]+}}, i32 0, i8* null)
143*67e74705SXin Li #pragma omp task untied depend(out : s[0], arr[4:][b])
144*67e74705SXin Li {
145*67e74705SXin Li a = 1;
146*67e74705SXin Li }
147*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i32 3, i64 40, i64 1,
148*67e74705SXin Li // CHECK: getelementptr inbounds [3 x [[KMP_DEPEND_INFO]]], [3 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i64 0, i64 0
149*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0
150*67e74705SXin Li // CHECK: store i64 ptrtoint (i32* @{{.+}} to i64), i64*
151*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 1
152*67e74705SXin Li // CHECK: store i64 4, i64*
153*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2
154*67e74705SXin Li // CHECK: store i8 3, i8*
155*67e74705SXin Li // CHECK: getelementptr inbounds [2 x [[STRUCT_S]]], [2 x [[STRUCT_S]]]* [[S]], i64 0, i64 1
156*67e74705SXin Li // CHECK: getelementptr inbounds [3 x [[KMP_DEPEND_INFO]]], [3 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i64 0, i64 1
157*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0
158*67e74705SXin Li // CHECK: ptrtoint [[STRUCT_S]]* %{{.+}} to i64
159*67e74705SXin Li // CHECK: store i64 %{{[^,]+}}, i64*
160*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 1
161*67e74705SXin Li // CHECK: store i64 4, i64*
162*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2
163*67e74705SXin Li // CHECK: store i8 3, i8*
164*67e74705SXin Li // CHECK: [[IDX1:%.+]] = mul nsw i64 0, [[A_VAL]]
165*67e74705SXin Li // CHECK: [[START:%.+]] = getelementptr inbounds i32, i32* %{{.+}}, i64 [[IDX1]]
166*67e74705SXin Li // CHECK: [[START1:%.+]] = getelementptr inbounds i32, i32* [[START]], i64 3
167*67e74705SXin Li // CHECK: [[NEW_A_VAL:%.+]] = load i32, i32* @{{.+}},
168*67e74705SXin Li // CHECK: [[NEW_A_VAL_I64:%.+]] = sext i32 [[NEW_A_VAL]] to i64
169*67e74705SXin Li // CHECK: [[IDX2:%.+]] = sub nsw i64 [[NEW_A_VAL_I64]], 1
170*67e74705SXin Li // CHECK: [[NEW_A_VAL:%.+]] = load i32, i32* @{{.+}},
171*67e74705SXin Li // CHECK: [[NEW_A_VAL_I64:%.+]] = sext i32 [[NEW_A_VAL]] to i64
172*67e74705SXin Li // CHECK: [[SUB:%.+]] = add nsw i64 -1, [[NEW_A_VAL_I64]]
173*67e74705SXin Li // CHECK: [[IDX1:%.+]] = mul nsw i64 [[SUB]], [[A_VAL]]
174*67e74705SXin Li // CHECK: [[END:%.+]] = getelementptr inbounds i32, i32* %{{.+}}, i64 [[IDX1]]
175*67e74705SXin Li // CHECK: [[END1:%.+]] = getelementptr inbounds i32, i32* [[END]], i64 [[IDX2]]
176*67e74705SXin Li // CHECK: [[END2:%.+]] = getelementptr i32, i32* [[END1]], i32 1
177*67e74705SXin Li // CHECK: [[START_INT:%.+]] = ptrtoint i32* [[START1]] to i64
178*67e74705SXin Li // CHECK: [[END_INT:%.+]] = ptrtoint i32* [[END2]] to i64
179*67e74705SXin Li // CHECK: [[SIZEOF:%.+]] = sub nuw i64 [[END_INT]], [[START_INT]]
180*67e74705SXin Li // CHECK: getelementptr inbounds [3 x [[KMP_DEPEND_INFO]]], [3 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i64 0, i64 2
181*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 0
182*67e74705SXin Li // CHECK: ptrtoint i32* [[START1]] to i64
183*67e74705SXin Li // CHECK: store i64 %{{[^,]+}}, i64*
184*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 1
185*67e74705SXin Li // CHECK: store i64 [[SIZEOF]], i64*
186*67e74705SXin Li // CHECK: getelementptr inbounds [[KMP_DEPEND_INFO]], [[KMP_DEPEND_INFO]]* %{{[^,]+}}, i32 0, i32 2
187*67e74705SXin Li // CHECK: store i8 3, i8*
188*67e74705SXin Li // CHECK: getelementptr inbounds [3 x [[KMP_DEPEND_INFO]]], [3 x [[KMP_DEPEND_INFO]]]* %{{[^,]+}}, i32 0, i32 0
189*67e74705SXin Li // CHECK: bitcast [[KMP_DEPEND_INFO]]* %{{.+}} to i8*
190*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task_with_deps([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 3, i8* %{{[^,]+}}, i32 0, i8* null)
191*67e74705SXin Li #pragma omp task final(true) depend(inout: a, s[1], arr[:a][3:])
192*67e74705SXin Li {
193*67e74705SXin Li a = 2;
194*67e74705SXin Li }
195*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i32 3, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, [[KMP_TASK_T]]{{.*}}*)* [[TASK_ENTRY3:@.+]] to i32 (i32, i8*)*))
196*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
197*67e74705SXin Li #pragma omp task final(true)
198*67e74705SXin Li {
199*67e74705SXin Li a = 2;
200*67e74705SXin Li }
201*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, [[KMP_TASK_T]]{{.*}}*)* [[TASK_ENTRY4:@.+]] to i32 (i32, i8*)*))
202*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
203*67e74705SXin Li const bool flag = false;
204*67e74705SXin Li #pragma omp task final(flag)
205*67e74705SXin Li {
206*67e74705SXin Li a = 3;
207*67e74705SXin Li }
208*67e74705SXin Li // CHECK: [[B_VAL:%.+]] = load i8, i8* [[B]]
209*67e74705SXin Li // CHECK: [[CMP:%.+]] = icmp ne i8 [[B_VAL]], 0
210*67e74705SXin Li // CHECK: [[FINAL:%.+]] = select i1 [[CMP]], i32 2, i32 0
211*67e74705SXin Li // CHECK: [[FLAGS:%.+]] = or i32 [[FINAL]], 1
212*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i32 [[FLAGS]], i64 40, i64 8, i32 (i32, i8*)* bitcast (i32 (i32, [[KMP_TASK_T]]{{.*}}*)* [[TASK_ENTRY5:@.+]] to i32 (i32, i8*)*))
213*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
214*67e74705SXin Li int c __attribute__((aligned(128)));
215*67e74705SXin Li #pragma omp task final(b) shared(c)
216*67e74705SXin Li {
217*67e74705SXin Li a = 4;
218*67e74705SXin Li c = 5;
219*67e74705SXin Li }
220*67e74705SXin Li // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i32 0, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, [[KMP_TASK_T]]{{.*}}*)* [[TASK_ENTRY6:@.+]] to i32 (i32, i8*)*))
221*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task([[IDENT_T]]* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
222*67e74705SXin Li #pragma omp task untied
223*67e74705SXin Li {
224*67e74705SXin Li S s1;
225*67e74705SXin Li #pragma omp task
226*67e74705SXin Li a = 4;
227*67e74705SXin Li #pragma omp taskyield
228*67e74705SXin Li s1 = S();
229*67e74705SXin Li #pragma omp taskwait
230*67e74705SXin Li }
231*67e74705SXin Li return a;
232*67e74705SXin Li }
233*67e74705SXin Li // CHECK: define internal i32 [[TASK_ENTRY1]](i32, [[KMP_TASK_T]]{{.*}}* noalias)
234*67e74705SXin Li // CHECK: store i32 15, i32* [[A_PTR:@.+]]
235*67e74705SXin Li // CHECK: [[A_VAL:%.+]] = load i32, i32* [[A_PTR]]
236*67e74705SXin Li // CHECK: [[A_VAL_I8:%.+]] = trunc i32 [[A_VAL]] to i8
237*67e74705SXin Li // CHECK: store i8 [[A_VAL_I8]], i8* %{{.+}}
238*67e74705SXin Li // CHECK: store i32 10, i32* %{{.+}}
239*67e74705SXin Li
240*67e74705SXin Li // CHECK: define internal i32 [[TASK_ENTRY2]](i32, [[KMP_TASK_T]]{{.*}}* noalias)
241*67e74705SXin Li // CHECK: store i32 1, i32* [[A_PTR]]
242*67e74705SXin Li
243*67e74705SXin Li // CHECK: define internal i32 [[TASK_ENTRY3]](i32, [[KMP_TASK_T]]{{.*}}* noalias)
244*67e74705SXin Li // CHECK: store i32 2, i32* [[A_PTR]]
245*67e74705SXin Li
246*67e74705SXin Li // CHECK: define internal i32 [[TASK_ENTRY4]](i32, [[KMP_TASK_T]]{{.*}}* noalias)
247*67e74705SXin Li // CHECK: store i32 3, i32* [[A_PTR]]
248*67e74705SXin Li
249*67e74705SXin Li // CHECK: define internal i32 [[TASK_ENTRY5]](i32, [[KMP_TASK_T]]{{.*}}* noalias)
250*67e74705SXin Li // CHECK: store i32 4, i32* [[A_PTR]]
251*67e74705SXin Li // CHECK: store i32 5, i32* [[C_PTR:%.+]], align 128
252*67e74705SXin Li
253*67e74705SXin Li // CHECK: define internal i32
254*67e74705SXin Li // CHECK: store i32 4, i32* [[A_PTR]]
255*67e74705SXin Li
256*67e74705SXin Li // CHECK: define internal i32 [[TASK_ENTRY6]](i32, [[KMP_TASK_T]]{{.*}}* noalias)
257*67e74705SXin Li // CHECK: switch i32 %{{.+}}, label
258*67e74705SXin Li // CHECK: load i32*, i32** %
259*67e74705SXin Li // CHECK: store i32 1, i32* %
260*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task(%
261*67e74705SXin Li
262*67e74705SXin Li // CHECK: call i8* @__kmpc_omp_task_alloc(
263*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task(%
264*67e74705SXin Li // CHECK: load i32*, i32** %
265*67e74705SXin Li // CHECK: store i32 2, i32* %
266*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task(%
267*67e74705SXin Li
268*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_taskyield(%
269*67e74705SXin Li // CHECK: load i32*, i32** %
270*67e74705SXin Li // CHECK: store i32 3, i32* %
271*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task(%
272*67e74705SXin Li
273*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_taskwait(%
274*67e74705SXin Li // CHECK: load i32*, i32** %
275*67e74705SXin Li // CHECK: store i32 4, i32* %
276*67e74705SXin Li // CHECK: call i32 @__kmpc_omp_task(%
277*67e74705SXin Li #endif
278*67e74705SXin Li
279