aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKwok Cheung Yeung <kcy@codesourcery.com>2020-06-25 04:40:16 -0700
committerKwok Cheung Yeung <kcy@codesourcery.com>2020-06-25 06:06:12 -0700
commit1dfa89b0355520ca501054726f25de9733796f48 (patch)
tree47089ecdd09b8912077f847688deb360b81951d7 /gcc
parentd2adb79eac663874593a28387db593fb4bb2995f (diff)
downloadgcc-1dfa89b0355520ca501054726f25de9733796f48.zip
gcc-1dfa89b0355520ca501054726f25de9733796f48.tar.gz
gcc-1dfa89b0355520ca501054726f25de9733796f48.tar.bz2
fortran: Apply if clause to all sub-constructs in combined OpenMP constructs
The unmodified 'if' clause should be applied to all the sub-constructs that accept an 'if' clause in a combined OpenMP construct, and not just to the 'parallel' sub-construct. 2020-06-25 Kwok Cheung Yeung <kcy@codesourcery.com> gcc/fortran/ * trans-openmp.c (gfc_split_omp_clauses): Add if clause to target and simd sub-constructs. gcc/testsuite/ * gfortran.dg/gomp/combined-if.f90: New. Reviewed-by: Jakub Jelinek <jakub@redhat.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/trans-openmp.c5
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/combined-if.f90110
2 files changed, 114 insertions, 1 deletions
diff --git a/gcc/fortran/trans-openmp.c b/gcc/fortran/trans-openmp.c
index 7e2f625..67b7094 100644
--- a/gcc/fortran/trans-openmp.c
+++ b/gcc/fortran/trans-openmp.c
@@ -4748,7 +4748,7 @@ gfc_split_omp_clauses (gfc_code *code,
clausesa[GFC_OMP_SPLIT_TARGET].if_exprs[OMP_IF_TARGET]
= code->ext.omp_clauses->if_exprs[OMP_IF_TARGET];
/* And this is copied to all. */
- clausesa[GFC_OMP_SPLIT_PARALLEL].if_expr
+ clausesa[GFC_OMP_SPLIT_TARGET].if_expr
= code->ext.omp_clauses->if_expr;
}
if (mask & GFC_OMP_MASK_TEAMS)
@@ -4832,6 +4832,9 @@ gfc_split_omp_clauses (gfc_code *code,
/* Duplicate collapse. */
clausesa[GFC_OMP_SPLIT_SIMD].collapse
= code->ext.omp_clauses->collapse;
+ /* And this is copied to all. */
+ clausesa[GFC_OMP_SPLIT_SIMD].if_expr
+ = code->ext.omp_clauses->if_expr;
}
if (mask & GFC_OMP_MASK_TASKLOOP)
{
diff --git a/gcc/testsuite/gfortran.dg/gomp/combined-if.f90 b/gcc/testsuite/gfortran.dg/gomp/combined-if.f90
new file mode 100644
index 0000000..383086c
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/gomp/combined-if.f90
@@ -0,0 +1,110 @@
+! { dg-do compile }
+! { dg-additional-options "-fdump-tree-omplower" }
+
+module combined_if
+ implicit none
+
+ integer, parameter :: N = 100
+ integer, parameter :: LIMIT = 60
+ integer :: i, j
+ integer, dimension(N) :: a = (/ (i, i = 1,N) /)
+contains
+ subroutine test_parallel_loop_simd
+ do j = 1, N
+ !$omp parallel do simd if(j .lt. LIMIT)
+ do i = 1, N
+ a(i) = a(i) + 1
+ end do
+ end do
+ end subroutine
+
+ ! TODO: This currently fails with an internal compiler error
+ ! (PR 95869)
+ !subroutine test_target_parallel
+ ! do j = 1, N
+ ! !$omp target parallel if(j .lt. LIMIT) map(tofrom: a(1:N))
+ ! do i = 1, N
+ ! a(i) = a(i) + 1
+ ! end do
+ ! !$omp end target parallel
+ ! end do
+ !end subroutine
+
+ subroutine test_target_parallel_loop
+ do j = 1, N
+ !$omp target parallel do if(j .lt. LIMIT) map(tofrom: a(1:N))
+ do i = 1, N
+ a(i) = a(i) + 1
+ end do
+ end do
+ end subroutine
+
+ subroutine test_target_parallel_loop_simd
+ do j = 1, N
+ !$omp target parallel do simd if(j .lt. LIMIT) map(tofrom: a(1:N))
+ do i = 1, N
+ a(i) = a(i) + 1
+ end do
+ end do
+ end subroutine
+
+ subroutine test_target_simd
+ do j = 1, N
+ !$omp target simd if(j .lt. LIMIT) map(tofrom: a(1:N))
+ do i = 1, N
+ a(i) = a(i) + 1
+ end do
+ end do
+ end subroutine
+
+ subroutine test_target_teams
+ do j = 1, N
+ !$omp target teams if(j .lt. LIMIT) map(tofrom: a(1:N))
+ do i = 1, N
+ a(i) = a(i) + 1
+ end do
+ !$omp end target teams
+ end do
+ end subroutine
+
+ subroutine test_target_teams_distribute
+ do j = 1, N
+ !$omp target teams distribute if(j .lt. LIMIT) map(tofrom: a(1:N))
+ do i = 1, N
+ a(i) = a(i) + 1
+ end do
+ end do
+ end subroutine
+
+ subroutine test_target_teams_distibute_simd
+ do j = 1, N
+ !$omp target teams distribute simd if(j .lt. LIMIT) map(tofrom: a(1:N))
+ do i = 1, N
+ a(i) = a(i) + 1
+ end do
+ end do
+ end subroutine
+
+ subroutine test_target_teams_distribute_parallel_loop
+ do j = 1, N
+ !$omp target teams distribute parallel do if(j .lt. LIMIT) map(tofrom: a(1:N))
+ do i = 1, N
+ a(i) = a(i) + 1
+ end do
+ end do
+ end subroutine
+
+ subroutine test_target_teams_distribute_parallel_loop_simd
+ do j = 1, N
+ !$omp target teams distribute parallel do simd if(j .lt. LIMIT) map(tofrom: a(1:N))
+ do i = 1, N
+ a(i) = a(i) + 1
+ end do
+ end do
+ end subroutine
+
+end module
+
+! { dg-final { scan-tree-dump-times "(?n)#pragma omp target.* if\\(" 8 "omplower" } }
+! { dg-final { scan-tree-dump-times "(?n)#pragma omp simd.* if\\(" 7 "omplower" } }
+! { dg-final { scan-tree-dump-times "(?n)#pragma omp parallel.* if\\(" 5 "omplower" } }