OSDN Git Service

2007-12-25 Thomas Koenig <tkoenig@gcc.gnu.org>
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Dec 2007 10:12:41 +0000 (10:12 +0000)
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 25 Dec 2007 10:12:41 +0000 (10:12 +0000)
PR libfortran/34566
* m4/matmull.m4:  Multiply xstride and ystride by correct kind.
* generated/matmul_l4.c:  Regenerated.
* generated/matmul_l8.c:  Regenerated.
* generated/matmul_l16.c:  Regenerated.

2007-12-25  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR libfortran/34566
* gfortran.dg/matmul_6.f90:  New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@131167 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/matmul_6.f90 [new file with mode: 0644]
libgfortran/ChangeLog
libgfortran/generated/matmul_l16.c
libgfortran/generated/matmul_l4.c
libgfortran/generated/matmul_l8.c
libgfortran/m4/matmull.m4

index 9f5aa26..4bfd523 100644 (file)
@@ -1,3 +1,8 @@
+2007-12-25  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfortran/34566
+       * gfortran.dg/matmul_6.f90:  New test.
+
 2007-12-23  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/34421
diff --git a/gcc/testsuite/gfortran.dg/matmul_6.f90 b/gcc/testsuite/gfortran.dg/matmul_6.f90
new file mode 100644 (file)
index 0000000..737c5c4
--- /dev/null
@@ -0,0 +1,66 @@
+! { dg-do run }
+! PR 34566 - logical matmul used to give the wrong result.
+! We check this by running through every permutation in
+! multiplying two 3*3 matrices, and all permutations of multiplying
+! a 3-vector and a 3*3 matrices  and checking against equivalence
+! with integer matrix multiply.
+program main
+  implicit none
+  integer, parameter :: ki=4
+  integer, parameter :: dimen=3
+  integer :: i, j, k
+  real, dimension(dimen,dimen) :: r1, r2
+  integer, dimension(dimen,dimen) :: m1, m2
+  logical(kind=ki), dimension(dimen,dimen) :: l1, l2
+  logical(kind=ki), dimension(dimen*dimen) :: laux
+  logical(kind=ki), dimension(dimen) :: lv
+  integer, dimension(dimen) :: iv
+
+  do i=0,2**(dimen*dimen)-1
+     forall (k=1:dimen*dimen)
+        laux(k) = btest(i, k-1)
+     end forall
+     l1 = reshape(laux,shape(l1))
+     m1 = ltoi(l1)
+
+     ! Check matrix*matrix multiply
+     do j=0,2**(dimen*dimen)-1
+        forall (k=1:dimen*dimen)
+           laux(k) = btest(i, k-1)
+        end forall
+        l2 = reshape(laux,shape(l2))
+        m2 = ltoi(l2)
+        if (any(matmul(l1,l2) .neqv. (matmul(m1,m2) /= 0))) then
+          call abort
+        end if
+     end do
+
+     ! Check vector*matrix and matrix*vector multiply.
+     do j=0,2**dimen-1
+        forall (k=1:dimen)
+           lv(k) = btest(j, k-1)
+        end forall
+        iv = ltoi(lv)
+        if (any(matmul(lv,l1) .neqv. (matmul(iv,m1) /=0))) then
+          call abort
+        end if
+        if (any(matmul(l1,lv) .neqv. (matmul(m1,iv) /= 0))) then
+          call abort
+        end if
+     end do
+  end do
+
+contains
+  elemental function ltoi(v)
+    implicit none
+    integer :: ltoi
+    real :: rtoi
+    logical(kind=4), intent(in) :: v
+    if (v) then
+       ltoi = 1
+    else
+       ltoi = 0
+    end if
+  end function ltoi
+
+end program main
index 9d84e1b..8f32ca0 100644 (file)
@@ -1,3 +1,11 @@
+2007-12-25  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR libfortran/34566
+       * m4/matmull.m4:  Multiply xstride and ystride by correct kind.
+       * generated/matmul_l4.c:  Regenerated.
+       * generated/matmul_l8.c:  Regenerated.
+       * generated/matmul_l16.c:  Regenerated.
+
 2007-12-19  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/34530
