[flang] [OpenMP 4.5] Adding lit test cases for OpenMP Constructs.

1. Section 2.5   : Parallel Construct
 2. Section 2.7.1 : Loop Construct
 3. Section 2.7.2 : Sections Construct
 4. Section 2.7.3 : Single Construct
 5. Section 2.7.4 : Workshare Construct
 6. Section 2.8.1 : Simd Construct
 7. Section 2.8.3 : Loop Simd Construct
 8. Section 2.9.1 : Task Construct
 9. Section 2.9.2 : Taskloop Construct
10. Section 2.9.3 : Taskloop Simd Construct

Most of the test cases added as part of this change contains semantic errors except few cases which are semantically correct but thrown a semantic error.

Currently flang is not throwing the errors for these cases and throwing semantic errors for the following correct test cases

{omp-do03.f90 , omp-loop-simd01.f90 , omp-simd02.f90 , omp-taskloop01.f90}

Hence, all the test cases are marked as XFAIL.

Reviewed By: DavidTruby

Differential Revision: https://reviews.llvm.org/D87908
This commit is contained in:
Praveen G 2020-09-24 13:08:11 +01:00 committed by David Truby
parent 10c94d8cf8
commit 956a84da06
26 changed files with 590 additions and 0 deletions

View file

@ -0,0 +1,18 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.7.1 Loop Construct
! collapse(n) where n > num of loops
program omp_do
integer i, j, k
!ERROR: Not enough do loops for collapsed !$OMP DO
!$omp do collapse(2)
do i = 1, 10
print *, "hello"
end do
!$omp end do
end program omp_do

View file

@ -0,0 +1,21 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.7.1 Loop Construct
! Exit statement terminating !$OMP DO loop
program omp_do
integer i, j, k
!$omp do
do i = 1, 10
do j = 1, 10
print *, "Hello"
end do
!ERROR: EXIT statement terminating !$OMP DO loop
exit
end do
!$omp end do
end program omp_do

View file

@ -0,0 +1,26 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.7.1 Loop Construct
! Semantic error for correct test case
program omp_do
integer i, j, k
integer :: a(10), b(10)
a = 10
j = 0
!$omp parallel
!$omp do linear(j:1)
do i = 1, 10
j = j + 1
b(i) = a(i) * 2.0
end do
!$omp end do
!$omp end parallel
print *, j
print *, b
end program omp_do

View file

@ -0,0 +1,20 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.7.1 Loop Construct
! The loop iteration variable may not appear in a threadprivate directive.
program omp_do
integer i, j, k
!$omp do firstprivate(i)
!ERROR: !$OMP DO iteration variable i is not allowed in threadprivate
do i = 1, 10
do j = 1, 10
print *, "Hello"
end do
end do
!$omp end do
end program omp_do

View file

@ -0,0 +1,26 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.7.1 Loop Construct
! chunk_size must be a loop invariant integer expression
! with a positive value.
program omp_do
integer i, j, k
integer :: a(10), b(10)
a = 10
j = 0
!ERROR: INTEGER expression of SCHEDULE clause chunk_size must be positive
!$omp do schedule(static, -1)
do i = 1, 10
j = j + 1
b(i) = a(i) * 2.0
end do
!$omp end do
print *, j
print *, b
end program omp_do

View file

@ -0,0 +1,21 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL:*
! OpenMP Version 4.5
! 2.7.1 Loop Construct
! The ordered clause must be present on the loop construct if any ordered
! region ever binds to a loop region arising from the loop construct.
program omp_do
integer i, j, k
!$omp do
do i = 1, 10
!ERROR: ordered region inside a loop region without an ordered clause.
!$omp ordered
call my_func()
!$omp end ordered
end do
!$omp end do
end program omp_do

View file

@ -0,0 +1,24 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL:*
! OpenMP Version 4.5
! 2.7.1 Loop Construct
! No statement in the associated loops other than the DO statements
! can cause a branch out of the loops
program omp_do
integer i, j, k
!$omp do
do i = 1, 10
do j = 1, 10
print *, "Hello"
!ERROR: invalid branch to/from OpenMP structured block
goto 10
end do
end do
!$omp end do
10 stop
end program omp_do

