| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature | |
| ; RUN: opt -S -openmp-deduce-icv-values -passes=openmp-opt < %s | FileCheck %s | |
| %struct.ident_t = type { i32, i32, i32, i32, ptr } | |
| @.str = private unnamed_addr constant [23 x i8] c";unknown;unknown;0;0;;\00", align 1 | |
| @0 = private unnamed_addr global %struct.ident_t { i32 0, i32 2, i32 0, i32 0, ptr @.str }, align 8 | |
| ; doesn't modify any ICVs. | |
| define i32 @icv_free_use(i32 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@icv_free_use | |
| ; CHECK-SAME: (i32 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP0]], 1 | |
| ; CHECK-NEXT: ret i32 [[TMP2]] | |
| ; | |
| %2 = add nsw i32 %0, 1 | |
| ret i32 %2 | |
| } | |
| define i32 @bad_use(i32 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@bad_use | |
| ; CHECK-SAME: (i32 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: tail call void @use(i32 [[TMP0]]) | |
| ; CHECK-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP0]], 1 | |
| ; CHECK-NEXT: ret i32 [[TMP2]] | |
| ; | |
| tail call void @use(i32 %0) | |
| %2 = add nsw i32 %0, 1 | |
| ret i32 %2 | |
| } | |
| define i32 @ok_use_assume(i32 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@ok_use_assume | |
| ; CHECK-SAME: (i32 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: call void @use(i32 [[TMP0]]) #[[ATTR1:[0-9]+]] | |
| ; CHECK-NEXT: call void @use(i32 [[TMP0]]) #[[ATTR2:[0-9]+]] | |
| ; CHECK-NEXT: call void @use(i32 [[TMP0]]) #[[ATTR2:[0-9]+]] | |
| ; CHECK-NEXT: call void @no_openmp_use(i32 [[TMP0]]) | |
| ; CHECK-NEXT: [[TMP2:%.*]] = add nsw i32 [[TMP0]], 1 | |
| ; CHECK-NEXT: ret i32 [[TMP2]] | |
| ; | |
| call void @use(i32 %0) "no_openmp" | |
| call void @use(i32 %0) "no_openmp_routines" | |
| call void @use(i32 %0) "no_openmp_constructs" | |
| call void @no_openmp_use(i32 %0) | |
| %2 = add nsw i32 %0, 1 | |
| ret i32 %2 | |
| } | |
| define void @indirect_call(ptr %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@indirect_call | |
| ; CHECK-SAME: (ptr [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 4) | |
| ; CHECK-NEXT: tail call void [[TMP0]]() | |
| ; CHECK-NEXT: [[TMP2:%.*]] = tail call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: tail call void @use(i32 [[TMP2]]) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| call void @omp_set_num_threads(i32 4) | |
| tail call void %0() | |
| %2 = tail call i32 @omp_get_max_threads() | |
| tail call void @use(i32 %2) | |
| ret void | |
| } | |
| define dso_local i32 @foo(i32 %0, i32 %1) { | |
| ; CHECK-LABEL: define {{[^@]+}}@foo | |
| ; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) { | |
| ; CHECK-NEXT: tail call void @omp_set_num_threads(i32 [[TMP0]]) | |
| ; CHECK-NEXT: tail call void @omp_set_num_threads(i32 [[TMP1]]) | |
| ; CHECK-NEXT: tail call void @use(i32 [[TMP1]]) | |
| ; CHECK-NEXT: tail call void @use(i32 [[TMP1]]) | |
| ; CHECK-NEXT: tail call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @[[GLOB0:[0-9]+]], i32 0, ptr @.omp_outlined.) | |
| ; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: tail call void @use(i32 [[TMP3]]) | |
| ; CHECK-NEXT: ret i32 0 | |
| ; | |
| tail call void @omp_set_num_threads(i32 %0) | |
| %3 = tail call i32 @omp_get_max_threads() | |
| ; FIXME: this value should be tracked and the rest of the getters deduplicated and replaced with it. | |
| tail call void @omp_set_num_threads(i32 %1) | |
| %4 = tail call i32 @omp_get_max_threads() | |
| %5 = tail call i32 @omp_get_max_threads() | |
| %6 = tail call i32 @omp_get_max_threads() | |
| tail call void @use(i32 %4) | |
| tail call void @use(i32 %5) | |
| tail call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @0, i32 0, ptr @.omp_outlined.) | |
| %7 = tail call i32 @omp_get_max_threads() | |
| tail call void @use(i32 %7) | |
| ret i32 0 | |
| } | |
| declare dso_local void @omp_set_num_threads(i32) | |
| declare dso_local i32 @omp_get_max_threads() | |
| declare dso_local void @use(i32) | |
| declare dso_local void @no_openmp_use(i32) "no_openmp" | |
| define internal void @.omp_outlined.(ptr %0, ptr %1) { | |
| ; CHECK-LABEL: define {{[^@]+}}@.omp_outlined. | |
| ; CHECK-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) { | |
| ; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: [[TMP4:%.*]] = tail call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: tail call void @use(i32 [[TMP4]]) | |
| ; CHECK-NEXT: tail call void @omp_set_num_threads(i32 10) | |
| ; CHECK-NEXT: tail call void @use(i32 10) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| ; FIXME: this value should be tracked and the rest of the getters deduplicated and replaced with it. | |
| %3 = tail call i32 @omp_get_max_threads() | |
| %4 = tail call i32 @omp_get_max_threads() | |
| tail call void @use(i32 %4) | |
| tail call void @omp_set_num_threads(i32 10) | |
| %5 = tail call i32 @omp_get_max_threads() | |
| tail call void @use(i32 %5) | |
| ret void | |
| } | |
| declare !callback !0 void @__kmpc_fork_call(ptr, i32, ptr, ...) | |
| define dso_local i32 @bar(i32 %0, i32 %1) { | |
| ; CHECK-LABEL: define {{[^@]+}}@bar | |
| ; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) { | |
| ; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP0]], [[TMP1]] | |
| ; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP0]], i32 [[TMP1]] | |
| ; CHECK-NEXT: tail call void @omp_set_num_threads(i32 [[TMP4]]) | |
| ; CHECK-NEXT: tail call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @[[GLOB0]], i32 0, ptr @.omp_outlined..1) | |
| ; CHECK-NEXT: [[TMP5:%.*]] = tail call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: tail call void @use(i32 [[TMP5]]) | |
| ; CHECK-NEXT: ret i32 0 | |
| ; | |
| %3 = icmp sgt i32 %0, %1 | |
| %4 = select i1 %3, i32 %0, i32 %1 | |
| ; FIXME: getters can be replaced with %4 | |
| tail call void @omp_set_num_threads(i32 %4) | |
| %5 = tail call i32 @omp_get_max_threads() | |
| tail call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @0, i32 0, ptr @.omp_outlined..1) | |
| %6 = tail call i32 @omp_get_max_threads() | |
| tail call void @use(i32 %6) | |
| ret i32 0 | |
| } | |
| define internal void @.omp_outlined..1(ptr %0, ptr %1) { | |
| ; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1 | |
| ; CHECK-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) { | |
| ; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: tail call void @use(i32 [[TMP3]]) | |
| ; CHECK-NEXT: tail call void @omp_set_num_threads(i32 10) | |
| ; CHECK-NEXT: tail call void @use(i32 10) | |
| ; CHECK-NEXT: [[TMP4:%.*]] = tail call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: tail call void @use(i32 [[TMP4]]) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| %3 = tail call i32 @omp_get_max_threads() | |
| tail call void @use(i32 %3) | |
| tail call void @omp_set_num_threads(i32 10) | |
| %4 = tail call i32 @omp_get_max_threads() | |
| tail call void @use(i32 %4) | |
| %5 = tail call i32 @omp_get_max_threads() | |
| tail call void @use(i32 %5) | |
| ret void | |
| } | |
| define dso_local i32 @bar1(i32 %0, i32 %1) { | |
| ; CHECK-LABEL: define {{[^@]+}}@bar1 | |
| ; CHECK-SAME: (i32 [[TMP0:%.*]], i32 [[TMP1:%.*]]) { | |
| ; CHECK-NEXT: [[TMP3:%.*]] = icmp sgt i32 [[TMP0]], [[TMP1]] | |
| ; CHECK-NEXT: [[TMP4:%.*]] = select i1 [[TMP3]], i32 [[TMP0]], i32 [[TMP1]] | |
| ; CHECK-NEXT: tail call void @omp_set_num_threads(i32 [[TMP4]]) | |
| ; CHECK-NEXT: tail call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @[[GLOB0]], i32 0, ptr @.omp_outlined..2) | |
| ; CHECK-NEXT: [[TMP5:%.*]] = tail call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: tail call void @use(i32 [[TMP5]]) | |
| ; CHECK-NEXT: ret i32 0 | |
| ; | |
| %3 = icmp sgt i32 %0, %1 | |
| %4 = select i1 %3, i32 %0, i32 %1 | |
| tail call void @omp_set_num_threads(i32 %4) | |
| %5 = tail call i32 @omp_get_max_threads() | |
| tail call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr nonnull @0, i32 0, ptr @.omp_outlined..2) | |
| %6 = tail call i32 @omp_get_max_threads() | |
| tail call void @use(i32 %6) | |
| ret i32 0 | |
| } | |
| define internal void @.omp_outlined..2(ptr %0, ptr %1) { | |
| ; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2 | |
| ; CHECK-SAME: (ptr [[TMP0:%.*]], ptr [[TMP1:%.*]]) { | |
| ; CHECK-NEXT: [[TMP3:%.*]] = tail call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: [[TMP4:%.*]] = tail call i32 @icv_free_use(i32 [[TMP3]]) | |
| ; CHECK-NEXT: tail call void @omp_set_num_threads(i32 10) | |
| ; CHECK-NEXT: [[TMP5:%.*]] = tail call i32 @icv_free_use(i32 10) | |
| ; CHECK-NEXT: [[TMP6:%.*]] = tail call i32 @icv_free_use(i32 10) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| %3 = tail call i32 @omp_get_max_threads() | |
| %4 = tail call i32 @icv_free_use(i32 %3) | |
| tail call void @omp_set_num_threads(i32 10) | |
| %5 = tail call i32 @omp_get_max_threads() | |
| %6 = tail call i32 @icv_free_use(i32 %5) | |
| %7 = tail call i32 @omp_get_max_threads() | |
| %8 = tail call i32 @icv_free_use(i32 %7) | |
| ret void | |
| } | |
| define void @test(i1 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@test | |
| ; CHECK-SAME: (i1 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 2) | |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false | |
| ; CHECK-NEXT: br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]] | |
| ; CHECK: 3: | |
| ; CHECK-NEXT: call void @use(i32 10) | |
| ; CHECK-NEXT: br label [[TMP4]] | |
| ; CHECK: 4: | |
| ; CHECK-NEXT: [[TMP5:%.*]] = call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: call void @use(i32 [[TMP5]]) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| call void @omp_set_num_threads(i32 2) | |
| %2 = icmp eq i1 %0, 0 | |
| br i1 %2, label %4, label %3 | |
| 3: ; preds = %1 | |
| call void @use(i32 10) | |
| br label %4 | |
| 4: ; preds = %3, %1 | |
| %5 = call i32 @omp_get_max_threads() | |
| call void @use(i32 %5) | |
| ret void | |
| } | |
| define void @test1(i1 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@test1 | |
| ; CHECK-SAME: (i1 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 2) | |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false | |
| ; CHECK-NEXT: br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]] | |
| ; CHECK: 3: | |
| ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @icv_free_use(i32 10) | |
| ; CHECK-NEXT: br label [[TMP5]] | |
| ; CHECK: 5: | |
| ; CHECK-NEXT: call void @use(i32 2) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| call void @omp_set_num_threads(i32 2) | |
| %2 = icmp eq i1 %0, 0 | |
| br i1 %2, label %5, label %3 | |
| 3: ; preds = %1 | |
| %4 = call i32 @icv_free_use(i32 10) | |
| br label %5 | |
| 5: ; preds = %3, %1 | |
| %6 = call i32 @omp_get_max_threads() | |
| call void @use(i32 %6) | |
| ret void | |
| } | |
| define void @bad_use_test(i1 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@bad_use_test | |
| ; CHECK-SAME: (i1 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 2) | |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false | |
| ; CHECK-NEXT: br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]] | |
| ; CHECK: 3: | |
| ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @bad_use(i32 10) | |
| ; CHECK-NEXT: br label [[TMP5]] | |
| ; CHECK: 5: | |
| ; CHECK-NEXT: [[TMP6:%.*]] = call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: call void @use(i32 [[TMP6]]) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| call void @omp_set_num_threads(i32 2) | |
| %2 = icmp eq i1 %0, 0 | |
| br i1 %2, label %5, label %3 | |
| 3: ; preds = %1 | |
| %4 = call i32 @bad_use(i32 10) | |
| br label %5 | |
| 5: ; preds = %3, %1 | |
| %6 = call i32 @omp_get_max_threads() | |
| call void @use(i32 %6) | |
| ret void | |
| } | |
| define void @ok_use_assume_test(i1 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@ok_use_assume_test | |
| ; CHECK-SAME: (i1 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 2) | |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false | |
| ; CHECK-NEXT: br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]] | |
| ; CHECK: 3: | |
| ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @ok_use_assume(i32 10) | |
| ; CHECK-NEXT: br label [[TMP5]] | |
| ; CHECK: 5: | |
| ; CHECK-NEXT: call void @use(i32 2) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| call void @omp_set_num_threads(i32 2) | |
| %2 = icmp eq i1 %0, 0 | |
| br i1 %2, label %5, label %3 | |
| 3: ; preds = %1 | |
| %4 = call i32 @ok_use_assume(i32 10) | |
| br label %5 | |
| 5: ; preds = %3, %1 | |
| %6 = call i32 @omp_get_max_threads() | |
| call void @use(i32 %6) | |
| ret void | |
| } | |
| define weak void @weak_known_unique_icv(i1 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@weak_known_unique_icv | |
| ; CHECK-SAME: (i1 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 2) | |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false | |
| ; CHECK-NEXT: br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]] | |
| ; CHECK: 3: | |
| ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @icv_free_use(i32 10) | |
| ; CHECK-NEXT: br label [[TMP5]] | |
| ; CHECK: 5: | |
| ; CHECK-NEXT: [[TMP6:%.*]] = call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: [[TMP7:%.*]] = call i32 @icv_free_use(i32 [[TMP6]]) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| call void @omp_set_num_threads(i32 2) | |
| %2 = icmp eq i1 %0, 0 | |
| br i1 %2, label %5, label %3 | |
| 3: ; preds = %1 | |
| %4 = call i32 @icv_free_use(i32 10) | |
| br label %5 | |
| 5: ; preds = %3, %1 | |
| %6 = call i32 @omp_get_max_threads() | |
| %7 = call i32 @icv_free_use(i32 %6) | |
| ret void | |
| } | |
| define void @known_unique_icv(i1 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@known_unique_icv | |
| ; CHECK-SAME: (i1 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 2) | |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false | |
| ; CHECK-NEXT: br i1 [[TMP2]], label [[TMP5:%.*]], label [[TMP3:%.*]] | |
| ; CHECK: 3: | |
| ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @icv_free_use(i32 10) | |
| ; CHECK-NEXT: br label [[TMP5]] | |
| ; CHECK: 5: | |
| ; CHECK-NEXT: [[TMP6:%.*]] = call i32 @icv_free_use(i32 2) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| call void @omp_set_num_threads(i32 2) | |
| %2 = icmp eq i1 %0, 0 | |
| br i1 %2, label %5, label %3 | |
| 3: ; preds = %1 | |
| %4 = call i32 @icv_free_use(i32 10) | |
| br label %5 | |
| 5: ; preds = %3, %1 | |
| %6 = call i32 @omp_get_max_threads() | |
| %7 = call i32 @icv_free_use(i32 %6) | |
| ret void | |
| } | |
| define i32 @no_unique_icv(i1 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@no_unique_icv | |
| ; CHECK-SAME: (i1 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 4) | |
| ; CHECK-NEXT: br i1 [[TMP0]], label [[TMP3:%.*]], label [[TMP2:%.*]] | |
| ; CHECK: 2: | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 2) | |
| ; CHECK-NEXT: br label [[TMP3]] | |
| ; CHECK: 3: | |
| ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: ret i32 [[TMP4]] | |
| ; | |
| call void @omp_set_num_threads(i32 4) | |
| br i1 %0, label %3, label %2 | |
| 2: ; preds = %1 | |
| call void @omp_set_num_threads(i32 2) | |
| br label %3 | |
| 3: ; preds = %1, %2 | |
| %4 = call i32 @omp_get_max_threads() | |
| ret i32 %4 | |
| } | |
| define void @test2(i1 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@test2 | |
| ; CHECK-SAME: (i1 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false | |
| ; CHECK-NEXT: br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]] | |
| ; CHECK: 3: | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 4) | |
| ; CHECK-NEXT: br label [[TMP4]] | |
| ; CHECK: 4: | |
| ; CHECK-NEXT: [[TMP5:%.*]] = call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: call void @use(i32 [[TMP5]]) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| %2 = icmp eq i1 %0, 0 | |
| br i1 %2, label %4, label %3 | |
| 3: ; preds = %1 | |
| call void @omp_set_num_threads(i32 4) | |
| br label %4 | |
| 4: ; preds = %3, %1 | |
| %5 = call i32 @omp_get_max_threads() | |
| call void @use(i32 %5) | |
| ret void | |
| } | |
| define void @test3(i1 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@test3 | |
| ; CHECK-SAME: (i1 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false | |
| ; CHECK-NEXT: br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]] | |
| ; CHECK: 3: | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 4) | |
| ; CHECK-NEXT: br label [[TMP4]] | |
| ; CHECK: 4: | |
| ; CHECK-NEXT: call void @weak_known_unique_icv(i1 [[TMP0]]) | |
| ; CHECK-NEXT: [[TMP5:%.*]] = call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: [[TMP6:%.*]] = call i32 @icv_free_use(i32 [[TMP5]]) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| %2 = icmp eq i1 %0, 0 | |
| br i1 %2, label %4, label %3 | |
| 3: ; preds = %1 | |
| call void @omp_set_num_threads(i32 4) | |
| br label %4 | |
| 4: ; preds = %3, %1 | |
| call void @weak_known_unique_icv(i1 %0) | |
| %5 = call i32 @omp_get_max_threads() | |
| %6 = call i32 @icv_free_use(i32 %5) | |
| ret void | |
| } | |
| declare void @__cxa_rethrow() | |
| define i32 @maybe_throw(i1 zeroext %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@maybe_throw | |
| ; CHECK-SAME: (i1 zeroext [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 4) #[[ATTR0:[0-9]+]] | |
| ; CHECK-NEXT: br i1 [[TMP0]], label [[TMP2:%.*]], label [[TMP3:%.*]] | |
| ; CHECK: 2: | |
| ; CHECK-NEXT: tail call void @__cxa_rethrow() | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: 3: | |
| ; CHECK-NEXT: ret i32 -1 | |
| ; | |
| call void @omp_set_num_threads(i32 4) | |
| br i1 %0, label %2, label %3 | |
| 2: ; preds = %1 | |
| tail call void @__cxa_rethrow() #1 | |
| unreachable | |
| 3: ; preds = %1 | |
| ret i32 -1 | |
| } | |
| define void @test4(i1 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@test4 | |
| ; CHECK-SAME: (i1 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: call void @known_unique_icv(i1 [[TMP0]]) | |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i1 [[TMP0]], false | |
| ; CHECK-NEXT: br i1 [[TMP2]], label [[TMP4:%.*]], label [[TMP3:%.*]] | |
| ; CHECK: 3: | |
| ; CHECK-NEXT: [[VAL:%.*]] = call i32 @icv_free_use(i32 10) | |
| ; CHECK-NEXT: br label [[TMP4]] | |
| ; CHECK: 4: | |
| ; CHECK-NEXT: call void @use(i32 2) | |
| ; CHECK-NEXT: [[TMP5:%.*]] = call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: [[TMP6:%.*]] = call i32 @no_unique_icv(i1 [[TMP0]]) | |
| ; CHECK-NEXT: call void @use(i32 [[TMP5]]) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| call void @known_unique_icv(i1 %0) | |
| %2 = icmp eq i1 %0, 0 | |
| br i1 %2, label %4, label %3 | |
| 3: ; preds = %1 | |
| %val = call i32 @icv_free_use(i32 10) | |
| br label %4 | |
| 4: ; preds = %3, %1 | |
| %5 = call i32 @omp_get_max_threads() | |
| call void @use(i32 %5) | |
| %6 = call i32 @omp_get_max_threads() | |
| call i32 @no_unique_icv(i1 %0) | |
| call void @use(i32 %6) | |
| ret void | |
| } | |
| define void @test4_invoke(i1 %0) personality ptr @__gxx_personality_v0 { | |
| ; CHECK-LABEL: define {{[^@]+}}@test4_invoke | |
| ; CHECK-SAME: (i1 [[TMP0:%.*]]) personality ptr @__gxx_personality_v0 { | |
| ; CHECK-NEXT: call void @known_unique_icv(i1 [[TMP0]]) | |
| ; CHECK-NEXT: [[TMP2:%.*]] = invoke i32 @maybe_throw(i1 zeroext [[TMP0]]) | |
| ; CHECK-NEXT: to label [[CONT:%.*]] unwind label [[EXC:%.*]] | |
| ; CHECK: cont: | |
| ; CHECK-NEXT: [[TMP3:%.*]] = icmp eq i1 [[TMP0]], false | |
| ; CHECK-NEXT: br i1 [[TMP3]], label [[TMP5:%.*]], label [[TMP4:%.*]] | |
| ; CHECK: exc: | |
| ; CHECK-NEXT: [[LP:%.*]] = landingpad { ptr, i32 } | |
| ; CHECK-NEXT: filter [0 x ptr] zeroinitializer | |
| ; CHECK-NEXT: unreachable | |
| ; CHECK: 4: | |
| ; CHECK-NEXT: [[VAL:%.*]] = call i32 @icv_free_use(i32 10) | |
| ; CHECK-NEXT: br label [[TMP5]] | |
| ; CHECK: 5: | |
| ; CHECK-NEXT: call void @use(i32 2) | |
| ; CHECK-NEXT: ret void | |
| ; | |
| call void @known_unique_icv(i1 %0) | |
| invoke i32 @maybe_throw(i1 zeroext %0) | |
| to label %cont unwind label %exc | |
| cont: | |
| %3 = icmp eq i1 %0, 0 | |
| br i1 %3, label %5, label %4 | |
| exc: | |
| %lp = landingpad { ptr, i32 } | |
| filter [0 x ptr] zeroinitializer | |
| unreachable | |
| 4: ; preds = %1 | |
| %val = call i32 @icv_free_use(i32 10) | |
| br label %5 | |
| 5: ; preds = %3, %1 | |
| %6 = call i32 @omp_get_max_threads() | |
| call void @use(i32 %6) | |
| ret void | |
| } | |
| define i32 @test5(i32 %0) #0 { | |
| ; CHECK-LABEL: define {{[^@]+}}@test5 | |
| ; CHECK-SAME: (i32 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 4) | |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP0]], 3 | |
| ; CHECK-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]] | |
| ; CHECK: 3: | |
| ; CHECK-NEXT: call void @use(i32 4) | |
| ; CHECK-NEXT: br label [[TMP12:%.*]] | |
| ; CHECK: 4: | |
| ; CHECK-NEXT: [[TMP5:%.*]] = icmp sgt i32 [[TMP0]], 0 | |
| ; CHECK-NEXT: br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP8:%.*]] | |
| ; CHECK: 6: | |
| ; CHECK-NEXT: [[TMP7:%.*]] = call i32 @icv_free_use(i32 [[TMP0]]) | |
| ; CHECK-NEXT: br label [[TMP15:%.*]] | |
| ; CHECK: 8: | |
| ; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP0]], 0 | |
| ; CHECK-NEXT: br i1 [[TMP9]], label [[TMP10:%.*]], label [[TMP12]] | |
| ; CHECK: 10: | |
| ; CHECK-NEXT: [[TMP11:%.*]] = call i32 @icv_free_use(i32 10) | |
| ; CHECK-NEXT: br label [[TMP15]] | |
| ; CHECK: 12: | |
| ; CHECK-NEXT: [[TMP13:%.*]] = add nsw i32 [[TMP0]], 1 | |
| ; CHECK-NEXT: [[TMP14:%.*]] = call i32 @icv_free_use(i32 [[TMP13]]) | |
| ; CHECK-NEXT: br label [[TMP15]] | |
| ; CHECK: 15: | |
| ; CHECK-NEXT: [[TMP16:%.*]] = call i32 @omp_get_max_threads() | |
| ; CHECK-NEXT: [[TMP17:%.*]] = call i32 @icv_free_use(i32 [[TMP16]]) | |
| ; CHECK-NEXT: ret i32 [[TMP17]] | |
| ; | |
| call void @omp_set_num_threads(i32 4) | |
| %2 = icmp sgt i32 %0, 3 | |
| br i1 %2, label %3, label %5 | |
| 3: | |
| %4 = call i32 @omp_get_max_threads() | |
| call void @use(i32 %4) | |
| br label %13 | |
| 5: | |
| %6 = icmp sgt i32 %0, 0 | |
| br i1 %6, label %7, label %9 | |
| 7: | |
| %8 = call i32 @icv_free_use(i32 %0) | |
| br label %16 | |
| 9: | |
| %10 = icmp eq i32 %0, 0 | |
| br i1 %10, label %11, label %13 | |
| 11: | |
| %12 = call i32 @icv_free_use(i32 10) | |
| br label %16 | |
| 13: | |
| %14 = add nsw i32 %0, 1 | |
| %15 = call i32 @icv_free_use(i32 %14) | |
| br label %16 | |
| 16: | |
| %17 = call i32 @omp_get_max_threads() | |
| %18 = call i32 @icv_free_use(i32 %17) | |
| ret i32 %18 | |
| } | |
| define i32 @test6(i32 %0) { | |
| ; CHECK-LABEL: define {{[^@]+}}@test6 | |
| ; CHECK-SAME: (i32 [[TMP0:%.*]]) { | |
| ; CHECK-NEXT: call void @omp_set_num_threads(i32 4) | |
| ; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[TMP0]], 3 | |
| ; CHECK-NEXT: br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP5:%.*]] | |
| ; CHECK: 3: | |
| ; CHECK-NEXT: [[TMP4:%.*]] = call i32 @icv_free_use(i32 10) | |
| ; CHECK-NEXT: br label [[TMP16:%.*]] | |
| ; CHECK: 5: | |
| ; CHECK-NEXT: [[TMP6:%.*]] = icmp sgt i32 [[TMP0]], 0 | |
| ; CHECK-NEXT: br i1 [[TMP6]], label [[TMP7:%.*]], label [[TMP9:%.*]] | |
| ; CHECK: 7: | |
| ; CHECK-NEXT: [[TMP8:%.*]] = call i32 @icv_free_use(i32 [[TMP0]]) | |
| ; CHECK-NEXT: br label [[TMP16]] | |
| ; CHECK: 9: | |
| ; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i32 [[TMP0]], 0 | |
| ; CHECK-NEXT: br i1 [[TMP10]], label [[TMP11:%.*]], label [[TMP13:%.*]] | |
| ; CHECK: 11: | |
| ; CHECK-NEXT: [[TMP12:%.*]] = call i32 @icv_free_use(i32 5) | |
| ; CHECK-NEXT: br label [[TMP16]] | |
| ; CHECK: 13: | |
| ; CHECK-NEXT: [[TMP14:%.*]] = add nsw i32 [[TMP0]], 1 | |
| ; CHECK-NEXT: [[TMP15:%.*]] = call i32 @icv_free_use(i32 [[TMP14]]) | |
| ; CHECK-NEXT: br label [[TMP16]] | |
| ; CHECK: 16: | |
| ; CHECK-NEXT: [[TMP17:%.*]] = call i32 @icv_free_use(i32 4) | |
| ; CHECK-NEXT: ret i32 [[TMP17]] | |
| ; | |
| call void @omp_set_num_threads(i32 4) | |
| %2 = icmp sgt i32 %0, 3 | |
| br i1 %2, label %3, label %5 | |
| 3: ; preds = %1 | |
| %4 = call i32 @icv_free_use(i32 10) | |
| br label %16 | |
| 5: ; preds = %1 | |
| %6 = icmp sgt i32 %0, 0 | |
| br i1 %6, label %7, label %9 | |
| 7: ; preds = %5 | |
| %8 = call i32 @icv_free_use(i32 %0) | |
| br label %16 | |
| 9: ; preds = %5 | |
| %10 = icmp eq i32 %0, 0 | |
| br i1 %10, label %11, label %13 | |
| 11: ; preds = %9 | |
| %12 = call i32 @icv_free_use(i32 5) | |
| br label %16 | |
| 13: ; preds = %9 | |
| %14 = add nsw i32 %0, 1 | |
| %15 = call i32 @icv_free_use(i32 %14) | |
| br label %16 | |
| 16: ; preds = %7, %13, %11, %3 | |
| %17 = call i32 @omp_get_max_threads() | |
| %18 = call i32 @icv_free_use(i32 %17) | |
| ret i32 %18 | |
| } | |
| declare i32 @__gxx_personality_v0(...) | |
| !llvm.module.flags = !{!2} | |
| !0 = !{!1} | |
| !1 = !{i64 2, i64 -1, i64 -1, i1 true} | |
| !2 = !{i32 7, !"openmp", i32 50} |