gimplify.c (oacc_default_clause): Decode reference and pointer types for both kernels and parallel regions.
gcc/ * gimplify.c (oacc_default_clause): Decode reference and pointer types for both kernels and parallel regions. libgomp/ * testsuite/libgomp.oacc-fortran/kernels-data.f90: New test. From-SVN: r232431
This commit is contained in:
parent
a00fe3b787
commit
33a126a6f2
4 changed files with 64 additions and 7 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
2016-01-15 Cesar Philippidis <cesar@codesourcery.com>
|
||||||
|
|
||||||
|
* gimplify.c (oacc_default_clause): Decode reference and pointer
|
||||||
|
types for both kernels and parallel regions.
|
||||||
|
|
||||||
2016-01-15 Richard Sandiford <richard.sandiford@arm.com>
|
2016-01-15 Richard Sandiford <richard.sandiford@arm.com>
|
||||||
|
|
||||||
PR middle-end/69246
|
PR middle-end/69246
|
||||||
|
|
|
@ -5986,6 +5986,10 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags)
|
||||||
{
|
{
|
||||||
const char *rkind;
|
const char *rkind;
|
||||||
bool on_device = false;
|
bool on_device = false;
|
||||||
|
tree type = TREE_TYPE (decl);
|
||||||
|
|
||||||
|
if (lang_hooks.decls.omp_privatize_by_reference (decl))
|
||||||
|
type = TREE_TYPE (type);
|
||||||
|
|
||||||
if ((ctx->region_type & (ORT_ACC_PARALLEL | ORT_ACC_KERNELS)) != 0
|
if ((ctx->region_type & (ORT_ACC_PARALLEL | ORT_ACC_KERNELS)) != 0
|
||||||
&& is_global_var (decl)
|
&& is_global_var (decl)
|
||||||
|
@ -6004,7 +6008,7 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags)
|
||||||
/* Scalars are default 'copy' under kernels, non-scalars are default
|
/* Scalars are default 'copy' under kernels, non-scalars are default
|
||||||
'present_or_copy'. */
|
'present_or_copy'. */
|
||||||
flags |= GOVD_MAP;
|
flags |= GOVD_MAP;
|
||||||
if (!AGGREGATE_TYPE_P (TREE_TYPE (decl)))
|
if (!AGGREGATE_TYPE_P (type))
|
||||||
flags |= GOVD_MAP_FORCE;
|
flags |= GOVD_MAP_FORCE;
|
||||||
|
|
||||||
rkind = "kernels";
|
rkind = "kernels";
|
||||||
|
@ -6012,12 +6016,6 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags)
|
||||||
|
|
||||||
case ORT_ACC_PARALLEL:
|
case ORT_ACC_PARALLEL:
|
||||||
{
|
{
|
||||||
tree type = TREE_TYPE (decl);
|
|
||||||
|
|
||||||
if (TREE_CODE (type) == REFERENCE_TYPE
|
|
||||||
|| POINTER_TYPE_P (type))
|
|
||||||
type = TREE_TYPE (type);
|
|
||||||
|
|
||||||
if (on_device || AGGREGATE_TYPE_P (type))
|
if (on_device || AGGREGATE_TYPE_P (type))
|
||||||
/* Aggregates default to 'present_or_copy'. */
|
/* Aggregates default to 'present_or_copy'. */
|
||||||
flags |= GOVD_MAP;
|
flags |= GOVD_MAP;
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
2016-01-15 Cesar Philippidis <cesar@codesourcery.com>
|
||||||
|
|
||||||
|
* testsuite/libgomp.oacc-fortran/kernels-data.f90: New test.
|
||||||
|
|
||||||
2016-01-12 James Norris <jnorris@codesourcery.com>
|
2016-01-12 James Norris <jnorris@codesourcery.com>
|
||||||
|
|
||||||
* libgomp.texi: Updates for OpenACC.
|
* libgomp.texi: Updates for OpenACC.
|
||||||
|
|
50
libgomp/testsuite/libgomp.oacc-fortran/non-scalar-data.f90
Normal file
50
libgomp/testsuite/libgomp.oacc-fortran/non-scalar-data.f90
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
! Ensure that a non-scalar dummy arguments which are implicitly used inside
|
||||||
|
! offloaded regions are properly mapped using present_or_copy.
|
||||||
|
|
||||||
|
! { dg-do run }
|
||||||
|
|
||||||
|
program main
|
||||||
|
implicit none
|
||||||
|
|
||||||
|
integer, parameter :: n = 100
|
||||||
|
integer :: array(n), i
|
||||||
|
|
||||||
|
!$acc data copy(array)
|
||||||
|
call kernels(array, n)
|
||||||
|
|
||||||
|
!$acc update host(array)
|
||||||
|
|
||||||
|
do i = 1, n
|
||||||
|
if (array(i) .ne. i) call abort
|
||||||
|
end do
|
||||||
|
|
||||||
|
call parallel(array, n)
|
||||||
|
!$acc end data
|
||||||
|
|
||||||
|
do i = 1, n
|
||||||
|
if (array(i) .ne. i+i) call abort
|
||||||
|
end do
|
||||||
|
end program main
|
||||||
|
|
||||||
|
subroutine kernels (array, n)
|
||||||
|
integer, dimension (n) :: array
|
||||||
|
integer :: n, i
|
||||||
|
|
||||||
|
!$acc kernels
|
||||||
|
do i = 1, n
|
||||||
|
array(i) = i
|
||||||
|
end do
|
||||||
|
!$acc end kernels
|
||||||
|
end subroutine kernels
|
||||||
|
|
||||||
|
|
||||||
|
subroutine parallel (array, n)
|
||||||
|
integer, dimension (n) :: array
|
||||||
|
integer :: n, i
|
||||||
|
|
||||||
|
!$acc parallel
|
||||||
|
do i = 1, n
|
||||||
|
array(i) = i+i
|
||||||
|
end do
|
||||||
|
!$acc end parallel
|
||||||
|
end subroutine parallel
|
Loading…
Add table
Reference in a new issue