mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 07:06:42 +00:00

shortloop is a non standard OpenACC extension (https://docs.nvidia.com/hpc-sdk/pgi-compilers/2015/pgirn157.pdf) that can be found on loop directives. f18 parser was choking when seeing it. Since it can be found in existing apps and is mainly an optimization hint, parse it on loop directives and ignore it with a warning. For the records, here is shortloop meaning according to the manual linked above: "If the shortloop clause appears on a loop directive with the vector clause, it tells the compiler that the loop trip count is less than or equal to the number of vector lanes created for that loop. This means the value of the vector() clause on the loop directive in a kernels region, or the value of the vector_length() clause on the parallel directive in a parallel region will be greater than or equal to the loop trip count. This allows the compiler to generate more efficient code for the loop"
83 lines
1.7 KiB
Fortran
83 lines
1.7 KiB
Fortran
! RUN: %python %S/../test_errors.py %s %flang -fopenacc
|
|
|
|
! Check OpenACC clause validity for the following construct and directive:
|
|
! 2.15.1 routine
|
|
|
|
module openacc_routine_validity
|
|
implicit none
|
|
|
|
!$acc routine(sub3) seq
|
|
|
|
!$acc routine(fct2) vector
|
|
|
|
!$acc routine(sub3)
|
|
|
|
!ERROR: ROUTINE directive without name must appear within the specification part of a subroutine or function definition, or within an interface body for a subroutine or function in an interface block
|
|
!$acc routine seq
|
|
|
|
!$acc routine(dummy) seq
|
|
|
|
contains
|
|
|
|
subroutine sub1(a)
|
|
real :: a(:)
|
|
!$acc routine
|
|
end subroutine sub1
|
|
|
|
subroutine sub2(a)
|
|
real :: a(:)
|
|
!ERROR: Clause NOHOST is not allowed after clause DEVICE_TYPE on the ROUTINE directive
|
|
!$acc routine seq device_type(*) nohost
|
|
end subroutine sub2
|
|
|
|
subroutine sub3(a)
|
|
real :: a(:)
|
|
end subroutine sub3
|
|
|
|
subroutine sub4(a)
|
|
real :: a(:)
|
|
!$acc routine seq
|
|
end subroutine sub4
|
|
|
|
subroutine sub5(a)
|
|
real :: a(:)
|
|
!$acc routine(sub5) seq
|
|
end subroutine sub5
|
|
|
|
function fct1(a)
|
|
integer :: fct1
|
|
real :: a(:)
|
|
!$acc routine vector nohost
|
|
end function fct1
|
|
|
|
function fct2(a)
|
|
integer :: fct2
|
|
real :: a(:)
|
|
end function fct2
|
|
|
|
function fct3(a)
|
|
integer :: fct3
|
|
real :: a(:)
|
|
!$acc routine seq bind(fct2)
|
|
end function fct3
|
|
|
|
function fct4(a)
|
|
integer :: fct4
|
|
real :: a(:)
|
|
!$acc routine seq bind("_fct4")
|
|
end function fct4
|
|
|
|
subroutine sub6(a)
|
|
real :: a(:)
|
|
!$acc routine seq bind(dummy_sub)
|
|
end subroutine sub6
|
|
|
|
subroutine sub7(a)
|
|
real :: a(:)
|
|
!ERROR: SHORTLOOP clause is not allowed on the KERNELS directive
|
|
!$acc kernels shortloop
|
|
!$acc end kernels
|
|
end subroutine sub7
|
|
|
|
end module openacc_routine_validity
|