public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc/devel/coarray_native] Made the ALLOCATED intrinsic work with scalar coarrays.
@ 2020-12-20 19:45 Thomas König
0 siblings, 0 replies; only message in thread
From: Thomas König @ 2020-12-20 19:45 UTC (permalink / raw)
To: gcc-cvs
https://gcc.gnu.org/g:1a50de8778750f019e61a97ee6d3e8226c41a7f1
commit 1a50de8778750f019e61a97ee6d3e8226c41a7f1
Author: Thomas Koenig <tkoenig@gcc.gnu.org>
Date: Sun Dec 20 20:38:10 2020 +0100
Made the ALLOCATED intrinsic work with scalar coarrays.
gcc/fortran/ChangeLog:
* trans-array.c (gfc_conv_array_ref): Whitespace fix. Do not
add offset if se->no_impl_this_image is set.
* trans-intrinsic.c (gfc_conv_allocated): Set
no_imp_this_image if checking the allocation status of
a scalar.
* trans.h (gfc_se): Add no_impl_this_image flag.
gcc/testsuite/ChangeLog:
* gfortran.dg/caf-shared/scalar_alloc_1.f90: New test.
* gfortran.dg/caf-shared/scalar_alloc_2.f90: New test.
Diff:
---
gcc/fortran/trans-array.c | 5 +-
gcc/fortran/trans-intrinsic.c | 1 +
gcc/fortran/trans.h | 5 ++
.../gfortran.dg/caf-shared/scalar_alloc_1.f90 | 69 ++++++++++++++++++++++
.../gfortran.dg/caf-shared/scalar_alloc_2.f90 | 60 +++++++++++++++++++
5 files changed, 138 insertions(+), 2 deletions(-)
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index a5455fc5226..39e6b6d9051 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -3716,7 +3716,7 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar, gfc_expr *expr,
int eff_dimen;
need_impl_this_image =
- ar->dimen_type[ar->dimen + ar->codimen - 1] == DIMEN_THIS_IMAGE;
+ ar->dimen_type[ar->dimen + ar->codimen - 1] == DIMEN_THIS_IMAGE;
if (flag_coarray == GFC_FCOARRAY_SHARED
&& !need_impl_this_image)
@@ -3865,7 +3865,8 @@ gfc_conv_array_ref (gfc_se * se, gfc_array_ref * ar, gfc_expr *expr,
add_to_offset (&cst_offset, &offset, tmp);
}
- if (flag_coarray == GFC_FCOARRAY_SHARED && need_impl_this_image)
+ if (flag_coarray == GFC_FCOARRAY_SHARED && need_impl_this_image
+ && !se->no_impl_this_image)
{
tree off;
tree co_stride = gfc_conv_array_stride (decl, eff_dimen + 1);
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index 7824dcf55a0..e93cd3a12c7 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -8832,6 +8832,7 @@ gfc_conv_allocated (gfc_se *se, gfc_expr *expr)
{
/* Allocatable scalar. */
arg1se.want_pointer = 1;
+ arg1se.no_impl_this_image = 1;
gfc_conv_expr (&arg1se, arg1->expr);
tmp = arg1se.expr;
}
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index 95e4741906c..f3cf33b342f 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -98,6 +98,11 @@ typedef struct gfc_se
arrays in gfc_conv_expr_descriptor. */
unsigned use_offset:1;
+ /* For shared coarrays, do not add the offset for the implied
+ this_image(). */
+
+ unsigned no_impl_this_image:1;
+
unsigned want_coarray:1;
/* Scalarization parameters. */
diff --git a/gcc/testsuite/gfortran.dg/caf-shared/scalar_alloc_1.f90 b/gcc/testsuite/gfortran.dg/caf-shared/scalar_alloc_1.f90
new file mode 100644
index 00000000000..8264e2cc085
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/caf-shared/scalar_alloc_1.f90
@@ -0,0 +1,69 @@
+! { dg-do run }
+! { dg-set-target-env-var GFORTRAN_NUM_IMAGES "2" }
+!
+implicit none
+integer, allocatable :: A[:], B[:,:]
+integer :: n1, n2, n3
+
+if (allocated (a)) STOP 1
+if (allocated (b)) STOP 2
+
+allocate(a[*])
+a = 5 + this_image ()
+if (a[this_image ()] /= 5 + this_image ()) STOP 1
+
+a[this_image ()] = 8 - 2*this_image ()
+if (a[this_image ()] /= 8 - 2*this_image ()) STOP 2
+
+if (lcobound(a, dim=1) /= 1 .or. ucobound(a,dim=1) /= num_images()) &
+ STOP 3
+deallocate(a)
+
+allocate(a[4:*])
+a[this_image ()] = 8 - 2*this_image ()
+
+if (lcobound(a, dim=1) /= 4 .or. ucobound(a,dim=1) /= 3 + num_images()) &
+ STOP 4
+
+n1 = -1
+n2 = 5
+n3 = 3
+allocate (B[n1:n2, n3:*])
+if (any (lcobound(b) /= [-1, 3]) .or. lcobound(B, dim=2) /= n3) &
+ STOP 5
+call sub(A, B)
+
+if (allocated (a)) STOP 6
+if (.not.allocated (b)) STOP 7
+
+call two(.true.)
+call two(.false.)
+
+! automatically deallocate "B"
+contains
+ subroutine sub(x, y)
+ integer, allocatable :: x[:], y[:,:]
+
+ if (any (lcobound(y) /= [-1, 3]) .or. lcobound(y, dim=2) /= n3) &
+ STOP 8
+ if (lcobound(x, dim=1) /= 4 .or. ucobound(x,dim=1) /= 3 + num_images()) &
+ STOP 9
+ if (x[this_image ()] /= 8 - 2*this_image ()) STOP 3
+ deallocate(x)
+ end subroutine sub
+
+ subroutine two(init)
+ logical, intent(in) :: init
+ integer, allocatable, SAVE :: a[:]
+
+ if (init) then
+ if (allocated(a)) STOP 10
+ allocate(a[*])
+ a = 45
+ else
+ if (.not. allocated(a)) STOP 11
+ if (a /= 45) STOP 12
+ deallocate(a)
+ end if
+ end subroutine two
+end
diff --git a/gcc/testsuite/gfortran.dg/caf-shared/scalar_alloc_2.f90 b/gcc/testsuite/gfortran.dg/caf-shared/scalar_alloc_2.f90
new file mode 100644
index 00000000000..8143f887af8
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/caf-shared/scalar_alloc_2.f90
@@ -0,0 +1,60 @@
+! { dg-do run }
+! { dg-set-target-env-var GFORTRAN_NUM_IMAGES "4" }
+! Check whether registering allocatable coarrays works
+!
+type position
+ real :: x, y, z
+end type position
+
+integer, allocatable :: a[:]
+type(position), allocatable :: p[:]
+
+allocate(a[*])
+a = 7
+
+allocate(p[*])
+p%x = 11
+p%y = 13
+p%z = 15
+
+if (a /= 7) STOP 1
+a = 88
+if (a /= 88) STOP 2
+
+if (p%x /= 11) STOP 3
+p%x = 17
+if (p%x /= 17) STOP 4
+
+ block
+ integer, allocatable :: b[:]
+
+ allocate(b[*])
+ b = 8494
+
+ if (b /= 8494) STOP 5
+ end block
+
+if (a /= 88) STOP 6
+call test ()
+end
+
+subroutine test()
+ type velocity
+ real :: x, y, z
+ end type velocity
+
+ real, allocatable :: z[:]
+ type(velocity), allocatable :: v[:]
+
+ allocate(z[*])
+ z = sqrt(2.0)
+
+ allocate(v[*])
+ v%x = 21
+ v%y = 23
+ v%z = 25
+
+ if (z /= sqrt(2.0)) STOP 7
+ if (v%x /= 21) STOP 8
+
+end subroutine test
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-12-20 19:45 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-20 19:45 [gcc/devel/coarray_native] Made the ALLOCATED intrinsic work with scalar coarrays Thomas König
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).