[sanitizer] Improve FreeBSD ASLR detection
[llvm-project.git] / llvm / test / Transforms / OpenMP / icv_tracking.ll
blob6c769c2373bffc7c1236bd8f0cafbaab385fd74a
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
18   ret i32 %2
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
30   ret i32 %2
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
46   ret i32 %2
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)
59   tail call void %0()
60   %2 = tail call i32 @omp_get_max_threads()
61   tail call void @use(i32 %2)
62   ret void
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)
89   ret i32 0
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)
116   ret void
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)
140   ret i32 0
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)
161   ret void
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)
182   ret i32 0
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)
202   ret void
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:%.*]]
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
218   call void @omp_set_num_threads(i32 2)
219   %2 = icmp eq i1 %0, 0
220   br i1 %2, label %4, label %3
222 3:                                                ; preds = %1
223   call void @use(i32 10)
224   br label %4
226 4:                                                ; preds = %3, %1
227   %5 = call i32 @omp_get_max_threads()
228   call void @use(i32 %5)
229   ret void
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:%.*]]
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
245   call void @omp_set_num_threads(i32 2)
246   %2 = icmp eq i1 %0, 0
247   br i1 %2, label %5, label %3
249 3:                                                ; preds = %1
250   %4 = call i32 @icv_free_use(i32 10)
251   br label %5
253 5:                                                ; preds = %3, %1
254   %6 = call i32 @omp_get_max_threads()
255   call void @use(i32 %6)
256   ret void
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:%.*]]
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
273   call void @omp_set_num_threads(i32 2)
274   %2 = icmp eq i1 %0, 0
275   br i1 %2, label %5, label %3
277 3:                                                ; preds = %1
278   %4 = call i32 @bad_use(i32 10)
279   br label %5
281 5:                                                ; preds = %3, %1
282   %6 = call i32 @omp_get_max_threads()
283   call void @use(i32 %6)
284   ret void
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:%.*]]
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
300   call void @omp_set_num_threads(i32 2)
301   %2 = icmp eq i1 %0, 0
302   br i1 %2, label %5, label %3
304 3:                                                ; preds = %1
305   %4 = call i32 @ok_use_assume(i32 10)
306   br label %5
308 5:                                                ; preds = %3, %1
309   %6 = call i32 @omp_get_max_threads()
310   call void @use(i32 %6)
311   ret void
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:%.*]]
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
328   call void @omp_set_num_threads(i32 2)
329   %2 = icmp eq i1 %0, 0
330   br i1 %2, label %5, label %3
332 3:                                                ; preds = %1
333   %4 = call i32 @icv_free_use(i32 10)
334   br label %5
336 5:                                                ; preds = %3, %1
337   %6 = call i32 @omp_get_max_threads()
338   %7 = call i32 @icv_free_use(i32 %6)
339   ret void
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:%.*]]
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
355   call void @omp_set_num_threads(i32 2)
356   %2 = icmp eq i1 %0, 0
357   br i1 %2, label %5, label %3
359 3:                                                ; preds = %1
360   %4 = call i32 @icv_free_use(i32 10)
361   br label %5
363 5:                                                ; preds = %3, %1
364   %6 = call i32 @omp_get_max_threads()
365   %7 = call i32 @icv_free_use(i32 %6)
366   ret void
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:%.*]]
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]]
381   call void @omp_set_num_threads(i32 4)
382   br i1 %0, label %3, label %2
384 2:                                                ; preds = %1
385   call void @omp_set_num_threads(i32 2)
386   br label %3
388 3:                                                ; preds = %1, %2
389   %4 = call i32 @omp_get_max_threads()
390   ret i32 %4
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:%.*]]
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
406   %2 = icmp eq i1 %0, 0
407   br i1 %2, label %4, label %3
409 3:                                                ; preds = %1
410   call void @omp_set_num_threads(i32 4)
411   br label %4
413 4:                                                ; preds = %3, %1
414   %5 = call i32 @omp_get_max_threads()
415   call void @use(i32 %5)
416   ret void
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:%.*]]
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
433   %2 = icmp eq i1 %0, 0
434   br i1 %2, label %4, label %3
436 3:                                                ; preds = %1
437   call void @omp_set_num_threads(i32 4)
438   br label %4
440 4:                                                ; 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
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:%.*]]
454 ; CHECK:       2:
455 ; CHECK-NEXT:    tail call void @__cxa_rethrow()
456 ; CHECK-NEXT:    unreachable
457 ; CHECK:       3:
458 ; CHECK-NEXT:    ret i32 -1
460   call void @omp_set_num_threads(i32 4)
461   br i1 %0, label %2, label %3
463 2:                                                ; preds = %1
464   tail call void @__cxa_rethrow() #1
465   unreachable
467 3:                                                ; preds = %1
468   ret i32 -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:%.*]]
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
487   call void @known_unique_icv(i1 %0)
488   %2 = icmp eq i1 %0, 0
489   br i1 %2, label %4, label %3
491 3:                                                ; preds = %1
492   %val = call i32 @icv_free_use(i32 10)
493   br label %4
495 4:                                                ; 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
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:%.*]]
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
524   call void @known_unique_icv(i1 %0)
525   invoke i32 @maybe_throw(i1 zeroext %0)
526   to label %cont unwind label %exc
528 cont:
529   %3 = icmp eq i1 %0, 0
530   br i1 %3, label %5, label %4
532 exc:
533   %lp = landingpad { i8*, i32 }
534   filter [0 x i8*] zeroinitializer
535   unreachable
537 4:                                                ; preds = %1
538   %val = call i32 @icv_free_use(i32 10)
539   br label %5
541 5:                                                ; preds = %3, %1
542   %6 = call i32 @omp_get_max_threads()
543   call void @use(i32 %6)
544   ret void
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:%.*]]
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]]
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)
584   br label %13
587   %6 = icmp sgt i32 %0, 0
588   br i1 %6, label %7, label %9
591   %8 = call i32 @icv_free_use(i32 %0)
592   br label %16
595   %10 = icmp eq i32 %0, 0
596   br i1 %10, label %11, label %13
599   %12 = call i32 @icv_free_use(i32 10)
600   br label %16
603   %14 = add nsw i32 %0, 1
604   %15 = call i32 @icv_free_use(i32 %14)
605   br label %16
608   %17 = call i32 @omp_get_max_threads()
609   %18 = call i32 @icv_free_use(i32 %17)
610   ret i32 %18
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:%.*]]
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]]
642   call void @omp_set_num_threads(i32 4)
643   %2 = icmp sgt i32 %0, 3
644   br i1 %2, label %3, label %5
646 3:                                                ; preds = %1
647   %4 = call i32 @icv_free_use(i32 10)
648   br label %16
650 5:                                                ; preds = %1
651   %6 = icmp sgt i32 %0, 0
652   br i1 %6, label %7, label %9
654 7:                                                ; preds = %5
655   %8 = call i32 @icv_free_use(i32 %0)
656   br label %16
658 9:                                                ; preds = %5
659   %10 = icmp eq i32 %0, 0
660   br i1 %10, label %11, label %13
662 11:                                               ; preds = %9
663   %12 = call i32 @icv_free_use(i32 5)
664   br label %16
666 13:                                               ; preds = %9
667   %14 = add nsw i32 %0, 1
668   %15 = call i32 @icv_free_use(i32 %14)
669   br label %16
671 16:                                               ; 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
677 declare i32 @__gxx_personality_v0(...)
679 !llvm.module.flags = !{!2}
681 !0 = !{!1}
682 !1 = !{i64 2, i64 -1, i64 -1, i1 true}
683 !2 = !{i32 7, !"openmp", i32 50}