diff options
author | Kwok Cheung Yeung <kcy@codesourcery.com> | 2020-06-25 04:40:16 -0700 |
---|---|---|
committer | Kwok Cheung Yeung <kcy@codesourcery.com> | 2020-06-25 06:06:12 -0700 |
commit | 1dfa89b0355520ca501054726f25de9733796f48 (patch) | |
tree | 47089ecdd09b8912077f847688deb360b81951d7 /gcc | |
parent | d2adb79eac663874593a28387db593fb4bb2995f (diff) | |
download | gcc-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.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/gomp/combined-if.f90 | 110 |
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" } } |