blob: 580cb1ac9393c052f0b3f83c3484cd19d32925ca [file] [log] [blame]
! { dg-do run }
! { dg-options "-ffrontend-optimize -fdump-tree-optimized -Wrealloc-lhs -finline-matmul-limit=1000 -O" }
! PR 66094: Check functionality for MATMUL(TRANSPOSE(A),B)) for two-dimensional arrays
program main
implicit none
integer, parameter :: n = 3, m=4, cnt=2
real, dimension(cnt,n) :: a
real, dimension(cnt,m) :: b
real, dimension(n,m) :: c, cres
real, dimension(:,:), allocatable :: calloc
integer :: in, im, icnt
data a / 2., -3., 5., -7., 11., -13./
data b /17., -23., 29., -31., 37., -39., 41., -47./
data cres /103., 246., 486., 151., 362., 722., &
191., 458., 914., 223., 534., 1062./
c = matmul(transpose(a),b)
if (sum(c-cres)>1e-4) STOP 1
if (sum(c-cres)>1e-4) STOP 2
! Unallocated
calloc = matmul(transpose(a),b) ! { dg-warning "Code for reallocating the allocatable array" }
if (any(shape(c) /= shape(calloc))) STOP 3
if (sum(calloc-cres)>1e-4) STOP 4
deallocate(calloc)
! Allocated to wrong shape
allocate (calloc(10,10))
calloc = matmul(transpose(a),b) ! { dg-warning "Code for reallocating the allocatable array" }
if (any(shape(c) /= shape(calloc))) STOP 5
if (sum(calloc-cres)>1e-4) STOP 6
deallocate(calloc)
! cycle through a few test cases...
do in=2,10
do im = 2,10
do icnt = 2,10
block
real, dimension(icnt,in) :: a2
real, dimension(icnt,im) :: b2
real, dimension(in,im) :: c2,cr
integer :: i,j,k
call random_number(a2)
call random_number(b2)
c2 = 0
do i=1,size(a2,2)
do j=1, size(b2,2)
do k=1, size(a2,1)
c2(i,j) = c2(i,j) + a2(k,i) * b2(k,j)
end do
end do
end do
cr = matmul(transpose(a2), b2)
if (any(abs(c2-cr) > 1e-4)) STOP 7
end block
end do
end do
end do
end program main
! { dg-final { scan-tree-dump-times "_gfortran_matmul" 1 "optimized" } }