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
5 %struct.ident_t = type { i32, i32, i32, i32, i8* }
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
10 ; doesn't modify any ICVs.
11 define 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]]
17 %2 = add nsw i32 %0, 1
21 define 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]]
28 tail call void @use(i32 %0)
29 %2 = add nsw i32 %0, 1
33 define 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]]
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
49 define 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
58 call void @omp_set_num_threads(i32 4)
60 %2 = tail call i32 @omp_get_max_threads()
61 tail call void @use(i32 %2)
65 define 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
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)
92 declare dso_local void @omp_set_num_threads(i32)
94 declare dso_local i32 @omp_get_max_threads()
96 declare dso_local void @use(i32)
97 declare dso_local void @no_openmp_use(i32) "no_openmp"
99 define 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
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)
119 declare !callback !0 void @__kmpc_fork_call(%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...)
121 define 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
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)
143 define 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
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)
164 define 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
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)
185 define 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
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)
204 define 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:%.*]]
211 ; CHECK-NEXT: call void @use(i32 10)
212 ; CHECK-NEXT: br label [[TMP4]]
214 ; CHECK-NEXT: [[TMP5:%.*]] = call i32 @omp_get_max_threads()
215 ; CHECK-NEXT: call void @use(i32 [[TMP5]])
216 ; CHECK-NEXT: ret void
218 call void @omp_set_num_threads(i32 2)
219 %2 = icmp eq i1 %0, 0
220 br i1 %2, label %4, label %3
223 call void @use(i32 10)
227 %5 = call i32 @omp_get_max_threads()
228 call void @use(i32 %5)
232 define 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:%.*]]
239 ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @icv_free_use(i32 10)
240 ; CHECK-NEXT: br label [[TMP5]]
242 ; CHECK-NEXT: call void @use(i32 2)
243 ; CHECK-NEXT: ret void
245 call void @omp_set_num_threads(i32 2)
246 %2 = icmp eq i1 %0, 0
247 br i1 %2, label %5, label %3
250 %4 = call i32 @icv_free_use(i32 10)
254 %6 = call i32 @omp_get_max_threads()
255 call void @use(i32 %6)
259 define 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:%.*]]
266 ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @bad_use(i32 10)
267 ; CHECK-NEXT: br label [[TMP5]]
269 ; CHECK-NEXT: [[TMP6:%.*]] = call i32 @omp_get_max_threads()
270 ; CHECK-NEXT: call void @use(i32 [[TMP6]])
271 ; CHECK-NEXT: ret void
273 call void @omp_set_num_threads(i32 2)
274 %2 = icmp eq i1 %0, 0
275 br i1 %2, label %5, label %3
278 %4 = call i32 @bad_use(i32 10)
282 %6 = call i32 @omp_get_max_threads()
283 call void @use(i32 %6)
287 define 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:%.*]]
294 ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @ok_use_assume(i32 10)
295 ; CHECK-NEXT: br label [[TMP5]]
297 ; CHECK-NEXT: call void @use(i32 2)
298 ; CHECK-NEXT: ret void
300 call void @omp_set_num_threads(i32 2)
301 %2 = icmp eq i1 %0, 0
302 br i1 %2, label %5, label %3
305 %4 = call i32 @ok_use_assume(i32 10)
309 %6 = call i32 @omp_get_max_threads()
310 call void @use(i32 %6)
314 define 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:%.*]]
321 ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @icv_free_use(i32 10)
322 ; CHECK-NEXT: br label [[TMP5]]
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
328 call void @omp_set_num_threads(i32 2)
329 %2 = icmp eq i1 %0, 0
330 br i1 %2, label %5, label %3
333 %4 = call i32 @icv_free_use(i32 10)
337 %6 = call i32 @omp_get_max_threads()
338 %7 = call i32 @icv_free_use(i32 %6)
342 define 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:%.*]]
349 ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @icv_free_use(i32 10)
350 ; CHECK-NEXT: br label [[TMP5]]
352 ; CHECK-NEXT: [[TMP6:%.*]] = call i32 @icv_free_use(i32 2)
353 ; CHECK-NEXT: ret void
355 call void @omp_set_num_threads(i32 2)
356 %2 = icmp eq i1 %0, 0
357 br i1 %2, label %5, label %3
360 %4 = call i32 @icv_free_use(i32 10)
364 %6 = call i32 @omp_get_max_threads()
365 %7 = call i32 @icv_free_use(i32 %6)
369 define 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:%.*]]
375 ; CHECK-NEXT: call void @omp_set_num_threads(i32 2)
376 ; CHECK-NEXT: br label [[TMP3]]
378 ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @omp_get_max_threads()
379 ; CHECK-NEXT: ret i32 [[TMP4]]
381 call void @omp_set_num_threads(i32 4)
382 br i1 %0, label %3, label %2
385 call void @omp_set_num_threads(i32 2)
389 %4 = call i32 @omp_get_max_threads()
393 define 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:%.*]]
399 ; CHECK-NEXT: call void @omp_set_num_threads(i32 4)
400 ; CHECK-NEXT: br label [[TMP4]]
402 ; CHECK-NEXT: [[TMP5:%.*]] = call i32 @omp_get_max_threads()
403 ; CHECK-NEXT: call void @use(i32 [[TMP5]])
404 ; CHECK-NEXT: ret void
406 %2 = icmp eq i1 %0, 0
407 br i1 %2, label %4, label %3
410 call void @omp_set_num_threads(i32 4)
414 %5 = call i32 @omp_get_max_threads()
415 call void @use(i32 %5)
419 define 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:%.*]]
425 ; CHECK-NEXT: call void @omp_set_num_threads(i32 4)
426 ; CHECK-NEXT: br label [[TMP4]]
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
433 %2 = icmp eq i1 %0, 0
434 br i1 %2, label %4, label %3
437 call void @omp_set_num_threads(i32 4)
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)
447 declare void @__cxa_rethrow()
449 define 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:%.*]]
455 ; CHECK-NEXT: tail call void @__cxa_rethrow()
456 ; CHECK-NEXT: unreachable
458 ; CHECK-NEXT: ret i32 -1
460 call void @omp_set_num_threads(i32 4)
461 br i1 %0, label %2, label %3
464 tail call void @__cxa_rethrow() #1
471 define 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:%.*]]
478 ; CHECK-NEXT: [[VAL:%.*]] = call i32 @icv_free_use(i32 10)
479 ; CHECK-NEXT: br label [[TMP4]]
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
487 call void @known_unique_icv(i1 %0)
488 %2 = icmp eq i1 %0, 0
489 br i1 %2, label %4, label %3
492 %val = call i32 @icv_free_use(i32 10)
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)
504 define 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:%.*]]
511 ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i1 [[TMP0]], false
512 ; CHECK-NEXT: br i1 [[TMP3]], label [[TMP5:%.*]], label [[TMP4:%.*]]
514 ; CHECK-NEXT: [[LP:%.*]] = landingpad { i8*, i32 }
515 ; CHECK-NEXT: filter [0 x i8*] zeroinitializer
516 ; CHECK-NEXT: unreachable
518 ; CHECK-NEXT: [[VAL:%.*]] = call i32 @icv_free_use(i32 10)
519 ; CHECK-NEXT: br label [[TMP5]]
521 ; CHECK-NEXT: call void @use(i32 2)
522 ; CHECK-NEXT: ret void
524 call void @known_unique_icv(i1 %0)
525 invoke i32 @maybe_throw(i1 zeroext %0)
526 to label %cont unwind label %exc
529 %3 = icmp eq i1 %0, 0
530 br i1 %3, label %5, label %4
533 %lp = landingpad { i8*, i32 }
534 filter [0 x i8*] zeroinitializer
538 %val = call i32 @icv_free_use(i32 10)
542 %6 = call i32 @omp_get_max_threads()
543 call void @use(i32 %6)
547 define 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:%.*]]
554 ; CHECK-NEXT: call void @use(i32 4)
555 ; CHECK-NEXT: br label [[TMP12:%.*]]
557 ; CHECK-NEXT: [[TMP5:%.*]] = icmp sgt i32 [[TMP0]], 0
558 ; CHECK-NEXT: br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP8:%.*]]
560 ; CHECK-NEXT: [[TMP7:%.*]] = call i32 @icv_free_use(i32 [[TMP0]])
561 ; CHECK-NEXT: br label [[TMP15:%.*]]
563 ; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP0]], 0
564 ; CHECK-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP12]]
566 ; CHECK-NEXT: [[TMP11:%.*]] = call i32 @icv_free_use(i32 10)
567 ; CHECK-NEXT: br label [[TMP15]]
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]]
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]]
577 call void @omp_set_num_threads(i32 4)
578 %2 = icmp sgt i32 %0, 3
579 br i1 %2, label %3, label %5
582 %4 = call i32 @omp_get_max_threads()
583 call void @use(i32 %4)
587 %6 = icmp sgt i32 %0, 0
588 br i1 %6, label %7, label %9
591 %8 = call i32 @icv_free_use(i32 %0)
595 %10 = icmp eq i32 %0, 0
596 br i1 %10, label %11, label %13
599 %12 = call i32 @icv_free_use(i32 10)
603 %14 = add nsw i32 %0, 1
604 %15 = call i32 @icv_free_use(i32 %14)
608 %17 = call i32 @omp_get_max_threads()
609 %18 = call i32 @icv_free_use(i32 %17)
613 define 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:%.*]]
620 ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @icv_free_use(i32 10)
621 ; CHECK-NEXT: br label [[TMP16:%.*]]
623 ; CHECK-NEXT: [[TMP6:%.*]] = icmp sgt i32 [[TMP0]], 0
624 ; CHECK-NEXT: br i1 [[TMP6]], label [[TMP7:%.*]], label [[TMP9:%.*]]
626 ; CHECK-NEXT: [[TMP8:%.*]] = call i32 @icv_free_use(i32 [[TMP0]])
627 ; CHECK-NEXT: br label [[TMP16]]
629 ; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i32 [[TMP0]], 0
630 ; CHECK-NEXT: br i1 [[TMP10]], label [[TMP11:%.*]], label [[TMP13:%.*]]
632 ; CHECK-NEXT: [[TMP12:%.*]] = call i32 @icv_free_use(i32 5)
633 ; CHECK-NEXT: br label [[TMP16]]
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]]
639 ; CHECK-NEXT: [[TMP17:%.*]] = call i32 @icv_free_use(i32 4)
640 ; CHECK-NEXT: ret i32 [[TMP17]]
642 call void @omp_set_num_threads(i32 4)
643 %2 = icmp sgt i32 %0, 3
644 br i1 %2, label %3, label %5
647 %4 = call i32 @icv_free_use(i32 10)
651 %6 = icmp sgt i32 %0, 0
652 br i1 %6, label %7, label %9
655 %8 = call i32 @icv_free_use(i32 %0)
659 %10 = icmp eq i32 %0, 0
660 br i1 %10, label %11, label %13
663 %12 = call i32 @icv_free_use(i32 5)
667 %14 = add nsw i32 %0, 1
668 %15 = call i32 @icv_free_use(i32 %14)
671 16: ; preds = %7, %13, %11, %3
672 %17 = call i32 @omp_get_max_threads()
673 %18 = call i32 @icv_free_use(i32 %17)
677 declare i32 @__gxx_personality_v0(...)
679 !llvm.module.flags = !{!2}
682 !1 = !{i64 2, i64 -1, i64 -1, i1 true}
683 !2 = !{i32 7, !"openmp", i32 50}