From 1dfa89b0355520ca501054726f25de9733796f48 Mon Sep 17 00:00:00 2001 From: Kwok Cheung Yeung Date: Thu, 25 Jun 2020 04:40:16 -0700 Subject: [PATCH] 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 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 --- gcc/fortran/trans-openmp.c | 5 +- gcc/testsuite/gfortran.dg/gomp/combined-if.f90 | 110 +++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/gomp/combined-if.f90 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" } } -- 2.7.4