View file

@ -0,0 +1,19 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.7.1 Loop Construct
program omp_do
integer i, j, k
!$omp do collapse(2)
do i = 1, 10
!ERROR: CYCLE statement to non-innermost collapsed !$OMP DO loop
if (i .lt. 5) cycle
do j = 1, 10
print *, "Hello"
end do
end do
!$omp end do
end program omp_do

View file

@ -0,0 +1,22 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.7.1 Loop Construct
! The do-loop cannot be a DO WHILE or a DO loop without loop control.
program omp_do
integer i, j, k
i = 0
!$omp do
!ERROR: !$OMP DO cannot be a DO WHILE or DO without loop control
do while (i .lt. 10)
do j = 1, 10
print *, "Hello"
end do
i = i + 1
end do
!$omp end do
end program omp_do

View file

@ -0,0 +1,20 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.7.1 Loop Construct
! The do-loop iteration variable must be of type integer.
program omp_do
real i, j, k
!$omp do
!ERROR: The do-loop iteration variable must be of type integer.
do i = 1, 10
do j = 1, 10
print *, "Hello"
end do
end do
!$omp end do
end program omp_do

View file

@ -0,0 +1,24 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.8.3 Loop simd Construct
! Semantic error for correct test case.
program omp_loop_simd
integer i, j, k, l
k = 0;
l = 0
!$omp parallel do simd linear(l)
do i = 1, 10
do j = 1, 10
print *, "omp loop simd"
k = k + 1
l = l + 1
end do
end do
print *, k, l
end program omp_loop_simd

View file

@ -0,0 +1,24 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.5 parallel construct.
! A program that branches into or out of a parallel region
! is non-conforming.
program omp_parallel
integer i, j, k
!$omp parallel
do i = 1, 10
do j = 1, 10
print *, "Hello"
!ERROR: invalid branch to/from OpenMP structured block
goto 10
end do
end do
!$omp end parallel
10 stop
end program omp_parallel

View file

@ -0,0 +1,24 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.5 parallel construct.
! A program that branches into or out of a parallel region
! is non-conforming.
program omp_parallel
integer i, j, k
!ERROR: invalid entry to OpenMP structured block
goto 10
!$omp parallel
do i = 1, 10
do j = 1, 10
print *, "Hello"
10 stop
end do
end do
!$omp end parallel
end program omp_parallel

View file

@ -0,0 +1,16 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.7.2 sections Construct
! Only a single nowait clause can appear on a sections directive.
program omp_sections
!$omp sections
!$omp section
print *, "omp section"
!ERROR: Only a single nowait clause can appear on a sections directive.
!$omp end sections nowait nowait
end program omp_sections

View file

@ -0,0 +1,23 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.8.1 simd Construct
! A program that branches into or out of a simd region is non-conforming.
program omp_simd
integer i, j
!$omp simd
do i = 1, 10
do j = 1, 10
print *, "omp simd"
!ERROR: invalid branch to/from OpenMP structured block
goto 10
end do
end do
!$omp end simd
10 stop
end program omp_simd

View file

@ -0,0 +1,22 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.8.1 simd Construct
! Semantic error for correct test case
program omp_simd
integer i, j, k
integer, allocatable :: a(:)
allocate(a(10))
!$omp simd aligned(a)
do i = 1, 10
a(i) = i
end do
!$omp end simd
print *, a
end program omp_simd

View file

@ -0,0 +1,26 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.8.1 simd Construct
! An ordered construct with the simd clause is the only OpenMP construct
! that can be encountered during execution of a simd region.
program omp_simd
integer i, j, k
integer, allocatable :: a(:)
allocate(a(10))
!$omp simd
do i = 1, 10
!ERROR: Invalid OpenMP construct inside simd region
!$omp single
a(i) = i
!$omp end single
end do
!$omp end simd
print *, a
end program omp_simd

View file

@ -0,0 +1,17 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.7.3 single Construct
! Symbol present on multiple clauses
program omp_single
integer i
i = 10
!$omp single private(i)
print *, "omp single", i
!ERROR: Symbol i present on multiple clauses
!$omp end single copyprivate(i)
end program omp_single

View file

