fortran: Fix up gfc_trans_oacc_construct [PR104717]
So that move_sese_region_to_fn works properly, OpenMP/OpenACC constructs for which that function is invoked need an extra artificial BIND_EXPR around their body so that we move all variables of the bodies. The C/C++ FEs do that both for OpenMP constructs like OMP_PARALLEL, OMP_TASK or OMP_TARGET and for OpenACC constructs that behave similarly to OMP_TARGET, but the Fortran FE only does that for OpenMP constructs. The following patch does that for OpenACC constructs too. PR fortran/104717 gcc/fortran/ * trans-openmp.cc (gfc_trans_oacc_construct): Wrap construct body in an extra BIND_EXPR. gcc/testsuite/ * gfortran.dg/goacc/pr104717.f90: New test. * gfortran.dg/goacc/privatization-1-compute-loop.f90: Adjust. libgomp/ * testsuite/libgomp.oacc-fortran/privatized-ref-2.f90: Adjust. Co-authored-by: Thomas Schwinge <thomas@codesourcery.com>
This commit is contained in:
parent
68fd1c9f22
commit
b220243191
4 changed files with 35 additions and 3 deletions
|
@ -4444,7 +4444,9 @@ gfc_trans_oacc_construct (gfc_code *code)
|
|||
gfc_start_block (&block);
|
||||
oacc_clauses = gfc_trans_omp_clauses (&block, code->ext.omp_clauses,
|
||||
code->loc, false, true);
|
||||
pushlevel ();
|
||||
stmt = gfc_trans_omp_code (code->block->next, true);
|
||||
stmt = build3_v (BIND_EXPR, NULL, stmt, poplevel (1, 0));
|
||||
stmt = build2_loc (gfc_get_location (&code->loc), construct_code,
|
||||
void_type_node, stmt, oacc_clauses);
|
||||
gfc_add_expr_to_block (&block, stmt);
|
||||
|
|
22
gcc/testsuite/gfortran.dg/goacc/pr104717.f90
Normal file
22
gcc/testsuite/gfortran.dg/goacc/pr104717.f90
Normal file
|
@ -0,0 +1,22 @@
|
|||
! Extracted from 'libgomp.oacc-fortran/privatized-ref-2.f90'.
|
||||
|
||||
! { dg-additional-options "-O1 -fstack-arrays -fipa-pta" }
|
||||
|
||||
program main
|
||||
implicit none (type, external)
|
||||
integer :: j
|
||||
integer, allocatable :: A(:)
|
||||
|
||||
A = [(3*j, j=1, 10)]
|
||||
call foo (A, size(A))
|
||||
deallocate (A)
|
||||
contains
|
||||
subroutine foo (array, nn)
|
||||
integer :: i, nn
|
||||
integer :: array(nn)
|
||||
|
||||
!$acc parallel copyout(array)
|
||||
array = [(-i, i = 1, nn)]
|
||||
!$acc end parallel
|
||||
end subroutine foo
|
||||
end
|
|
@ -13,7 +13,7 @@
|
|||
! passed to 'incr' may be unset, and in that case, it will be set to [...]",
|
||||
! so to maintain compatibility with earlier Tcl releases, we manually
|
||||
! initialize counter variables:
|
||||
! { dg-line l_dummy[variable c_loop 0] }
|
||||
! { dg-line l_dummy[variable c_compute 0 c_loop 0] }
|
||||
! { dg-message "dummy" "" { target iN-VAl-Id } l_dummy } to avoid
|
||||
! "WARNING: dg-line var l_dummy defined, but not used".
|
||||
|
||||
|
@ -26,7 +26,7 @@ contains
|
|||
integer, parameter :: c = 3
|
||||
integer, external :: g
|
||||
|
||||
!$acc parallel
|
||||
!$acc parallel ! { dg-line l_compute[incr c_compute] }
|
||||
!$acc loop collapse(2) private(a) private(x, y) ! { dg-line l_loop[incr c_loop] }
|
||||
do i = 1, 20
|
||||
do j = 1, 25
|
||||
|
@ -46,6 +46,8 @@ contains
|
|||
y = a
|
||||
end do
|
||||
end do
|
||||
!$acc end parallel
|
||||
! { dg-note {variable 'count\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_compute$c_compute }
|
||||
! { dg-note {variable 'count\.[0-9]+' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
|
||||
! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
|
||||
! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
|
||||
|
@ -54,6 +56,5 @@ contains
|
|||
! { dg-note {variable 'y' in 'private' clause is candidate for adjusting OpenACC privatization level} "" { target *-*-* } l_loop$c_loop }
|
||||
! { dg-note {variable 'C\.[0-9]+' declared in block potentially has improper OpenACC privatization level: 'const_decl'} "TODO" { target *-*-* } l_loop$c_loop }
|
||||
! { dg-note {variable 'y' ought to be adjusted for OpenACC privatization level: 'vector'} "" { target *-*-* } l_loop$c_loop }
|
||||
!$acc end parallel
|
||||
end subroutine f
|
||||
end module m
|
||||
|
|
|
@ -53,6 +53,9 @@ contains
|
|||
integer :: array(nn)
|
||||
|
||||
!$acc parallel copyout(array) ! { dg-line l_compute[incr c_compute] }
|
||||
! { dg-note {variable 'atmp\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_compute$c_compute }
|
||||
! { dg-note {variable 'shadow_loopvar\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_compute$c_compute }
|
||||
! { dg-note {variable 'offset\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_compute$c_compute }
|
||||
! { dg-note {variable 'S\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_compute$c_compute }
|
||||
array = [(-i, i = 1, nn)]
|
||||
!$acc end parallel
|
||||
|
@ -81,6 +84,10 @@ contains
|
|||
integer :: array(:)
|
||||
|
||||
!$acc parallel copyout(array) ! { dg-line l_compute[incr c_compute] }
|
||||
! { dg-note {variable 'atmp\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_compute$c_compute }
|
||||
! { dg-note {variable 'parm\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_compute$c_compute }
|
||||
! { dg-note {variable 'shadow_loopvar\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_compute$c_compute }
|
||||
! { dg-note {variable 'offset\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_compute$c_compute }
|
||||
! { dg-note {variable 'S\.[0-9]+' declared in block isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_compute$c_compute }
|
||||
array = [(-2*i, i = 1, size(array))]
|
||||
!$acc end parallel
|
||||
|
|
Loading…
Add table
Reference in a new issue