mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
b8d800fd9c
The metadata added in D102361 introduces a module flag that we can check to determine if the module was compiled with `-fopenmp` enables. We can now check for the precense of this instead of scanning the call graph for OpenMP runtime functions. Depends on D102361 Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D102423
683 lines
24 KiB
LLVM
683 lines
24 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature
|
|
; RUN: opt -S -openmp-opt-cgscc < %s | FileCheck %s
|
|
; RUN: opt -S -passes=openmp-opt-cgscc < %s | FileCheck %s
|
|
|
|
%struct.ident_t = type { i32, i32, i32, i32, i8* }
|
|
|
|
@.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, i8* getelementptr inbounds ([23 x i8], [23 x i8]* @.str, i32 0, i32 0) }, 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:#.*]]
|
|
; CHECK-NEXT: call void @use(i32 [[TMP0]]) [[ATTR2:#.*]]
|
|
; 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 @no_openmp_use(i32 %0)
|
|
%2 = add nsw i32 %0, 1
|
|
ret i32 %2
|
|
}
|
|
|
|
define void @indirect_call(void ()* %0) {
|
|
; CHECK-LABEL: define {{[^@]+}}@indirect_call
|
|
; CHECK-SAME: (void ()* [[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 (%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*, ...)*))
|
|
; 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 (%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*, ...)*))
|
|
%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.(i32* %0, i32* %1) {
|
|
; CHECK-LABEL: define {{[^@]+}}@.omp_outlined.
|
|
; CHECK-SAME: (i32* [[TMP0:%.*]], i32* [[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(%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...)
|
|
|
|
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 (%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*, ...)*))
|
|
; 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 (%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*, ...)*))
|
|
%6 = tail call i32 @omp_get_max_threads()
|
|
tail call void @use(i32 %6)
|
|
ret i32 0
|
|
}
|
|
|
|
define internal void @.omp_outlined..1(i32* %0, i32* %1) {
|
|
; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..1
|
|
; CHECK-SAME: (i32* [[TMP0:%.*]], i32* [[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 (%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*, ...)*))
|
|
; 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 (%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*, ...)*))
|
|
%6 = tail call i32 @omp_get_max_threads()
|
|
tail call void @use(i32 %6)
|
|
ret i32 0
|
|
}
|
|
|
|
define internal void @.omp_outlined..2(i32* %0, i32* %1) {
|
|
; CHECK-LABEL: define {{[^@]+}}@.omp_outlined..2
|
|
; CHECK-SAME: (i32* [[TMP0:%.*]], i32* [[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)
|
|
; 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 i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
|
|
; CHECK-LABEL: define {{[^@]+}}@test4_invoke
|
|
; CHECK-SAME: (i1 [[TMP0:%.*]]) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
|
; 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 { i8*, i32 }
|
|
; CHECK-NEXT: filter [0 x i8*] 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 { i8*, i32 }
|
|
filter [0 x i8*] 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}
|