@ -0,0 +1,19 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.7.3 single Construct
! Copyprivate variable is not thread private or private in outer context
program omp_single
integer i
i = 10
!$omp parallel
!$omp single
print *, "omp single", i
!ERROR: copyprivate variable i is not threadprivate or private
!$omp end single copyprivate(i)
!$omp end parallel
end program omp_single

View file

@ -0,0 +1,32 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.9.1 task Construct
! Invalid entry to OpenMP structured block.
recursive subroutine traverse ( P )
type Node
type(Node), pointer :: left, right
end type Node
type(Node) :: P
!ERROR: invalid entry to OpenMP structured block
goto 10
if (associated(P%left)) then
!$omp task
call traverse(P%left)
10 stop
!$omp end task
endif
if (associated(P%right)) then
!$omp task
call traverse(P%right)
!$omp end task
endif
call process ( P )
end subroutine traverse

View file

@ -0,0 +1,21 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.9.3 taskloop simd Construct
! No reduction clause may be specified for !$omp taskloop simd.
program omp_taskloop_simd
integer i , j , k
!ERROR: Unexpected clause specified for !$OMP taskloop simd
!$omp taskloop simd reduction(+:k)
do i=1,10000
do j=1,i
call loop_body(i, j)
k = k + 1
end do
end do
!$omp end taskloop simd
end program omp_taskloop_simd

View file

@ -0,0 +1,26 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.9.2 taskloop Construct
! Assert fail for correct test case.
subroutine parallel_work
integer i
integer j
!$omp taskgroup
!$omp task
call long_running_task()
!$omp end task
!$omp taskloop private(j) grainsize(500) nogroup
do i=1,10000
do j=1,i
call loop_body(i, j)
end do
end do
!$omp end taskloop
!$omp end taskgroup
end subroutine parallel_work

View file

@ -0,0 +1,22 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.9.2 taskloop Construct
! Invalid entry to OpenMP structured block.
program omp_taskloop
integer i , j
!ERROR: invalid entry to OpenMP structured block
goto 10
!$omp taskloop private(j) grainsize(500) nogroup
do i=1,10000
do j=1,i
10 call loop_body(i, j)
end do
end do
!$omp end taskloop
end program omp_taskloop

View file

@ -0,0 +1,25 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.9.2 taskloop Construct
! All loops associated with the taskloop construct must be perfectly nested,
! there must be no intervening code or any OpenMP directive between
! any two loops
program omp_taskloop
integer i, j
!$omp taskloop private(j) grainsize(500) nogroup
do i=1, 10000
do j=1, i
call loop_body(i, j)
end do
!ERROR: Loops associated with !$omp taskloop is not perfectly nested
!$omp single
print *, "omp single"
!$omp end single
end do
!$omp end taskloop
end program omp_taskloop

View file

@ -0,0 +1,23 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.7.4 workshare Construct
! Invalid do construct inside !$omp workshare
subroutine workshare(aa, bb, cc, dd, ee, ff, n)
integer n, i
real aa(n,n), bb(n,n), cc(n,n), dd(n,n), ee(n,n), ff(n,n)
!$omp workshare
!ERROR: Unexpected do stmt inside !$omp workshare
do i = 1, n
print *, "omp workshare"
end do
aa = bb
cc = dd
ee = ff
!$omp end workshare
end subroutine workshare

View file

@ -0,0 +1,29 @@
! RUN: %S/test_errors.sh %s %t %f18 -fopenmp
! XFAIL: *
! OpenMP Version 4.5
! 2.7.4 workshare Construct
! The !omp workshare construct must not contain any user defined
! function calls unless the function is ELEMENTAL.
module my_mod
contains
function my_func(n)
integer :: my_func(n, n)
my_func = 10
end function my_func
end module my_mod
subroutine workshare(aa, bb, cc, dd, ee, ff, n)
use my_mod
integer n, i
real aa(n,n), bb(n,n), cc(n,n), dd(n,n), ee(n,n), ff(n,n)
!$omp workshare
!ERROR: Non-ELEMENTAL function is not allowed in !$omp workshare construct
aa = my_func(n)
cc = dd
ee = ff
!$omp end workshare
end subroutine workshare