blob: 71b4231f315176f017f52f20b34f40dfc882aae9 [file] [log] [blame]
! { dg-do compile }
! { dg-additional-options "-fdump-tree-original" }
!
! (in_)reduction clause
! Test all in-principle valid combinations, even if
! not valid in this context (some fail at ME level)
!
implicit none
integer :: a, b, i
a = 0
! ------------ parallel ------------
!$omp parallel reduction(+:a)
do i=1,10
a = a + 1
end do
!$omp end parallel
!$omp parallel reduction(default,+:a)
do i=1,10
a = a + 1
end do
!$omp end parallel
!$omp parallel reduction(task,+:a)
do i=1,10
a = a + 1
end do
!$omp end parallel
! ------------ simd ------------
!$omp simd reduction(+:a)
do i=1,10
a = a + 1
end do
!$omp simd reduction(default,+:a)
do i=1,10
a = a + 1
end do
!$omp simd reduction(task,+:a) ! { dg-error "invalid 'task' reduction modifier on construct other than 'parallel', 'do', 'sections' or 'scope'" }
do i=1,10
a = a + 1
end do
! ------------ do ------------
!$omp parallel
!$omp do reduction(+:a)
do i=1,10
a = a + 1
end do
!$omp end parallel
!$omp parallel
!$omp do reduction(default,+:a)
do i=1,10
a = a + 1
end do
!$omp end parallel
!$omp parallel
!$omp do reduction(task,+:a)
do i=1,10
a = a + 1
end do
!$omp end parallel
! ------------ section ------------
!$omp parallel
!$omp sections reduction(+:a)
!$omp section
a = a + 1
!$omp end sections
!$omp end parallel
!$omp parallel
!$omp sections reduction(default,+:a)
!$omp section
a = a + 1
!$omp end sections
!$omp end parallel
!$omp parallel
!$omp sections reduction(task,+:a)
!$omp section
a = a + 1
!$omp end sections
!$omp end parallel
! ------------ task ------------
!$omp task in_reduction(+:a)
a = a + 1
!$omp end task
! ------------ taskloop ------------
!$omp taskloop reduction(+:a) in_reduction(+:b)
do i=1,10
a = a + 1
end do
!$omp taskloop reduction(default,+:a) in_reduction(+:b)
do i=1,10
a = a + 1
end do
! ------------ target ------------
!$omp target in_reduction(+:b)
a = a + 1
!$omp end target
! ------------ teams ------------
!$omp teams reduction(+:b)
a = a + 1
!$omp end teams
!$omp teams reduction(default, +:b)
a = a + 1
!$omp end teams
! ------------ taskgroup --------
!$omp taskgroup task_reduction(+:b)
a = a + 1
!$omp end taskgroup
end
! { dg-final { scan-tree-dump-times "#pragma omp for reduction\\(\\\+:a\\)" 2 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp for reduction\\(task,\\\+:a\\)" 1 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp parallel\[\n\r\]" 6 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp parallel private\\(i\\) reduction\\(\\\+:a\\)" 2 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp parallel private\\(i\\) reduction\\(task,\\\+:a\\)" 1 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp section\[\n\r\]" 3 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp sections reduction\\(\\\+:a\\)" 2 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp sections reduction\\(task,\\\+:a\\)" 1 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:1\\) reduction\\(\\\+:a\\)" 2 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp simd linear\\(i:1\\) reduction\\(task,\\\+:a\\)" 1 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp target map\\(always,tofrom:b\\) in_reduction\\(\\\+:b\\)" 1 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp task in_reduction\\(\\\+:a\\)" 1 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp teams reduction\\(\\\+:b\\)" 2 "original" } }
! { dg-final { scan-tree-dump-times "#pragma omp taskloop reduction\\(\\\+:a\\) in_reduction\\(\\\+:b\\)" 2 "original" } }