C { dg-do run } C { dg-options "-fcheck=bounds -fdump-tree-optimized -fblas-matmul-limit=1 -O -fexternal-blas" } C { dg-additional-sources blas_gemm_routines.f } C Test calling of BLAS routines program main call sub_s call sub_d call sub_c call sub_z end subroutine sub_d implicit none real(8), dimension(3,2) :: a real(8), dimension(2,3) :: at real(8), dimension(2,4) :: b real(8), dimension(4,2) :: bt real(8), dimension(3,4) :: c real(8), dimension(3,4) :: cres real(8), dimension(:,:), allocatable :: c_alloc data a / 2., -3., 5., -7., 11., -13./ data b /17., -23., 29., -31., 37., -39., 41., -47./ data cres /195., -304., 384., 275., -428., 548., 347., -540., & 692., 411., -640., 816./ c = matmul(a,b) if (any (c /= cres)) stop 31 at = transpose(a) c = (1.2,-2.2) c = matmul(transpose(at), b) if (any (c /= cres)) stop 32 bt = transpose(b) c = (1.2,-2.1) c = matmul(a, transpose(bt)) if (any (c /= cres)) stop 33 c_alloc = matmul(a,b) if (any (c /= cres)) stop 34 at = transpose(a) deallocate (c_alloc) c = matmul(transpose(at), b) if (any (c /= cres)) stop 35 bt = transpose(b) allocate (c_alloc(20,20)) c = (1.2,-2.1) c = matmul(a, transpose(bt)) if (any (c /= cres)) stop 36 end subroutine sub_s implicit none real, dimension(3,2) :: a real, dimension(2,3) :: at real, dimension(2,4) :: b real, dimension(4,2) :: bt real, dimension(3,4) :: c real, dimension(3,4) :: cres real, dimension(:,:), allocatable :: c_alloc data a / 2., -3., 5., -7., 11., -13./ data b /17., -23., 29., -31., 37., -39., 41., -47./ data cres /195., -304., 384., 275., -428., 548., 347., -540., & 692., 411., -640., 816./ c = matmul(a,b) if (any (c /= cres)) stop 21 at = transpose(a) c = (1.2,-2.2) c = matmul(transpose(at), b) if (any (c /= cres)) stop 22 bt = transpose(b) c = (1.2,-2.1) c = matmul(a, transpose(bt)) if (any (c /= cres)) stop 23 c_alloc = matmul(a,b) if (any (c /= cres)) stop 24 at = transpose(a) deallocate (c_alloc) c = matmul(transpose(at), b) if (any (c /= cres)) stop 25 bt = transpose(b) allocate (c_alloc(20,20)) c = (1.2,-2.1) c = matmul(a, transpose(bt)) if (any (c /= cres)) stop 26 end subroutine sub_c implicit none complex, dimension(3,2) :: a complex, dimension(2,3) :: at, ah complex, dimension(2,4) :: b complex, dimension(4,2) :: bt, bh complex, dimension(3,4) :: c complex, dimension(3,4) :: cres complex, dimension(:,:), allocatable :: c_alloc data a / (2.,-3.), (-5.,7.), (11.,-13.), (17.,19), (-23., -29), & (-31., 37.)/ data b / (-41., 43.), (-47., 53.), (-59.,-61.), (-67., 71), & ( 73.,79. ), (83.,-89.), (97.,-101.), (-107.,-109.)/ data cres /(-1759.,217.), (2522.,-358.), (-396.,-2376.), & (-2789.,-11.), & (4322.,202.), (-1992.,-4584.), (3485.,3.), (-5408.,-244.), & (2550.,5750.), (143.,-4379.), (-478.,6794.), (7104.,-2952.) / c = matmul(a,b) if (any (c /= cres)) stop 1 at = transpose(a) c = (1.2,-2.2) c = matmul(transpose(at), b) if (any (c /= cres)) stop 2 bt = transpose(b) c = (1.2,-2.1) c = matmul(a, transpose(bt)) if (any (c /= cres)) stop 3 ah = transpose(conjg(a)) c = (1.2,-2.2) c = matmul(conjg(transpose(ah)), b) if (any (c /= cres)) stop 4 bh = transpose(conjg(b)) c = (1.2,-2.2) c = matmul(a, transpose(conjg(bh))) if (any (c /= cres)) stop 5 c_alloc = matmul(a,b) if (any (c /= cres)) stop 6 at = transpose(a) deallocate (c_alloc) c = matmul(transpose(at), b) if (any (c /= cres)) stop 7 bt = transpose(b) allocate (c_alloc(20,20)) c = (1.2,-2.1) c = matmul(a, transpose(bt)) if (any (c /= cres)) stop 8 ah = transpose(conjg(a)) c = (1.2,-2.2) c = matmul(conjg(transpose(ah)), b) if (any (c /= cres)) stop 9 deallocate (c_alloc) allocate (c_alloc(0,0)) bh = transpose(conjg(b)) c = (1.2,-2.2) c = matmul(a, transpose(conjg(bh))) if (any (c /= cres)) stop 10 end subroutine sub_z implicit none complex(8), dimension(3,2) :: a complex(8), dimension(2,3) :: at, ah complex(8), dimension(2,4) :: b complex(8), dimension(4,2) :: bt, bh complex(8), dimension(3,4) :: c complex(8), dimension(3,4) :: cres complex(8), dimension(:,:), allocatable :: c_alloc data a / (2.,-3.), (-5._8,7.), (11.,-13.), (17.,19), & (-23., -29), (-31., 37.)/ data b / (-41., 43.), (-47., 53.), (-59.,-61.), (-67., 71), & ( 73.,79. ), (83.,-89.), (97.,-101.), (-107.,-109.)/ data cres /(-1759.,217.), (2522.,-358.), (-396.,-2376.), & (-2789.,-11.), & (4322.,202.), (-1992.,-4584.), (3485.,3.), (-5408.,-244.), & (2550.,5750.), (143.,-4379.), (-478.,6794.), (7104.,-2952.) / c = matmul(a,b) if (any (c /= cres)) stop 11 at = transpose(a) c = (1.2,-2.2) c = matmul(transpose(at), b) if (any (c /= cres)) stop 12 bt = transpose(b) c = (1.2,-2.1) c = matmul(a, transpose(bt)) if (any (c /= cres)) stop 13 ah = transpose(conjg(a)) c = (1.2,-2.2) c = matmul(conjg(transpose(ah)), b) if (any (c /= cres)) stop 14 bh = transpose(conjg(b)) c = (1.2,-2.2) c = matmul(a, transpose(conjg(bh))) if (any (c /= cres)) stop 15 c_alloc = matmul(a,b) if (any (c /= cres)) stop 16 at = transpose(a) deallocate (c_alloc) c = matmul(transpose(at), b) if (any (c /= cres)) stop 17 bt = transpose(b) allocate (c_alloc(20,20)) c = (1.2,-2.1) c = matmul(a, transpose(bt)) if (any (c /= cres)) stop 18 ah = transpose(conjg(a)) c = (1.2,-2.2) c = matmul(conjg(transpose(ah)), b) if (any (c /= cres)) stop 19 deallocate (c_alloc) allocate (c_alloc(0,0)) bh = transpose(conjg(b)) c = (1.2,-2.2) c = matmul(a, transpose(conjg(bh))) if (any (c /= cres)) stop 20 end ! { dg-final { scan-tree-dump-times "_gfortran_matmul" 0 "optimized" } }