1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
2; RUN: opt -S -openmp-opt-cgscc < %s | FileCheck %s
3; RUN: opt -S -passes=openmp-opt-cgscc < %s | FileCheck %s
4
5%struct.ident_t = type { i32, i32, i32, i32, i8* }
6
7@.str = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1
8@0 = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str, i32 0, i32 0) }, align 8
9
10; doesn't modify any ICVs.
11define i32 @icv_free_use(i32 %0) {
12; CHECK-LABEL: define {{[^@]+}}@icv_free_use
13; CHECK-SAME: (i32 [[TMP0:%.*]]) {
14; CHECK-NEXT:    [[TMP2:%.*]] = add nsw i32 [[TMP0]], 1
15; CHECK-NEXT:    ret i32 [[TMP2]]
16;
17  %2 = add nsw i32 %0, 1
18  ret i32 %2
19}
20
21define i32 @bad_use(i32 %0) {
22; CHECK-LABEL: define {{[^@]+}}@bad_use
23; CHECK-SAME: (i32 [[TMP0:%.*]]) {
24; CHECK-NEXT:    tail call void @use(i32 [[TMP0]])
25; CHECK-NEXT:    [[TMP2:%.*]] = add nsw i32 [[TMP0]], 1
26; CHECK-NEXT:    ret i32 [[TMP2]]
27;
28  tail call void @use(i32 %0)
29  %2 = add nsw i32 %0, 1
30  ret i32 %2
31}
32
33define i32 @ok_use_assume(i32 %0) {
34; CHECK-LABEL: define {{[^@]+}}@ok_use_assume
35; CHECK-SAME: (i32 [[TMP0:%.*]]) {
36; CHECK-NEXT:    call void @use(i32 [[TMP0]]) #[[ATTR1:[0-9]+]]
37; CHECK-NEXT:    call void @use(i32 [[TMP0]]) #[[ATTR2:[0-9]+]]
38; CHECK-NEXT:    call void @no_openmp_use(i32 [[TMP0]])
39; CHECK-NEXT:    [[TMP2:%.*]] = add nsw i32 [[TMP0]], 1
40; CHECK-NEXT:    ret i32 [[TMP2]]
41;
42  call void @use(i32 %0) "no_openmp"
43  call void @use(i32 %0) "no_openmp_routines"
44  call void @no_openmp_use(i32 %0)
45  %2 = add nsw i32 %0, 1
46  ret i32 %2
47}
48
49define void @indirect_call(void ()* %0) {
50; CHECK-LABEL: define {{[^@]+}}@indirect_call
51; CHECK-SAME: (void ()* [[TMP0:%.*]]) {
52; CHECK-NEXT:    call void @omp_set_num_threads(i32 4)
53; CHECK-NEXT:    tail call void [[TMP0]]()
54; CHECK-NEXT:    [[TMP2:%.*]] = tail call i32 @omp_get_max_threads()
55; CHECK-NEXT:    tail call void @use(i32 [[TMP2]])
56; CHECK-NEXT:    ret void
57;
58  call void @omp_set_num_threads(i32 4)
59  tail call void %0()
60  %2 = tail call i32 @omp_get_max_threads()
61  tail call void @use(i32 %2)
62  ret void
63}
64
65define dso_local i32 @foo(i32 %0, i32 %1) {
66; CHECK-LABEL: define {{[^@]+}}@foo
67; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
68; CHECK-NEXT:    tail call void @omp_set_num_threads(i32 [[TMP0]])
69; CHECK-NEXT:    tail call void @omp_set_num_threads(i32 [[TMP1]])
70; CHECK-NEXT:    tail call void @use(i32 [[TMP1]])
71; CHECK-NEXT:    tail call void @use(i32 [[TMP1]])
72; CHECK-NEXT:    tail call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @[[GLOB0:[0-9]+]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
73; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @omp_get_max_threads()
74; CHECK-NEXT:    tail call void @use(i32 [[TMP3]])
75; CHECK-NEXT:    ret i32 0
76;
77  tail call void @omp_set_num_threads(i32 %0)
78  %3 = tail call i32 @omp_get_max_threads()
79; FIXME: this value should be tracked and the rest of the getters deduplicated and replaced with it.
80  tail call void @omp_set_num_threads(i32 %1)
81  %4 = tail call i32 @omp_get_max_threads()
82  %5 = tail call i32 @omp_get_max_threads()
83  %6 = tail call i32 @omp_get_max_threads()
84  tail call void @use(i32 %4)
85  tail call void @use(i32 %5)
86  tail call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @0, i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*))
87  %7 = tail call i32 @omp_get_max_threads()
88  tail call void @use(i32 %7)
89  ret i32 0
90}
91
92declare dso_local void @omp_set_num_threads(i32)
93
94declare dso_local i32 @omp_get_max_threads()
95
96declare dso_local void @use(i32)
97declare dso_local void @no_openmp_use(i32) "no_openmp"
98
99define internal void @.omp_outlined.(i32* %0, i32* %1) {
100; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.
101; CHECK-SAME: (i32* [[TMP0:%.*]], i32* [[TMP1:%.*]]) {
102; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @omp_get_max_threads()
103; CHECK-NEXT:    [[TMP4:%.*]] = tail call i32 @omp_get_max_threads()
104; CHECK-NEXT:    tail call void @use(i32 [[TMP4]])
105; CHECK-NEXT:    tail call void @omp_set_num_threads(i32 10)
106; CHECK-NEXT:    tail call void @use(i32 10)
107; CHECK-NEXT:    ret void
108;
109; FIXME: this value should be tracked and the rest of the getters deduplicated and replaced with it.
110  %3 = tail call i32 @omp_get_max_threads()
111  %4 = tail call i32 @omp_get_max_threads()
112  tail call void @use(i32 %4)
113  tail call void @omp_set_num_threads(i32 10)
114  %5 = tail call i32 @omp_get_max_threads()
115  tail call void @use(i32 %5)
116  ret void
117}
118
119declare !callback !0 void @__kmpc_fork_call(%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...)
120
121define dso_local i32 @bar(i32 %0, i32 %1) {
122; CHECK-LABEL: define {{[^@]+}}@bar
123; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
124; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[TMP0]], [[TMP1]]
125; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP0]], i32 [[TMP1]]
126; CHECK-NEXT:    tail call void @omp_set_num_threads(i32 [[TMP4]])
127; CHECK-NEXT:    tail call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @[[GLOB0]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
128; CHECK-NEXT:    [[TMP5:%.*]] = tail call i32 @omp_get_max_threads()
129; CHECK-NEXT:    tail call void @use(i32 [[TMP5]])
130; CHECK-NEXT:    ret i32 0
131;
132  %3 = icmp sgt i32 %0, %1
133  %4 = select i1 %3, i32 %0, i32 %1
134; FIXME: getters can be replaced with %4
135  tail call void @omp_set_num_threads(i32 %4)
136  %5 = tail call i32 @omp_get_max_threads()
137  tail call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @0, i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*))
138  %6 = tail call i32 @omp_get_max_threads()
139  tail call void @use(i32 %6)
140  ret i32 0
141}
142
143define internal void @.omp_outlined..1(i32* %0, i32*  %1) {
144; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1
145; CHECK-SAME: (i32* [[TMP0:%.*]], i32* [[TMP1:%.*]]) {
146; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @omp_get_max_threads()
147; CHECK-NEXT:    tail call void @use(i32 [[TMP3]])
148; CHECK-NEXT:    tail call void @omp_set_num_threads(i32 10)
149; CHECK-NEXT:    tail call void @use(i32 10)
150; CHECK-NEXT:    [[TMP4:%.*]] = tail call i32 @omp_get_max_threads()
151; CHECK-NEXT:    tail call void @use(i32 [[TMP4]])
152; CHECK-NEXT:    ret void
153;
154  %3 = tail call i32 @omp_get_max_threads()
155  tail call void @use(i32 %3)
156  tail call void @omp_set_num_threads(i32 10)
157  %4 = tail call i32 @omp_get_max_threads()
158  tail call void @use(i32 %4)
159  %5 = tail call i32 @omp_get_max_threads()
160  tail call void @use(i32 %5)
161  ret void
162}
163
164define dso_local i32 @bar1(i32 %0, i32 %1) {
165; CHECK-LABEL: define {{[^@]+}}@bar1
166; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) {
167; CHECK-NEXT:    [[TMP3:%.*]] = icmp sgt i32 [[TMP0]], [[TMP1]]
168; CHECK-NEXT:    [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP0]], i32 [[TMP1]]
169; CHECK-NEXT:    tail call void @omp_set_num_threads(i32 [[TMP4]])
170; CHECK-NEXT:    tail call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @[[GLOB0]], i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*))
171; CHECK-NEXT:    [[TMP5:%.*]] = tail call i32 @omp_get_max_threads()
172; CHECK-NEXT:    tail call void @use(i32 [[TMP5]])
173; CHECK-NEXT:    ret i32 0
174;
175  %3 = icmp sgt i32 %0, %1
176  %4 = select i1 %3, i32 %0, i32 %1
177  tail call void @omp_set_num_threads(i32 %4)
178  %5 = tail call i32 @omp_get_max_threads()
179  tail call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* nonnull @0, i32 0, void (i32*, i32*, ...)* bitcast (void (i32*, i32*)* @.omp_outlined..2 to void (i32*, i32*, ...)*))
180  %6 = tail call i32 @omp_get_max_threads()
181  tail call void @use(i32 %6)
182  ret i32 0
183}
184
185define internal void @.omp_outlined..2(i32* %0, i32*  %1) {
186; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2
187; CHECK-SAME: (i32* [[TMP0:%.*]], i32* [[TMP1:%.*]]) {
188; CHECK-NEXT:    [[TMP3:%.*]] = tail call i32 @omp_get_max_threads()
189; CHECK-NEXT:    [[TMP4:%.*]] = tail call i32 @icv_free_use(i32 [[TMP3]])
190; CHECK-NEXT:    tail call void @omp_set_num_threads(i32 10)
191; CHECK-NEXT:    [[TMP5:%.*]] = tail call i32 @icv_free_use(i32 10)
192; CHECK-NEXT:    [[TMP6:%.*]] = tail call i32 @icv_free_use(i32 10)
193; CHECK-NEXT:    ret void
194;
195  %3 = tail call i32 @omp_get_max_threads()
196  %4 = tail call i32 @icv_free_use(i32 %3)
197  tail call void @omp_set_num_threads(i32 10)
198  %5 = tail call i32 @omp_get_max_threads()
199  %6 = tail call i32 @icv_free_use(i32 %5)
200  %7 = tail call i32 @omp_get_max_threads()
201  %8 = tail call i32 @icv_free_use(i32 %7)
202  ret void
203}
204define void @test(i1 %0) {
205; CHECK-LABEL: define {{[^@]+}}@test
206; CHECK-SAME: (i1 [[TMP0:%.*]]) {
207; CHECK-NEXT:    call void @omp_set_num_threads(i32 2)
208; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false
209; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]]
210; CHECK:       3:
211; CHECK-NEXT:    call void @use(i32 10)
212; CHECK-NEXT:    br label [[TMP4]]
213; CHECK:       4:
214; CHECK-NEXT:    [[TMP5:%.*]] = call i32 @omp_get_max_threads()
215; CHECK-NEXT:    call void @use(i32 [[TMP5]])
216; CHECK-NEXT:    ret void
217;
218  call void @omp_set_num_threads(i32 2)
219  %2 = icmp eq i1 %0, 0
220  br i1 %2, label %4, label %3
221
2223:                                                ; preds = %1
223  call void @use(i32 10)
224  br label %4
225
2264:                                                ; preds = %3, %1
227  %5 = call i32 @omp_get_max_threads()
228  call void @use(i32 %5)
229  ret void
230}
231
232define void @test1(i1 %0) {
233; CHECK-LABEL: define {{[^@]+}}@test1
234; CHECK-SAME: (i1 [[TMP0:%.*]]) {
235; CHECK-NEXT:    call void @omp_set_num_threads(i32 2)
236; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false
237; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]]
238; CHECK:       3:
239; CHECK-NEXT:    [[TMP4:%.*]] = call i32 @icv_free_use(i32 10)
240; CHECK-NEXT:    br label [[TMP5]]
241; CHECK:       5:
242; CHECK-NEXT:    call void @use(i32 2)
243; CHECK-NEXT:    ret void
244;
245  call void @omp_set_num_threads(i32 2)
246  %2 = icmp eq i1 %0, 0
247  br i1 %2, label %5, label %3
248
2493:                                                ; preds = %1
250  %4 = call i32 @icv_free_use(i32 10)
251  br label %5
252
2535:                                                ; preds = %3, %1
254  %6 = call i32 @omp_get_max_threads()
255  call void @use(i32 %6)
256  ret void
257}
258
259define void @bad_use_test(i1 %0) {
260; CHECK-LABEL: define {{[^@]+}}@bad_use_test
261; CHECK-SAME: (i1 [[TMP0:%.*]]) {
262; CHECK-NEXT:    call void @omp_set_num_threads(i32 2)
263; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false
264; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]]
265; CHECK:       3:
266; CHECK-NEXT:    [[TMP4:%.*]] = call i32 @bad_use(i32 10)
267; CHECK-NEXT:    br label [[TMP5]]
268; CHECK:       5:
269; CHECK-NEXT:    [[TMP6:%.*]] = call i32 @omp_get_max_threads()
270; CHECK-NEXT:    call void @use(i32 [[TMP6]])
271; CHECK-NEXT:    ret void
272;
273  call void @omp_set_num_threads(i32 2)
274  %2 = icmp eq i1 %0, 0
275  br i1 %2, label %5, label %3
276
2773:                                                ; preds = %1
278  %4 = call i32 @bad_use(i32 10)
279  br label %5
280
2815:                                                ; preds = %3, %1
282  %6 = call i32 @omp_get_max_threads()
283  call void @use(i32 %6)
284  ret void
285}
286
287define void @ok_use_assume_test(i1 %0) {
288; CHECK-LABEL: define {{[^@]+}}@ok_use_assume_test
289; CHECK-SAME: (i1 [[TMP0:%.*]]) {
290; CHECK-NEXT:    call void @omp_set_num_threads(i32 2)
291; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false
292; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]]
293; CHECK:       3:
294; CHECK-NEXT:    [[TMP4:%.*]] = call i32 @ok_use_assume(i32 10)
295; CHECK-NEXT:    br label [[TMP5]]
296; CHECK:       5:
297; CHECK-NEXT:    call void @use(i32 2)
298; CHECK-NEXT:    ret void
299;
300  call void @omp_set_num_threads(i32 2)
301  %2 = icmp eq i1 %0, 0
302  br i1 %2, label %5, label %3
303
3043:                                                ; preds = %1
305  %4 = call i32 @ok_use_assume(i32 10)
306  br label %5
307
3085:                                                ; preds = %3, %1
309  %6 = call i32 @omp_get_max_threads()
310  call void @use(i32 %6)
311  ret void
312}
313
314define weak void @weak_known_unique_icv(i1 %0) {
315; CHECK-LABEL: define {{[^@]+}}@weak_known_unique_icv
316; CHECK-SAME: (i1 [[TMP0:%.*]]) {
317; CHECK-NEXT:    call void @omp_set_num_threads(i32 2)
318; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false
319; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]]
320; CHECK:       3:
321; CHECK-NEXT:    [[TMP4:%.*]] = call i32 @icv_free_use(i32 10)
322; CHECK-NEXT:    br label [[TMP5]]
323; CHECK:       5:
324; CHECK-NEXT:    [[TMP6:%.*]] = call i32 @omp_get_max_threads()
325; CHECK-NEXT:    [[TMP7:%.*]] = call i32 @icv_free_use(i32 [[TMP6]])
326; CHECK-NEXT:    ret void
327;
328  call void @omp_set_num_threads(i32 2)
329  %2 = icmp eq i1 %0, 0
330  br i1 %2, label %5, label %3
331
3323:                                                ; preds = %1
333  %4 = call i32 @icv_free_use(i32 10)
334  br label %5
335
3365:                                                ; preds = %3, %1
337  %6 = call i32 @omp_get_max_threads()
338  %7 = call i32 @icv_free_use(i32 %6)
339  ret void
340}
341
342define void @known_unique_icv(i1 %0) {
343; CHECK-LABEL: define {{[^@]+}}@known_unique_icv
344; CHECK-SAME: (i1 [[TMP0:%.*]]) {
345; CHECK-NEXT:    call void @omp_set_num_threads(i32 2)
346; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false
347; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]]
348; CHECK:       3:
349; CHECK-NEXT:    [[TMP4:%.*]] = call i32 @icv_free_use(i32 10)
350; CHECK-NEXT:    br label [[TMP5]]
351; CHECK:       5:
352; CHECK-NEXT:    [[TMP6:%.*]] = call i32 @icv_free_use(i32 2)
353; CHECK-NEXT:    ret void
354;
355  call void @omp_set_num_threads(i32 2)
356  %2 = icmp eq i1 %0, 0
357  br i1 %2, label %5, label %3
358
3593:                                                ; preds = %1
360  %4 = call i32 @icv_free_use(i32 10)
361  br label %5
362
3635:                                                ; preds = %3, %1
364  %6 = call i32 @omp_get_max_threads()
365  %7 = call i32 @icv_free_use(i32 %6)
366  ret void
367}
368
369define i32 @no_unique_icv(i1 %0) {
370; CHECK-LABEL: define {{[^@]+}}@no_unique_icv
371; CHECK-SAME: (i1 [[TMP0:%.*]]) {
372; CHECK-NEXT:    call void @omp_set_num_threads(i32 4)
373; CHECK-NEXT:    br i1 [[TMP0]], label [[TMP3:%.*]], label [[TMP2:%.*]]
374; CHECK:       2:
375; CHECK-NEXT:    call void @omp_set_num_threads(i32 2)
376; CHECK-NEXT:    br label [[TMP3]]
377; CHECK:       3:
378; CHECK-NEXT:    [[TMP4:%.*]] = call i32 @omp_get_max_threads()
379; CHECK-NEXT:    ret i32 [[TMP4]]
380;
381  call void @omp_set_num_threads(i32 4)
382  br i1 %0, label %3, label %2
383
3842:                                                ; preds = %1
385  call void @omp_set_num_threads(i32 2)
386  br label %3
387
3883:                                                ; preds = %1, %2
389  %4 = call i32 @omp_get_max_threads()
390  ret i32 %4
391}
392
393define void @test2(i1 %0) {
394; CHECK-LABEL: define {{[^@]+}}@test2
395; CHECK-SAME: (i1 [[TMP0:%.*]]) {
396; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false
397; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]]
398; CHECK:       3:
399; CHECK-NEXT:    call void @omp_set_num_threads(i32 4)
400; CHECK-NEXT:    br label [[TMP4]]
401; CHECK:       4:
402; CHECK-NEXT:    [[TMP5:%.*]] = call i32 @omp_get_max_threads()
403; CHECK-NEXT:    call void @use(i32 [[TMP5]])
404; CHECK-NEXT:    ret void
405;
406  %2 = icmp eq i1 %0, 0
407  br i1 %2, label %4, label %3
408
4093:                                                ; preds = %1
410  call void @omp_set_num_threads(i32 4)
411  br label %4
412
4134:                                                ; preds = %3, %1
414  %5 = call i32 @omp_get_max_threads()
415  call void @use(i32 %5)
416  ret void
417}
418
419define void @test3(i1 %0) {
420; CHECK-LABEL: define {{[^@]+}}@test3
421; CHECK-SAME: (i1 [[TMP0:%.*]]) {
422; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false
423; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]]
424; CHECK:       3:
425; CHECK-NEXT:    call void @omp_set_num_threads(i32 4)
426; CHECK-NEXT:    br label [[TMP4]]
427; CHECK:       4:
428; CHECK-NEXT:    call void @weak_known_unique_icv(i1 [[TMP0]])
429; CHECK-NEXT:    [[TMP5:%.*]] = call i32 @omp_get_max_threads()
430; CHECK-NEXT:    [[TMP6:%.*]] = call i32 @icv_free_use(i32 [[TMP5]])
431; CHECK-NEXT:    ret void
432;
433  %2 = icmp eq i1 %0, 0
434  br i1 %2, label %4, label %3
435
4363:                                                ; preds = %1
437  call void @omp_set_num_threads(i32 4)
438  br label %4
439
4404:                                                ; preds = %3, %1
441  call void @weak_known_unique_icv(i1 %0)
442  %5 = call i32 @omp_get_max_threads()
443  %6 = call i32 @icv_free_use(i32 %5)
444  ret void
445}
446
447declare void @__cxa_rethrow()
448
449define i32 @maybe_throw(i1 zeroext %0) {
450; CHECK-LABEL: define {{[^@]+}}@maybe_throw
451; CHECK-SAME: (i1 zeroext [[TMP0:%.*]]) {
452; CHECK-NEXT:    call void @omp_set_num_threads(i32 4)
453; CHECK-NEXT:    br i1 [[TMP0]], label [[TMP2:%.*]], label [[TMP3:%.*]]
454; CHECK:       2:
455; CHECK-NEXT:    tail call void @__cxa_rethrow()
456; CHECK-NEXT:    unreachable
457; CHECK:       3:
458; CHECK-NEXT:    ret i32 -1
459;
460  call void @omp_set_num_threads(i32 4)
461  br i1 %0, label %2, label %3
462
4632:                                                ; preds = %1
464  tail call void @__cxa_rethrow() #1
465  unreachable
466
4673:                                                ; preds = %1
468  ret i32 -1
469}
470
471define void @test4(i1 %0) {
472; CHECK-LABEL: define {{[^@]+}}@test4
473; CHECK-SAME: (i1 [[TMP0:%.*]]) {
474; CHECK-NEXT:    call void @known_unique_icv(i1 [[TMP0]])
475; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false
476; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]]
477; CHECK:       3:
478; CHECK-NEXT:    [[VAL:%.*]] = call i32 @icv_free_use(i32 10)
479; CHECK-NEXT:    br label [[TMP4]]
480; CHECK:       4:
481; CHECK-NEXT:    call void @use(i32 2)
482; CHECK-NEXT:    [[TMP5:%.*]] = call i32 @omp_get_max_threads()
483; CHECK-NEXT:    [[TMP6:%.*]] = call i32 @no_unique_icv(i1 [[TMP0]])
484; CHECK-NEXT:    call void @use(i32 [[TMP5]])
485; CHECK-NEXT:    ret void
486;
487  call void @known_unique_icv(i1 %0)
488  %2 = icmp eq i1 %0, 0
489  br i1 %2, label %4, label %3
490
4913:                                                ; preds = %1
492  %val = call i32 @icv_free_use(i32 10)
493  br label %4
494
4954:                                                ; preds = %3, %1
496  %5 = call i32 @omp_get_max_threads()
497  call void @use(i32 %5)
498  %6 = call i32 @omp_get_max_threads()
499  call i32 @no_unique_icv(i1 %0)
500  call void @use(i32 %6)
501  ret void
502}
503
504define void @test4_invoke(i1 %0) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
505; CHECK-LABEL: define {{[^@]+}}@test4_invoke
506; CHECK-SAME: (i1 [[TMP0:%.*]]) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
507; CHECK-NEXT:    call void @known_unique_icv(i1 [[TMP0]])
508; CHECK-NEXT:    [[TMP2:%.*]] = invoke i32 @maybe_throw(i1 zeroext [[TMP0]])
509; CHECK-NEXT:    to label [[CONT:%.*]] unwind label [[EXC:%.*]]
510; CHECK:       cont:
511; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i1 [[TMP0]], false
512; CHECK-NEXT:    br i1 [[TMP3]], label [[TMP5:%.*]], label [[TMP4:%.*]]
513; CHECK:       exc:
514; CHECK-NEXT:    [[LP:%.*]] = landingpad { i8*, i32 }
515; CHECK-NEXT:    filter [0 x i8*] zeroinitializer
516; CHECK-NEXT:    unreachable
517; CHECK:       4:
518; CHECK-NEXT:    [[VAL:%.*]] = call i32 @icv_free_use(i32 10)
519; CHECK-NEXT:    br label [[TMP5]]
520; CHECK:       5:
521; CHECK-NEXT:    call void @use(i32 2)
522; CHECK-NEXT:    ret void
523;
524  call void @known_unique_icv(i1 %0)
525  invoke i32 @maybe_throw(i1 zeroext %0)
526  to label %cont unwind label %exc
527
528cont:
529  %3 = icmp eq i1 %0, 0
530  br i1 %3, label %5, label %4
531
532exc:
533  %lp = landingpad { i8*, i32 }
534  filter [0 x i8*] zeroinitializer
535  unreachable
536
5374:                                                ; preds = %1
538  %val = call i32 @icv_free_use(i32 10)
539  br label %5
540
5415:                                                ; preds = %3, %1
542  %6 = call i32 @omp_get_max_threads()
543  call void @use(i32 %6)
544  ret void
545}
546
547define i32 @test5(i32 %0)  #0 {
548; CHECK-LABEL: define {{[^@]+}}@test5
549; CHECK-SAME: (i32 [[TMP0:%.*]]) {
550; CHECK-NEXT:    call void @omp_set_num_threads(i32 4)
551; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[TMP0]], 3
552; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]]
553; CHECK:       3:
554; CHECK-NEXT:    call void @use(i32 4)
555; CHECK-NEXT:    br label [[TMP12:%.*]]
556; CHECK:       4:
557; CHECK-NEXT:    [[TMP5:%.*]] = icmp sgt i32 [[TMP0]], 0
558; CHECK-NEXT:    br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP8:%.*]]
559; CHECK:       6:
560; CHECK-NEXT:    [[TMP7:%.*]] = call i32 @icv_free_use(i32 [[TMP0]])
561; CHECK-NEXT:    br label [[TMP15:%.*]]
562; CHECK:       8:
563; CHECK-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP0]], 0
564; CHECK-NEXT:    br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP12]]
565; CHECK:       10:
566; CHECK-NEXT:    [[TMP11:%.*]] = call i32 @icv_free_use(i32 10)
567; CHECK-NEXT:    br label [[TMP15]]
568; CHECK:       12:
569; CHECK-NEXT:    [[TMP13:%.*]] = add nsw i32 [[TMP0]], 1
570; CHECK-NEXT:    [[TMP14:%.*]] = call i32 @icv_free_use(i32 [[TMP13]])
571; CHECK-NEXT:    br label [[TMP15]]
572; CHECK:       15:
573; CHECK-NEXT:    [[TMP16:%.*]] = call i32 @omp_get_max_threads()
574; CHECK-NEXT:    [[TMP17:%.*]] = call i32 @icv_free_use(i32 [[TMP16]])
575; CHECK-NEXT:    ret i32 [[TMP17]]
576;
577  call void @omp_set_num_threads(i32 4)
578  %2 = icmp sgt i32 %0, 3
579  br i1 %2, label %3, label %5
580
5813:
582  %4 = call i32 @omp_get_max_threads()
583  call void @use(i32 %4)
584  br label %13
585
5865:
587  %6 = icmp sgt i32 %0, 0
588  br i1 %6, label %7, label %9
589
5907:
591  %8 = call i32 @icv_free_use(i32 %0)
592  br label %16
593
5949:
595  %10 = icmp eq i32 %0, 0
596  br i1 %10, label %11, label %13
597
59811:
599  %12 = call i32 @icv_free_use(i32 10)
600  br label %16
601
60213:
603  %14 = add nsw i32 %0, 1
604  %15 = call i32 @icv_free_use(i32 %14)
605  br label %16
606
60716:
608  %17 = call i32 @omp_get_max_threads()
609  %18 = call i32 @icv_free_use(i32 %17)
610  ret i32 %18
611}
612
613define i32 @test6(i32 %0) {
614; CHECK-LABEL: define {{[^@]+}}@test6
615; CHECK-SAME: (i32 [[TMP0:%.*]]) {
616; CHECK-NEXT:    call void @omp_set_num_threads(i32 4)
617; CHECK-NEXT:    [[TMP2:%.*]] = icmp sgt i32 [[TMP0]], 3
618; CHECK-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]]
619; CHECK:       3:
620; CHECK-NEXT:    [[TMP4:%.*]] = call i32 @icv_free_use(i32 10)
621; CHECK-NEXT:    br label [[TMP16:%.*]]
622; CHECK:       5:
623; CHECK-NEXT:    [[TMP6:%.*]] = icmp sgt i32 [[TMP0]], 0
624; CHECK-NEXT:    br i1 [[TMP6]], label [[TMP7:%.*]], label [[TMP9:%.*]]
625; CHECK:       7:
626; CHECK-NEXT:    [[TMP8:%.*]] = call i32 @icv_free_use(i32 [[TMP0]])
627; CHECK-NEXT:    br label [[TMP16]]
628; CHECK:       9:
629; CHECK-NEXT:    [[TMP10:%.*]] = icmp eq i32 [[TMP0]], 0
630; CHECK-NEXT:    br i1 [[TMP10]], label [[TMP11:%.*]], label [[TMP13:%.*]]
631; CHECK:       11:
632; CHECK-NEXT:    [[TMP12:%.*]] = call i32 @icv_free_use(i32 5)
633; CHECK-NEXT:    br label [[TMP16]]
634; CHECK:       13:
635; CHECK-NEXT:    [[TMP14:%.*]] = add nsw i32 [[TMP0]], 1
636; CHECK-NEXT:    [[TMP15:%.*]] = call i32 @icv_free_use(i32 [[TMP14]])
637; CHECK-NEXT:    br label [[TMP16]]
638; CHECK:       16:
639; CHECK-NEXT:    [[TMP17:%.*]] = call i32 @icv_free_use(i32 4)
640; CHECK-NEXT:    ret i32 [[TMP17]]
641;
642  call void @omp_set_num_threads(i32 4)
643  %2 = icmp sgt i32 %0, 3
644  br i1 %2, label %3, label %5
645
6463:                                                ; preds = %1
647  %4 = call i32 @icv_free_use(i32 10)
648  br label %16
649
6505:                                                ; preds = %1
651  %6 = icmp sgt i32 %0, 0
652  br i1 %6, label %7, label %9
653
6547:                                                ; preds = %5
655  %8 = call i32 @icv_free_use(i32 %0)
656  br label %16
657
6589:                                                ; preds = %5
659  %10 = icmp eq i32 %0, 0
660  br i1 %10, label %11, label %13
661
66211:                                               ; preds = %9
663  %12 = call i32 @icv_free_use(i32 5)
664  br label %16
665
66613:                                               ; preds = %9
667  %14 = add nsw i32 %0, 1
668  %15 = call i32 @icv_free_use(i32 %14)
669  br label %16
670
67116:                                               ; preds = %7, %13, %11, %3
672  %17 = call i32 @omp_get_max_threads()
673  %18 = call i32 @icv_free_use(i32 %17)
674  ret i32 %18
675}
676
677declare i32 @__gxx_personality_v0(...)
678
679!llvm.module.flags = !{!2}
680
681!0 = !{!1}
682!1 = !{i64 2, i64 -1, i64 -1, i1 true}
683!2 = !{i32 7, !"openmp", i32 50}
684