| ! { dg-do compile } |
| ! { dg-additional-options "-O -fdump-tree-original" } |
| ! { dg-final { scan-tree-dump-not "gfortran_\[sm\]?minloc" "original" } } |
| ! { dg-final { scan-tree-dump-not "gfortran_\[sm\]?maxloc" "original" } } |
| ! |
| ! PR fortran/90608 |
| ! Check that all MINLOC and MAXLOC calls are inlined with optimizations, |
| ! when ARRAY is of integral type, DIM is a constant, and MASK is a scalar. |
| |
| subroutine check_maxloc |
| implicit none |
| integer, parameter :: data60(*) = (/ 2, 5, 4, 6, 0, 9, 3, 5, 4, 4, & |
| 1, 7, 3, 2, 1, 2, 5, 4, 6, 0, & |
| 9, 3, 5, 4, 4, 1, 7, 3, 2, 1, & |
| 2, 5, 4, 6, 0, 9, 3, 5, 4, 4, & |
| 1, 7, 3, 2, 1, 2, 5, 4, 6, 0, & |
| 9, 3, 5, 4, 4, 1, 7, 3, 2, 1 /) |
| integer, parameter :: data1(*) = (/ 2, 3, 2, 3, & |
| 1, 2, 3, 2, & |
| 3, 1, 2, 3, & |
| 2, 3, 1, 2, & |
| 3, 2, 3, 1 /) |
| integer, parameter :: data2(*) = (/ 2, 1, 2, & |
| 3, 2, 3, & |
| 4, 3, 4, & |
| 2, 1, 2, & |
| 1, 2, 1 /) |
| integer, parameter :: data3(*) = (/ 5, 1, 5, & |
| 1, 2, 1, & |
| 2, 1, 2, & |
| 3, 2, 3 /) |
| call check_int_const_shape_rank_3_true_mask |
| call check_int_const_shape_rank_3_false_mask |
| call check_int_alloc_rank_3_true_mask |
| call check_int_alloc_rank_3_false_mask |
| contains |
| subroutine check_int_const_shape_rank_3_true_mask() |
| integer :: a(3,4,5) |
| integer, allocatable :: r(:,:) |
| a = reshape(data60, shape(a)) |
| r = maxloc(a, dim = 1, mask = .true.) |
| if (any(shape(r) /= (/ 4, 5 /))) error stop 21 |
| if (any(r /= reshape(data1, (/ 4, 5 /)))) error stop 22 |
| r = maxloc(a, dim = 2, mask = .true.) |
| if (any(shape(r) /= (/ 3, 5 /))) error stop 23 |
| if (any(r /= reshape(data2, (/ 3, 5 /)))) error stop 24 |
| r = maxloc(a, dim = 3, mask = .true.) |
| if (any(shape(r) /= (/ 3, 4 /))) error stop 25 |
| if (any(r /= reshape(data3, (/ 3, 4 /)))) error stop 26 |
| end subroutine |
| subroutine check_int_const_shape_rank_3_false_mask() |
| integer :: a(3,4,5) |
| integer, allocatable :: r(:,:) |
| a = reshape(data60, shape(a)) |
| r = maxloc(a, dim = 1, mask = .false.) |
| if (any(shape(r) /= (/ 4, 5 /))) error stop 31 |
| if (any(r /= 0)) error stop 32 |
| r = maxloc(a, dim = 2, mask = .false.) |
| if (any(shape(r) /= (/ 3, 5 /))) error stop 33 |
| if (any(r /= 0)) error stop 34 |
| r = maxloc(a, dim = 3, mask = .false.) |
| if (any(shape(r) /= (/ 3, 4 /))) error stop 35 |
| if (any(r /= 0)) error stop 36 |
| end subroutine |
| subroutine check_int_alloc_rank_3_true_mask() |
| integer, allocatable :: a(:,:,:) |
| integer, allocatable :: r(:,:) |
| allocate(a(3,4,5)) |
| a(:,:,:) = reshape(data60, shape(a)) |
| r = maxloc(a, dim = 1, mask = .true.) |
| if (any(shape(r) /= (/ 4, 5 /))) error stop 81 |
| if (any(r /= reshape(data1, (/ 4, 5 /)))) error stop 82 |
| r = maxloc(a, dim = 2, mask = .true.) |
| if (any(shape(r) /= (/ 3, 5 /))) error stop 83 |
| if (any(r /= reshape(data2, (/ 3, 5 /)))) error stop 84 |
| r = maxloc(a, dim = 3, mask = .true.) |
| if (any(shape(r) /= (/ 3, 4 /))) error stop 85 |
| if (any(r /= reshape(data3, (/ 3, 4 /)))) error stop 86 |
| end subroutine |
| subroutine check_int_alloc_rank_3_false_mask() |
| integer, allocatable :: a(:,:,:) |
| integer, allocatable :: r(:,:) |
| allocate(a(3,4,5)) |
| a(:,:,:) = reshape(data60, shape(a)) |
| r = maxloc(a, dim = 1, mask = .false.) |
| if (any(shape(r) /= (/ 4, 5 /))) error stop 91 |
| if (any(r /= 0)) error stop 92 |
| r = maxloc(a, dim = 2, mask = .false.) |
| if (any(shape(r) /= (/ 3, 5 /))) error stop 93 |
| if (any(r /= 0)) error stop 94 |
| r = maxloc(a, dim = 3, mask = .false.) |
| if (any(shape(r) /= (/ 3, 4 /))) error stop 95 |
| if (any(r /= 0)) error stop 96 |
| end subroutine |
| end subroutine |
| |
| subroutine check_minloc |
| implicit none |
| integer, parameter :: data60(*) = (/ 7, 4, 5, 3, 9, 0, 6, 4, 5, 5, & |
| 8, 2, 6, 7, 8, 7, 4, 5, 3, 9, & |
| 0, 6, 4, 5, 5, 8, 2, 6, 7, 8, & |
| 7, 4, 5, 3, 9, 0, 6, 4, 5, 5, & |
| 8, 2, 6, 7, 8, 7, 4, 5, 3, 9, & |
| 0, 6, 4, 5, 5, 8, 2, 6, 7, 8 /) |
| integer, parameter :: data1(*) = (/ 2, 3, 2, 3, & |
| 1, 2, 3, 2, & |
| 3, 1, 2, 3, & |
| 2, 3, 1, 2, & |
| 3, 2, 3, 1 /) |
| integer, parameter :: data2(*) = (/ 2, 1, 2, & |
| 3, 2, 3, & |
| 4, 3, 4, & |
| 2, 1, 2, & |
| 1, 2, 1 /) |
| integer, parameter :: data3(*) = (/ 5, 1, 5, & |
| 1, 2, 1, & |
| 2, 1, 2, & |
| 3, 2, 3 /) |
| call check_int_const_shape_rank_3_true_mask |
| call check_int_const_shape_rank_3_false_mask |
| call check_int_alloc_rank_3_true_mask |
| call check_int_alloc_rank_3_false_mask |
| contains |
| subroutine check_int_const_shape_rank_3_true_mask() |
| integer :: a(3,4,5) |
| integer, allocatable :: r(:,:) |
| a = reshape(data60, shape(a)) |
| r = minloc(a, dim = 1, mask = .true.) |
| if (any(shape(r) /= (/ 4, 5 /))) error stop 121 |
| if (any(r /= reshape(data1, (/ 4, 5 /)))) error stop 122 |
| r = minloc(a, dim = 2, mask = .true.) |
| if (any(shape(r) /= (/ 3, 5 /))) error stop 123 |
| if (any(r /= reshape(data2, (/ 3, 5 /)))) error stop 124 |
| r = minloc(a, dim = 3, mask = .true.) |
| if (any(shape(r) /= (/ 3, 4 /))) error stop 125 |
| if (any(r /= reshape(data3, (/ 3, 4 /)))) error stop 126 |
| end subroutine |
| subroutine check_int_const_shape_rank_3_false_mask() |
| integer :: a(3,4,5) |
| integer, allocatable :: r(:,:) |
| a = reshape(data60, shape(a)) |
| r = minloc(a, dim = 1, mask = .false.) |
| if (any(shape(r) /= (/ 4, 5 /))) error stop 131 |
| if (any(r /= 0)) error stop 132 |
| r = minloc(a, dim = 2, mask = .false.) |
| if (any(shape(r) /= (/ 3, 5 /))) error stop 133 |
| if (any(r /= 0)) error stop 134 |
| r = minloc(a, dim = 3, mask = .false.) |
| if (any(shape(r) /= (/ 3, 4 /))) error stop 135 |
| if (any(r /= 0)) error stop 136 |
| end subroutine |
| subroutine check_int_alloc_rank_3_true_mask() |
| integer, allocatable :: a(:,:,:) |
| integer, allocatable :: r(:,:) |
| allocate(a(3,4,5)) |
| a(:,:,:) = reshape(data60, shape(a)) |
| r = minloc(a, dim = 1, mask = .true.) |
| if (any(shape(r) /= (/ 4, 5 /))) error stop 181 |
| if (any(r /= reshape(data1, (/ 4, 5 /)))) error stop 182 |
| r = minloc(a, dim = 2, mask = .true.) |
| if (any(shape(r) /= (/ 3, 5 /))) error stop 183 |
| if (any(r /= reshape(data2, (/ 3, 5 /)))) error stop 184 |
| r = minloc(a, dim = 3, mask = .true.) |
| if (any(shape(r) /= (/ 3, 4 /))) error stop 185 |
| if (any(r /= reshape(data3, (/ 3, 4 /)))) error stop 186 |
| end subroutine |
| subroutine check_int_alloc_rank_3_false_mask() |
| integer, allocatable :: a(:,:,:) |
| integer, allocatable :: r(:,:) |
| allocate(a(3,4,5)) |
| a(:,:,:) = reshape(data60, shape(a)) |
| r = minloc(a, dim = 1, mask = .false.) |
| if (any(shape(r) /= (/ 4, 5 /))) error stop 191 |
| if (any(r /= 0)) error stop 192 |
| r = minloc(a, dim = 2, mask = .false.) |
| if (any(shape(r) /= (/ 3, 5 /))) error stop 193 |
| if (any(r /= 0)) error stop 194 |
| r = minloc(a, dim = 3, mask = .false.) |
| if (any(shape(r) /= (/ 3, 4 /))) error stop 195 |
| if (any(r /= 0)) error stop 196 |
| end subroutine |
| end subroutine |