This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[openacc] implicit non-scalars data mapping in kernels
- From: Cesar Philippidis <cesar at codesourcery dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>, Nathan Sidwell <nathan_sidwell at mentor dot com>, Jakub Jelinek <jakub at redhat dot com>
- Date: Wed, 13 Jan 2016 14:29:21 -0800
- Subject: [openacc] implicit non-scalars data mapping in kernels
- Authentication-results: sourceware.org; auth=none
This patch fixes a bug where the implicit data mapping for "non-scalar"
variables in acc kernels regions uses a copy clause instead of a
present_or_copy when the variable is a reference type. This situation
can arise in fortran, when a dummy array is used inside a kernels
region. I noticed that there was already code in place to handle pointer
types for parallel data mappings, so in this patch I moved that type
extraction earlier so that both kernels and parallel regions can use it.
Is this patch ok for trunk?
Thanks,
Cesar
2016-01-13 Cesar Philippidis <cesar@codesourcery.com>
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.
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 17144d1..bc0715b 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -5994,6 +5994,11 @@ 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 (TREE_CODE (type) == REFERENCE_TYPE
+ || POINTER_TYPE_P (type))
+ type = TREE_TYPE (type);
if ((ctx->region_type & (ORT_ACC_PARALLEL | ORT_ACC_KERNELS)) != 0
&& is_global_var (decl)
@@ -6012,7 +6017,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";
@@ -6020,12 +6025,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/testsuite/libgomp.oacc-fortran/kernels-data.f90 b/libgomp/testsuite/libgomp.oacc-fortran/kernels-data.f90
new file mode 100644
index 0000000..bf812b6
--- /dev/null
+++ b/libgomp/testsuite/libgomp.oacc-fortran/kernels-data.f90
@@ -0,0 +1,30 @@
+! Ensure that a non-scalar dummy argument which is implicitly used in a
+! kernels regions is 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 data(array, n)
+ !$acc end data
+
+ do i = 1, n
+ if (array(i) .ne. i) call abort
+ end do
+end program main
+
+subroutine data (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 data