From 7e269fe8753df7018b2bcf29fe1bff3e01d09138 Mon Sep 17 00:00:00 2001 From: Thomas Koenig Date: Tue, 12 May 2015 21:12:55 +0000 Subject: [PATCH] re PR fortran/66111 (ICE with matmul and vector subscripts) 2015-05-12 Thomas Koenig 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 PR fortran/66111 * gfortran.dg/inline_matmul_10.f90: New test. From-SVN: r223099 --- gcc/fortran/ChangeLog | 7 ++++ gcc/fortran/frontend-passes.c | 23 ++++++++++++ gcc/testsuite/ChangeLog | 5 +++ .../gfortran.dg/inline_matmul_10.f90 | 35 +++++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/inline_matmul_10.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 174e3b48569..1b455b56e0f 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2015-05-12 Thomas Koenig + + 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 PR fortran/66041 diff --git a/gcc/fortran/frontend-passes.c b/gcc/fortran/frontend-passes.c index 30085e8fd8e..a6b57860a20 100644 --- a/gcc/fortran/frontend-passes.c +++ b/gcc/fortran/frontend-passes.c @@ -2680,6 +2680,25 @@ scalarized_expr (gfc_expr *e_in, gfc_expr **index, int count_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; idimen; 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_subtrees, || 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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 60f7d304824..d8b6a582e7b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-05-12 Thomas Koenig + + PR fortran/66111 + * gfortran.dg/inline_matmul_10.f90: New test. + 2015-05-12 David Malcolm * c-c++-common/Wmisleading-indentation.c: New testcase. diff --git a/gcc/testsuite/gfortran.dg/inline_matmul_10.f90 b/gcc/testsuite/gfortran.dg/inline_matmul_10.f90 new file mode 100644 index 00000000000..3a577b00d8e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/inline_matmul_10.f90 @@ -0,0 +1,35 @@ +! { 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