+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>
PR middle-end/69246
{
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)
/* 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";
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;
+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>
* libgomp.texi: Updates for OpenACC.
--- /dev/null
+! 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