From: Cesar Philippidis Date: Fri, 15 Jan 2016 14:49:55 +0000 (-0800) Subject: gimplify.c (oacc_default_clause): Decode reference and pointer types for both kernels... X-Git-Tag: basepoints/gcc-7~1598 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=33a126a6f2669a29a6657bffa96214ea33de211b;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 59dc4abbab50..5680be8a8d3d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-01-15 Cesar Philippidis + + * gimplify.c (oacc_default_clause): Decode reference and pointer + types for both kernels and parallel regions. + 2016-01-15 Richard Sandiford PR middle-end/69246 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index ca66402babac..c8de1e62abd9 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -5986,6 +5986,10 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags) { const char *rkind; 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 && 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 'present_or_copy'. */ flags |= GOVD_MAP; - if (!AGGREGATE_TYPE_P (TREE_TYPE (decl))) + if (!AGGREGATE_TYPE_P (type)) flags |= GOVD_MAP_FORCE; rkind = "kernels"; @@ -6012,12 +6016,6 @@ oacc_default_clause (struct gimplify_omp_ctx *ctx, tree decl, unsigned flags) 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)) /* Aggregates default to 'present_or_copy'. */ flags |= GOVD_MAP; diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog index 5918752c3ea7..be30656532a5 100644 --- a/libgomp/ChangeLog +++ b/libgomp/ChangeLog @@ -1,3 +1,7 @@ +2016-01-15 Cesar Philippidis + + * testsuite/libgomp.oacc-fortran/kernels-data.f90: New test. + 2016-01-12 James Norris * libgomp.texi: Updates for OpenACC. diff --git a/libgomp/testsuite/libgomp.oacc-fortran/non-scalar-data.f90 b/libgomp/testsuite/libgomp.oacc-fortran/non-scalar-data.f90 new file mode 100644 index 000000000000..4afb562e00cd --- /dev/null +++ b/libgomp/testsuite/libgomp.oacc-fortran/non-scalar-data.f90 @@ -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