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 <tkoe...@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 <tkoe...@gcc.gnu.org> PR fortran/66111 * gfortran.dg/inline_matmul_10.f90: New test.
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
! { 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