This PR changes the build system to use use the sources for the module `omp_lib` and the `omp_lib.h` include file from the `openmp` runtime project and not from a separate copy of these files. This will greatly reduce potential for inconsistencies when adding features to the OpenMP runtime implementation. When the OpenMP subproject is not configured, this PR also disables the corresponding LIT tests with a "REQUIRES" directive at the beginning of the OpenMP test files. --------- Co-authored-by: Valentin Clement (バレンタイン クレメン) <clementval@gmail.com>
209 lines
5.5 KiB
Fortran
209 lines
5.5 KiB
Fortran
! REQUIRES: openmp_runtime
|
|
|
|
!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
|
|
|
|
!CHECK-LABEL: func @_QPparallel_simple
|
|
subroutine parallel_simple()
|
|
!CHECK: omp.parallel
|
|
!$omp parallel
|
|
!CHECK: fir.call
|
|
call f1()
|
|
!$omp end parallel
|
|
end subroutine parallel_simple
|
|
|
|
!===============================================================================
|
|
! `if` clause
|
|
!===============================================================================
|
|
|
|
!CHECK-LABEL: func @_QPparallel_if
|
|
subroutine parallel_if(alpha, beta, gamma)
|
|
integer, intent(in) :: alpha
|
|
logical, intent(in) :: beta
|
|
logical(1) :: logical1
|
|
logical(2) :: logical2
|
|
logical(4) :: logical4
|
|
logical(8) :: logical8
|
|
|
|
!CHECK: omp.parallel if(%{{.*}} : i1) {
|
|
!$omp parallel if(alpha .le. 0)
|
|
!CHECK: fir.call
|
|
call f1()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel if(%{{.*}} : i1) {
|
|
!$omp parallel if(.false.)
|
|
!CHECK: fir.call
|
|
call f2()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel if(%{{.*}} : i1) {
|
|
!$omp parallel if(alpha .ge. 0)
|
|
!CHECK: fir.call
|
|
call f3()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel if(%{{.*}} : i1) {
|
|
!$omp parallel if(.true.)
|
|
!CHECK: fir.call
|
|
call f4()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel if(%{{.*}} : i1) {
|
|
!$omp parallel if(beta)
|
|
!CHECK: fir.call
|
|
call f1()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel if(%{{.*}} : i1) {
|
|
!$omp parallel if(logical1)
|
|
!CHECK: fir.call
|
|
call f1()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel if(%{{.*}} : i1) {
|
|
!$omp parallel if(logical2)
|
|
!CHECK: fir.call
|
|
call f1()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel if(%{{.*}} : i1) {
|
|
!$omp parallel if(logical4)
|
|
!CHECK: fir.call
|
|
call f1()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel if(%{{.*}} : i1) {
|
|
!$omp parallel if(logical8)
|
|
!CHECK: fir.call
|
|
call f1()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
end subroutine parallel_if
|
|
|
|
!===============================================================================
|
|
! `num_threads` clause
|
|
!===============================================================================
|
|
|
|
!CHECK-LABEL: func @_QPparallel_numthreads
|
|
subroutine parallel_numthreads(num_threads)
|
|
integer, intent(inout) :: num_threads
|
|
|
|
!CHECK: omp.parallel num_threads(%{{.*}}: i32) {
|
|
!$omp parallel num_threads(16)
|
|
!CHECK: fir.call
|
|
call f1()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
num_threads = 4
|
|
|
|
!CHECK: omp.parallel num_threads(%{{.*}} : i32) {
|
|
!$omp parallel num_threads(num_threads)
|
|
!CHECK: fir.call
|
|
call f2()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
end subroutine parallel_numthreads
|
|
|
|
!===============================================================================
|
|
! `proc_bind` clause
|
|
!===============================================================================
|
|
|
|
!CHECK-LABEL: func @_QPparallel_proc_bind
|
|
subroutine parallel_proc_bind()
|
|
|
|
!CHECK: omp.parallel proc_bind(master) {
|
|
!$omp parallel proc_bind(master)
|
|
!CHECK: fir.call
|
|
call f1()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel proc_bind(close) {
|
|
!$omp parallel proc_bind(close)
|
|
!CHECK: fir.call
|
|
call f2()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel proc_bind(spread) {
|
|
!$omp parallel proc_bind(spread)
|
|
!CHECK: fir.call
|
|
call f3()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
end subroutine parallel_proc_bind
|
|
|
|
!===============================================================================
|
|
! `allocate` clause
|
|
!===============================================================================
|
|
|
|
!CHECK-LABEL: func @_QPparallel_allocate
|
|
subroutine parallel_allocate()
|
|
use omp_lib
|
|
integer :: x
|
|
!CHECK: omp.parallel allocate(
|
|
!CHECK: %{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>
|
|
!CHECK: ) {
|
|
!$omp parallel allocate(omp_high_bw_mem_alloc: x) private(x)
|
|
!CHECK: arith.addi
|
|
x = x + 12
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
end subroutine parallel_allocate
|
|
|
|
!===============================================================================
|
|
! multiple clauses
|
|
!===============================================================================
|
|
|
|
!CHECK-LABEL: func @_QPparallel_multiple_clauses
|
|
subroutine parallel_multiple_clauses(alpha, num_threads)
|
|
use omp_lib
|
|
integer, intent(inout) :: alpha
|
|
integer, intent(in) :: num_threads
|
|
|
|
!CHECK: omp.parallel if({{.*}} : i1) proc_bind(master) {
|
|
!$omp parallel if(alpha .le. 0) proc_bind(master)
|
|
!CHECK: fir.call
|
|
call f1()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel num_threads({{.*}} : i32) proc_bind(close) {
|
|
!$omp parallel proc_bind(close) num_threads(num_threads)
|
|
!CHECK: fir.call
|
|
call f2()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel if({{.*}} : i1) num_threads({{.*}} : i32) {
|
|
!$omp parallel num_threads(num_threads) if(alpha .le. 0)
|
|
!CHECK: fir.call
|
|
call f3()
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
!CHECK: omp.parallel if({{.*}} : i1) num_threads({{.*}} : i32) allocate(
|
|
!CHECK: %{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>
|
|
!CHECK: ) {
|
|
!$omp parallel num_threads(num_threads) if(alpha .le. 0) allocate(omp_high_bw_mem_alloc: alpha) private(alpha)
|
|
!CHECK: fir.call
|
|
call f3()
|
|
!CHECK: arith.addi
|
|
alpha = alpha + 12
|
|
!CHECK: omp.terminator
|
|
!$omp end parallel
|
|
|
|
end subroutine parallel_multiple_clauses
|