public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [patch, fortran] Fix PR 66111
@ 2015-05-12 20:10 Thomas Koenig
  2015-05-12 21:28 ` Mikael Morin
  0 siblings, 1 reply; 2+ messages in thread
From: Thomas Koenig @ 2015-05-12 20:10 UTC (permalink / raw)
  To: fortran, gcc-patches

[-- Attachment #1: Type: text/plain, Size: 578 bytes --]

Hello world,

this patch fixes a regression from the inline matmul patch by
not inlining a case that is not yet handled, namely vector
subscripts.

Regression-tested.  OK for trunk?

Regards

	Thomas

2015-05-12  Thomas Koenig  <tkoenig@gcc.gnu.org>

        PR fortran/66111
        * frontend-passes.c (has_dimen_vector_ref):  New function.
        (inline_matmul_assign):  Use it to return early in case
        of unhandled vector subscripts.

2015-05-12  Thomas Koenig  <tkoenig@gcc.gnu.org>

        PR fortran/66111
        * gfortran.dg/inline_matmul_10.f90:  New test.

[-- Attachment #2: p1.diff --]
[-- Type: text/x-patch, Size: 1116 bytes --]

Index: frontend-passes.c
===================================================================
--- frontend-passes.c	(Revision 222984)
+++ frontend-passes.c	(Arbeitskopie)
@@ -2680,7 +2680,26 @@ scalarized_expr (gfc_expr *e_in, gfc_expr **index,
   return e;
 }
 
+/* Helper function to check for a dimen vector as subscript.  */
 
+static bool
+has_dimen_vector_ref (gfc_expr *e)
+{
+  gfc_array_ref *ar;
+  int i;
+
+  ar = gfc_find_array_ref (e);
+  gcc_assert (ar);
+  if (ar->type == AR_FULL)
+    return false;
+
+  for (i=0; i<ar->dimen; i++)
+    if (ar->dimen_type[i] == DIMEN_VECTOR)
+      return true;
+
+  return false;
+}
+
 /* Inline assignments of the form c = matmul(a,b).
    Handle only the cases currently where b and c are rank-two arrays.
 
@@ -2752,6 +2771,10 @@ inline_matmul_assign (gfc_code **c, int *walk_subt
       || matrix_b->expr_type != EXPR_VARIABLE)
     return 0;
 
+  if (has_dimen_vector_ref (expr1) ||
+      has_dimen_vector_ref (matrix_a) || has_dimen_vector_ref (matrix_b))
+    return 0;
+
   if (matrix_a->rank == 2)
     m_case = matrix_b->rank == 1 ? A2B1 : A2B2;
   else

[-- Attachment #3: inline_matmul_10.f90 --]
[-- Type: text/x-fortran, Size: 1004 bytes --]

! { dg-do  run }
! { dg-options "-ffrontend-optimize" }
! PR 66111 - this used to ICE with matmul inlining.
! Original test case by Mikael Morin.

implicit none
  integer, parameter :: n = 4
  integer, dimension(n, n) :: a, b, c
  integer, dimension(n*n)  :: p, res, res2
  integer, dimension(n)    :: v

  integer :: i

  p = [ +59, -53, +47, -43, &
        -37, +31, -29, +23, &
        +19, -17, +13, -11, &
        - 7, + 5, - 3, + 2  ]
  a = reshape(p, shape(a))
  b = reshape([(i, i=1, size(a))], shape(b))
  v = [ 3, 1, 2, 4]
  c = matmul(a, b)
  res = [ + 14, - 22, + 16, - 22, &
          +150, -158, +128, -138, &
          +286, -294, +240, -254, &
          +422, -430, +352, -370  ]
  !print *,c
  if (any(c /= reshape(res, shape(c)))) call abort
  c(:,v) = matmul(a, b)
  if (any(c(:,v) /= reshape(res, shape(c)))) call abort
  c(v,:) = matmul(a, b)
  if (any(c(v,:) /= reshape(res, shape(c)))) call abort

  c = matmul(a(:,v),b(v,:))
  if (any(c /= reshape(res, shape(c)))) call abort
end

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [patch, fortran] Fix PR 66111
  2015-05-12 20:10 [patch, fortran] Fix PR 66111 Thomas Koenig
@ 2015-05-12 21:28 ` Mikael Morin
  0 siblings, 0 replies; 2+ messages in thread
From: Mikael Morin @ 2015-05-12 21:28 UTC (permalink / raw)
  To: Thomas Koenig, fortran, gcc-patches

Hello,

Le 12/05/2015 22:07, Thomas Koenig a écrit :
> Hello world,
> 
> this patch fixes a regression from the inline matmul patch by
> not inlining a case that is not yet handled, namely vector
> subscripts.
> 
> Regression-tested.  OK for trunk?
> 
OK with...
> 
> Index: frontend-passes.c
> ===================================================================
> --- frontend-passes.c	(Revision 222984)
> +++ frontend-passes.c	(Arbeitskopie)
> @@ -2752,6 +2771,10 @@ inline_matmul_assign (gfc_code **c, int *walk_subt
>        || matrix_b->expr_type != EXPR_VARIABLE)
>      return 0;
>  
> +  if (has_dimen_vector_ref (expr1) ||
> +      has_dimen_vector_ref (matrix_a) || has_dimen_vector_ref (matrix_b))
> +    return 0;
> +

...the operator || at the beginning of the line.

Thanks.

Mikael

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-05-12 20:36 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-12 20:10 [patch, fortran] Fix PR 66111 Thomas Koenig
2015-05-12 21:28 ` Mikael Morin

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).