Summary: Currently in OpenMPOpt we strip `noinline` attributes from runtime functions. This is here because the device bitcode library that we link has problems with needed definitions getting prematurely optimized out. This is only necessary for OpenMP offloading to GPUs so we should narrow the scope for where we spend time doing this. In the future this shouldn't be necessary as we move to using a linked library rather than pulling in a bitcode library in Clang.
100 lines
2.5 KiB
LLVM
100 lines
2.5 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-attributes
|
|
; RUN: opt < %s -S -openmp-opt-cgscc | FileCheck %s
|
|
; RUN: opt < %s -S -passes=openmp-opt-cgscc | FileCheck %s
|
|
|
|
declare void @unknown()
|
|
|
|
; __kmpc functions
|
|
define void @__kmpc_noinline() noinline nounwind {
|
|
; CHECK: Function Attrs: nounwind
|
|
; CHECK-LABEL: @__kmpc_noinline(
|
|
; CHECK-NEXT: call void @unknown()
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
call void @unknown()
|
|
ret void
|
|
}
|
|
; omp_X functions
|
|
define void @omp_noinline() noinline nounwind {
|
|
; CHECK: Function Attrs: nounwind
|
|
; CHECK-LABEL: @omp_noinline(
|
|
; CHECK-NEXT: call void @unknown()
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
call void @unknown()
|
|
ret void
|
|
}
|
|
; _OMP namespace
|
|
define void @_ZN4_OMP_noinline() noinline nounwind {
|
|
; CHECK: Function Attrs: nounwind
|
|
; CHECK-LABEL: @_ZN4_OMP_noinline(
|
|
; CHECK-NEXT: call void @unknown()
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
call void @unknown()
|
|
ret void
|
|
}
|
|
|
|
; Negative tests:
|
|
|
|
define void @__kmpc_noinline_optnone() noinline optnone nounwind {
|
|
; CHECK: Function Attrs: noinline nounwind optnone
|
|
; CHECK-LABEL: @__kmpc_noinline_optnone(
|
|
; CHECK-NEXT: call void @unknown()
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
call void @unknown()
|
|
ret void
|
|
}
|
|
define void @omp_noinline_optnone() noinline optnone nounwind {
|
|
; CHECK: Function Attrs: noinline nounwind optnone
|
|
; CHECK-LABEL: @omp_noinline_optnone(
|
|
; CHECK-NEXT: call void @unknown()
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
call void @unknown()
|
|
ret void
|
|
}
|
|
; _OMP namespace
|
|
define void @_ZN4_OMP_noinline_optnone() noinline optnone nounwind {
|
|
; CHECK: Function Attrs: noinline nounwind optnone
|
|
; CHECK-LABEL: @_ZN4_OMP_noinline_optnone(
|
|
; CHECK-NEXT: call void @unknown()
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
call void @unknown()
|
|
ret void
|
|
}
|
|
define void @a___kmpc_noinline() noinline nounwind {
|
|
; CHECK: Function Attrs: noinline nounwind
|
|
; CHECK-LABEL: @a___kmpc_noinline(
|
|
; CHECK-NEXT: call void @unknown()
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
call void @unknown()
|
|
ret void
|
|
}
|
|
define void @a_omp_noinline() noinline nounwind {
|
|
; CHECK: Function Attrs: noinline nounwind
|
|
; CHECK-LABEL: @a_omp_noinline(
|
|
; CHECK-NEXT: call void @unknown()
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
call void @unknown()
|
|
ret void
|
|
}
|
|
define void @a__ZN4_OMP_noinline() noinline nounwind {
|
|
; CHECK: Function Attrs: noinline nounwind
|
|
; CHECK-LABEL: @a__ZN4_OMP_noinline(
|
|
; CHECK-NEXT: call void @unknown()
|
|
; CHECK-NEXT: ret void
|
|
;
|
|
call void @unknown()
|
|
ret void
|
|
}
|
|
|
|
!llvm.module.flags = !{!0, !1}
|
|
|
|
!0 = !{i32 7, !"openmp", i32 50}
|
|
!1 = !{i32 7, !"openmp-device", i32 50}
|