]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/56318 (Wrong result with MATMUL of PARAMETER)
authorTobias Burnus <burnus@gcc.gnu.org>
Fri, 15 Feb 2013 14:20:49 +0000 (15:20 +0100)
committerTobias Burnus <burnus@gcc.gnu.org>
Fri, 15 Feb 2013 14:20:49 +0000 (15:20 +0100)
2013-02-15  Tobias Burnus  <burnus@net-b.de>
            Mikael Morin  <mikael@gcc.gnu.org>

        PR fortran/56318
        * simplify.c (gfc_simplify_matmul): Fix result shape
        and matmul result.

2013-02-15  Tobias Burnus  <burnus@net-b.de>

        PR fortran/56318
        * gcc/testsuite/gfortran.dg/matmul_9.f90: New.

From-SVN: r196079

gcc/fortran/ChangeLog
gcc/fortran/simplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/matmul_9.f90 [new file with mode: 0644]

index d1d42ff07dda2cbb597ca6fc044352d86a408244..417106ef44860e5f0b8cc2fb477144ab2a4ee918 100644 (file)
@@ -1,3 +1,10 @@
+2013-02-15  Tobias Burnus  <burnus@net-b.de>
+           Mikael Morin  <mikael@gcc.gnu.org>
+
+       PR fortran/56318
+       * simplify.c (gfc_simplify_matmul): Fix result shape
+       and matmul result.
+
 2013-02-13  Tobias Burnus  <burnus@net-b.de>
 
        Backported from mainline
index 4257fc754ba01934b2879bf08c2e2006cfd6df02..57ffa1b826976b69c99f7e32d941c4b4d12a549f 100644 (file)
@@ -3884,7 +3884,7 @@ gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
   if (matrix_a->rank == 1 && matrix_b->rank == 2)
     {
       result_rows = 1;
-      result_columns = mpz_get_si (matrix_b->shape[0]);
+      result_columns = mpz_get_si (matrix_b->shape[1]);
       stride_a = 1;
       stride_b = mpz_get_si (matrix_b->shape[0]);
 
@@ -3894,7 +3894,7 @@ gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
     }
   else if (matrix_a->rank == 2 && matrix_b->rank == 1)
     {
-      result_rows = mpz_get_si (matrix_b->shape[0]);
+      result_rows = mpz_get_si (matrix_a->shape[0]);
       result_columns = 1;
       stride_a = mpz_get_si (matrix_a->shape[0]);
       stride_b = 1;
@@ -3907,7 +3907,7 @@ gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
     {
       result_rows = mpz_get_si (matrix_a->shape[0]);
       result_columns = mpz_get_si (matrix_b->shape[1]);
-      stride_a = mpz_get_si (matrix_a->shape[1]);
+      stride_a = mpz_get_si (matrix_a->shape[0]);
       stride_b = mpz_get_si (matrix_b->shape[0]);
 
       result->rank = 2;
index 2a43fe081600cccc32732cc602ddfc5dad063c52..7e7942dc424d8bfbfe40be3325ddd761e70b36e3 100644 (file)
@@ -1,3 +1,8 @@
+2013-02-15  Tobias Burnus  <burnus@net-b.de>
+
+       PR fortran/56318
+       * gcc/testsuite/gfortran.dg/matmul_9.f90: New.
+
 2013-02-13  Tobias Burnus  <burnus@net-b.de>
 
        Backported from mainline
@@ -47,7 +52,7 @@
        Backport from mainline
        2013-01-17  Martin Jambor  <mjambor@suse.cz>
 
-        PR tree-optimizations/55264
+       PR tree-optimizations/55264
        * g++.dg/ipa/pr55264.C: New test.
 
 2013-01-14  Janus Weil  <janus@gcc.gnu.org>
diff --git a/gcc/testsuite/gfortran.dg/matmul_9.f90 b/gcc/testsuite/gfortran.dg/matmul_9.f90
new file mode 100644 (file)
index 0000000..bf2a299
--- /dev/null
@@ -0,0 +1,47 @@
+! { dg-do run }
+! { dg-options "-fdump-tree-original" }
+!
+! PR fortran/56318
+!
+! Contributed by Alberto Luaces
+!
+SUBROUTINE mass_matrix        
+  DOUBLE PRECISION,PARAMETER::m1=1.d0
+  DOUBLE PRECISION,DIMENSION(3,2),PARAMETER::A1=reshape([1.d0,0.d0, 0.d0, &
+       0.d0,1.d0, 0.d0],[3,2])
+  DOUBLE PRECISION,DIMENSION(2,2),PARAMETER::Mel=reshape([1.d0/3.d0, 0.d0, &
+       0.d0, 1.d0/3.d0],[2,2])
+
+  DOUBLE PRECISION,DIMENSION(3,3)::MM1
+
+  MM1=m1*matmul(A1,matmul(Mel,transpose(A1)))
+  !print '(3f8.3)', MM1
+  if (any (abs (MM1 &
+                - reshape ([1.d0/3.d0, 0.d0,      0.d0,  &
+                            0.d0,      1.d0/3.d0, 0.d0,  &
+                            0.d0,      0.d0,      0.d0], &
+                           [3,3])) > epsilon(1.0d0))) &
+    call abort ()
+END SUBROUTINE mass_matrix
+
+program name
+  implicit none
+  integer, parameter :: A(3,2) = reshape([1,2,3,4,5,6],[3,2])
+  integer, parameter :: B(2,3) = reshape([3,17,23,31,43,71],[2,3])
+  integer, parameter :: C(3)   = [-5,-7,-21]
+  integer, parameter :: m1 = 1
+
+!  print *, matmul(B,C)
+   if (any (matmul(B,C) /= [-1079, -1793])) call abort()
+!  print *, matmul(C,A)
+   if (any (matmul(C,A) /= [-82, -181])) call abort()
+!  print '(3i5)', m1*matmul(A,B)
+  if (any (m1*matmul(A,B) /= reshape([71,91,111, 147,201,255, 327,441,555],&
+                                     [3,3]))) &
+     call abort()
+  call mass_matrix
+end program name
+
+! { dg-final { scan-tree-dump-times "matmul" 0 "original" } }
+! { dg-final { cleanup-tree-dump "original" } }
+