blob: c751489a5db58ae5fbf8490099cc06201a3611d6 [file] [log] [blame]
! { dg-do compile }
! { dg-additional-options "-fdump-tree-gimple" }
program main
!$omp requires atomic_default_mem_order(seq_cst)
!$omp declare target to (test3)
contains
subroutine f01 ()
end subroutine
subroutine f02 ()
!$omp declare variant (f01) match (user={condition(6 == 7)},implementation={vendor(gnu)})
end subroutine
subroutine f03 ()
end subroutine
subroutine f04 ()
!$omp declare variant (f03) match (user={condition(6 == 6)},implementation={atomic_default_mem_order(seq_cst)})
end subroutine
subroutine f05 ()
end subroutine
subroutine f06 ()
!$omp declare variant (f05) match (user={condition(1)},implementation={atomic_default_mem_order(relaxed)})
end subroutine
subroutine f07 ()
end subroutine
subroutine f08 ()
!$omp declare variant (f07) match (construct={parallel,do},device={kind("any")})
end subroutine
subroutine f09 ()
end subroutine
subroutine f10 ()
!$omp declare variant (f09) match (construct={parallel,do},implementation={vendor("gnu")})
end subroutine
subroutine f11 ()
end subroutine
subroutine f12 ()
!$omp declare variant (f11) match (construct={parallel,do})
end subroutine
subroutine f13 ()
end subroutine
subroutine f14 ()
!$omp declare variant (f13) match (construct={parallel,do})
end subroutine
subroutine f15 ()
!$omp declare target to (f13, f14)
end subroutine
subroutine f16 ()
!$omp declare variant (f15) match (implementation={vendor(llvm)})
end subroutine
subroutine f17 ()
end subroutine
subroutine f18 ()
!$omp declare variant (f17) match (construct={target,parallel})
end subroutine
subroutine f19 ()
end subroutine
subroutine f20 ()
!$omp declare variant (f19) match (construct={target,parallel})
end subroutine
subroutine f22 ()
!$omp declare variant (f21) match (construct={teams,parallel})
end subroutine
subroutine f23 ()
end subroutine
subroutine f24 ()
!$omp declare variant (f23) match (construct={teams,parallel,do})
end subroutine
subroutine f25 ()
end subroutine
subroutine f27 ()
end subroutine
subroutine f28 ()
!$omp declare variant (f27) match (construct={teams,parallel,do})
end subroutine
subroutine f30 ()
!$omp declare variant (f29) match (implementation={vendor(gnu)})
end subroutine
subroutine f31 ()
end subroutine
subroutine f32 ()
!$omp declare variant (f31) match (construct={teams,parallel,do})
end subroutine
subroutine f33 ()
end subroutine
subroutine f34 ()
!$omp declare variant (f33) match (device={kind("any\0any")}) ! { dg-warning "unknown property '.any..0any.' of 'kind' selector" }
end subroutine
subroutine f35 ()
end subroutine
subroutine f36 ()
!$omp declare variant (f35) match (implementation={vendor("gnu\0")}) ! { dg-warning "unknown property '.gnu..0.' of 'vendor' selector" }
end subroutine
subroutine test1 ()
integer :: i
call f02 () ! { dg-final { scan-tree-dump-times "f02 \\\(\\\);" 1 "gimple" } }
call f04 () ! { dg-final { scan-tree-dump-times "f03 \\\(\\\);" 1 "gimple" } }
call f06 () ! { dg-final { scan-tree-dump-times "f06 \\\(\\\);" 1 "gimple" } }
!$omp parallel
!$omp do
do i = 1, 2
call f08 () ! { dg-final { scan-tree-dump-times "f07 \\\(\\\);" 1 "gimple" } }
end do
!$omp end do
!$omp end parallel
!$omp parallel do
do i = 1, 2
call f10 () ! { dg-final { scan-tree-dump-times "f09 \\\(\\\);" 1 "gimple" } }
end do
!$omp end parallel do
!$omp do
do i = 1, 2
!$omp parallel
call f12 () ! { dg-final { scan-tree-dump-times "f12 \\\(\\\);" 1 "gimple" } }
!$omp end parallel
end do
!$omp end do
!$omp parallel
!$omp target
!$omp do
do i = 1, 2
call f14 () ! { dg-final { scan-tree-dump-times "f14 \\\(\\\);" 1 "gimple" } }
end do
!$omp end do
!$omp end target
!$omp end parallel
call f16 () ! { dg-final { scan-tree-dump-times "f16 \\\(\\\);" 1 "gimple" } }
call f34 () ! { dg-final { scan-tree-dump-times "f34 \\\(\\\);" 1 "gimple" } }
call f36 () ! { dg-final { scan-tree-dump-times "f36 \\\(\\\);" 1 "gimple" } }
end subroutine
subroutine test2 ()
! OpenMP 5.0 specifies that the 'target' trait should be added for
! functions within a declare target block, but Fortran does not have
! the notion of a declare target _block_, so the variant is not used here.
! This may change in later versions of OpenMP.
!$omp declare target
!$omp parallel
call f18 () ! { dg-final { scan-tree-dump-times "f18 \\\(\\\);" 1 "gimple" } }
!$omp end parallel
end subroutine
subroutine test3 ()
! In the C version, this test was used to check that the
! 'declare target to' form of the directive did not result in the variant
! being used.
!$omp parallel
call f20 () ! { dg-final { scan-tree-dump-times "f20 \\\(\\\);" 1 "gimple" } }
!$omp end parallel
end subroutine
subroutine f21 ()
integer :: i
!$omp do
do i = 1, 2
call f24 () ! { dg-final { scan-tree-dump-times "f23 \\\(\\\);" 1 "gimple" } }
end do
!$omp end do
end subroutine
subroutine f26 ()
!$omp declare variant (f25) match (construct={teams,parallel})
integer :: i
!$omp do
do i = 1, 2
call f28 () ! { dg-final { scan-tree-dump-times "f28 \\\(\\\);" 1 "gimple" } }
end do
!$omp end do
end subroutine
subroutine f29 ()
integer :: i
!$omp do
do i = 1, 2
call f32 () ! { dg-final { scan-tree-dump-times "f32 \\\(\\\);" 1 "gimple" } }
end do
!$omp end do
end subroutine
end program