re PR fortran/34566 (Matmul of logical values)
authorThomas Koenig <tkoenig@gcc.gnu.org>
Tue, 25 Dec 2007 10:12:41 +0000 (10:12 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Tue, 25 Dec 2007 10:12:41 +0000 (10:12 +0000)
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-25  Thomas Koenig  <tkoenig@gcc.gnu.org>

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

From-SVN: r131167

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 9f5aa260888d37918e2fb070f3e12f1bc050f2e4..4bfd5232c203c2360c02c0685411edc2f0274414 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 9d84e1bd5fa4d91cb13ecf4bd88ac4543beac17c..8f32ca04d7c823378fdc78431da73c40a8921326 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 c3cabdb090f20d401e12b87b5c5de485223edf77..b2b86ecfed176309e16aacf29f7685ea90b1462a 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 531603ba34ba0f4954d7ac055f4e1b8ff5c87520..9a6cb1d357ddf5dd11fe3bec367ccae7247781ea 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 0b9b0be6b51946a7028eb7c69c0e27ac3026df5d..7d4e35e82e3287df68d3176be25cb93e217fadab 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 b488632137ffddb8dd9aa34e4638bec49ebfb85f..54afa8a238eb44b44d26ec532cc15b5a95fadd38 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;
     }