This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch, fortran] Fix handling of assumed-size arrays in inline matmul
- From: Thomas Koenig <tkoenig at netcologne dot de>
- To: "fortran at gcc dot gnu dot org" <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 12 Feb 2018 11:46:12 +0100
- Subject: [patch, fortran] Fix handling of assumed-size arrays in inline matmul
- Authentication-results: sourceware.org; auth=none
Hello world,
the attached patch fixes a regression where a rejects-valid would
be issued.
OK for the affected branches, trunk and gcc-7?
Regards
Thomas
2018-02-12 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/84270
* frontend-passes (scalarized_expr): If the expression
is an assumed size array, leave in the last reference
and pass AR_SECTION instead of AR_FULL to gfc_resolve
in order to avoid an error.
2018-02-12 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/84270
* gfortran.dg/inline_matmul_22.f90: New test.
Index: frontend-passes.c
===================================================================
--- frontend-passes.c (Revision 257347)
+++ frontend-passes.c (Arbeitskopie)
@@ -3567,11 +3567,27 @@ scalarized_expr (gfc_expr *e_in, gfc_expr **index,
is the lbound of a full ref. */
int j;
gfc_array_ref *ar;
+ int to;
ar = &ref->u.ar;
- ar->type = AR_FULL;
- for (j = 0; j < ar->dimen; j++)
+
+ /* For assumed size, we need to keep around the final
+ reference in order not to get an error on resolution
+ below, and we cannot use AR_FULL. */
+
+ if (ar->as->type == AS_ASSUMED_SIZE)
{
+ ar->type = AR_SECTION;
+ to = ar->dimen - 1;
+ }
+ else
+ {
+ to = ar->dimen;
+ ar->type = AR_FULL;
+ }
+
+ for (j = 0; j < to; j++)
+ {
gfc_free_expr (ar->start[j]);
ar->start[j] = NULL;
gfc_free_expr (ar->end[j]);
! { dg-do compile }
! { dg-additional-options "-ffrontend-optimize" }
! PR 84270 - this used to be rejected.
! Test case by Michael Weinert
module fp_precision
integer, parameter :: fp = selected_real_kind(13)
end module fp_precision
subroutine lhcal(nrot,orth,ngpts,vgauss,vr_0)
use fp_precision ! floating point precision
implicit none
!---> rotation matrices and rotations (input)
integer, intent(in) :: nrot
! real(kind=fp), intent(in) :: orth(3,3,nrot) ! fine at all -O
real(kind=fp), intent(in) :: orth(3,3,*)
!---> gaussian integration points
integer, intent(in) :: ngpts
real(kind=fp), intent(in) :: vgauss(3,*)
!---> output results
real(kind=fp), intent(out) :: vr_0(3)
real(kind=fp) :: v(3),vr(3)
integer :: n,nn
vr_0 = 0
do nn=1,ngpts
v(:) = vgauss(:,nn)
!---> apply rotations
do n=2,nrot
vr = matmul( orth(:,:,n), v )
vr_0 = vr_0 + vr
enddo
enddo
return
end subroutine lhcal