https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81773
Bug ID: 81773
Summary: [Coarray] Get with vector index on lhs leads to
incorrect caf_get_by_ref() call.
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Severity: minor
Priority: P3
Component: fortran
Assignee: unassigned at gcc dot gnu.org
Reporter: vehre at gcc dot gnu.org
Target Milestone: ---
Created attachment 41951
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=41951&action=edit
Dump
Fortran code like:
tv(loc_idx(1:nhl,ip)) = xv%v(rmt_idx(1:nhl,ip))[xchg(ip)]
leads to the generation of pseudo-code:
atmp.33.dtype = 281;
atmp.33.dim[0].stride = 1;
atmp.33.dim[0].lbound = 0;
atmp.33.dim[0].ubound = 1;
atmp.33.data = (void * restrict) &A.34;
atmp.33.offset = 0;
{
integer(kind=8) S.35;
S.35 = 0;
while (1)
{
if (S.35 > 1) goto L.26;
{
integer(kind=4) D.3704;
D.3704 = (*(integer(kind=4)[0:] *)
parm.32.data)[parm.32.dim[0].stride * NON_LVALUE_EXPR <S.35>];
(*(real(kind=4)[2] * restrict) atmp.33.data)[S.35] =
(*D.3696)[(integer(kind=8)) D.3704 + D.3697];
}
S.35 = S.35 + 1;
}
L.26:;
}
atmp.33.dtype = 281;
caf_ref.36.type = 1;
<snip>
__asm__ __volatile__("":::"memory");
_gfortran_caf_get_by_ref (xv.v.token, ((*(integer(kind=4)[0:] *
restrict) xchg.data)[xchg.offset + (integer(kind=8)) ip] - (integer(kind=4))
xv.v.dim[1].lbound) + 1, &atmp.33, &caf_ref.36, 4, 4, 0, 0, 0B);
without copying back the result afterwards. In fact is the while(1) loop above
unnecessary, because atmp.33 is write-only in this call.
Example and dump attached.