--- /dev/null
+! { 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