index c3cabdb..b2b86ec 100644 (file)
@@ -152,7 +152,7 @@ matmul_l16 (gfc_array_l16 * const restrict retarray,
     {
       astride = a->dim[1].stride * a_kind;
       count = a->dim[1].ubound + 1 - a->dim[1].lbound;
-      xstride = a->dim[0].stride;
+      xstride = a->dim[0].stride * a_kind;
       xcount = a->dim[0].ubound + 1 - a->dim[0].lbound;
     }
   if (GFC_DESCRIPTOR_RANK (b) == 1)
@@ -167,7 +167,7 @@ matmul_l16 (gfc_array_l16 * const restrict retarray,
     {
       bstride = b->dim[0].stride * b_kind;
       assert(count == b->dim[0].ubound + 1 - b->dim[0].lbound);
-      ystride = b->dim[1].stride;
+      ystride = b->dim[1].stride * b_kind;
       ycount = b->dim[1].ubound + 1 - b->dim[1].lbound;
     }
 
index 531603b..9a6cb1d 100644 (file)
@@ -152,7 +152,7 @@ matmul_l4 (gfc_array_l4 * const restrict retarray,
     {
       astride = a->dim[1].stride * a_kind;
       count = a->dim[1].ubound + 1 - a->dim[1].lbound;
-      xstride = a->dim[0].stride;
+      xstride = a->dim[0].stride * a_kind;
       xcount = a->dim[0].ubound + 1 - a->dim[0].lbound;
     }
   if (GFC_DESCRIPTOR_RANK (b) == 1)
@@ -167,7 +167,7 @@ matmul_l4 (gfc_array_l4 * const restrict retarray,
     {
       bstride = b->dim[0].stride * b_kind;
       assert(count == b->dim[0].ubound + 1 - b->dim[0].lbound);
-      ystride = b->dim[1].stride;
+      ystride = b->dim[1].stride * b_kind;
       ycount = b->dim[1].ubound + 1 - b->dim[1].lbound;
     }
 
index 0b9b0be..7d4e35e 100644 (file)
@@ -152,7 +152,7 @@ matmul_l8 (gfc_array_l8 * const restrict retarray,
     {
       astride = a->dim[1].stride * a_kind;
       count = a->dim[1].ubound + 1 - a->dim[1].lbound;
-      xstride = a->dim[0].stride;
+      xstride = a->dim[0].stride * a_kind;
       xcount = a->dim[0].ubound + 1 - a->dim[0].lbound;
     }
   if (GFC_DESCRIPTOR_RANK (b) == 1)
@@ -167,7 +167,7 @@ matmul_l8 (gfc_array_l8 * const restrict retarray,
     {
       bstride = b->dim[0].stride * b_kind;
       assert(count == b->dim[0].ubound + 1 - b->dim[0].lbound);
-      ystride = b->dim[1].stride;
+      ystride = b->dim[1].stride * b_kind;
       ycount = b->dim[1].ubound + 1 - b->dim[1].lbound;
     }
 
index b488632..54afa8a 100644 (file)
@@ -154,7 +154,7 @@ sinclude(`matmul_asm_'rtype_code`.m4')dnl
     {
       astride = a->dim[1].stride * a_kind;
       count = a->dim[1].ubound + 1 - a->dim[1].lbound;
-      xstride = a->dim[0].stride;
+      xstride = a->dim[0].stride * a_kind;
       xcount = a->dim[0].ubound + 1 - a->dim[0].lbound;
     }
   if (GFC_DESCRIPTOR_RANK (b) == 1)
@@ -169,7 +169,7 @@ sinclude(`matmul_asm_'rtype_code`.m4')dnl
     {
       bstride = b->dim[0].stride * b_kind;
       assert(count == b->dim[0].ubound + 1 - b->dim[0].lbound);
-      ystride = b->dim[1].stride;
+      ystride = b->dim[1].stride * b_kind;
       ycount = b->dim[1].ubound + 1 - b->dim[1].lbound;
     }