! RUN: %flang_fc1 -emit-hlfir %s -o - | FileCheck %s ! CHECK-LABEL: func @_QPmaxval_test( ! CHECK-SAME: %[[ARG0:.*]]: !fir.box>{{.*}}) -> i32 { integer function maxval_test(a) integer :: a(:) ! CHECK-DAG: %[[A:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %{{.*}} arg 1 {uniq_name = "_QFmaxval_testEa"} ! CHECK-DAG: %[[RES_ALLOCA:.*]] = fir.alloca i32 ! CHECK-DAG: %[[RES:.*]]:2 = hlfir.declare %[[RES_ALLOCA]] {uniq_name = "_QFmaxval_testEmaxval_test"} maxval_test = maxval(a) ! CHECK: %[[MAXVAL:.*]] = hlfir.maxval %[[A]]#0 {fastmath = #arith.fastmath} : (!fir.box>) -> i32 ! CHECK: hlfir.assign %[[MAXVAL]] to %[[RES]]#0 : i32, !fir.ref end function ! CHECK-LABEL: func @_QPmaxval_test2( ! CHECK-SAME: %[[ARG0:.*]]: !fir.ref>, %[[ARG1:.*]]: index, %[[ARG2:.*]]: !fir.box>> {fir.bindc_name = "a"}) -> !fir.boxchar<1> { character function maxval_test2(a) character :: a(:) ! CHECK-DAG: %[[A:.*]]:2 = hlfir.declare %[[ARG2]] typeparams %{{.*}} dummy_scope %{{.*}} arg 1 {uniq_name = "_QFmaxval_test2Ea"} ! CHECK-DAG: %[[RES:.*]]:2 = hlfir.declare %[[ARG0]] typeparams %{{.*}} {uniq_name = "_QFmaxval_test2Emaxval_test2"} maxval_test2 = maxval(a) ! CHECK: %[[MAXVAL:.*]] = hlfir.maxval %[[A]]#0 {fastmath = #arith.fastmath} : (!fir.box>>) -> !hlfir.expr> ! CHECK: hlfir.assign %[[MAXVAL]] to %[[RES]]#0 : !hlfir.expr>, !fir.ref> ! CHECK: hlfir.destroy %[[MAXVAL]] : !hlfir.expr> end function ! CHECK-LABEL: func @_QPmaxval_test3( ! CHECK-SAME: %[[ARG0:.*]]: !fir.box>{{.*}}, %[[ARG1:.*]]: !fir.box>{{.*}}) { subroutine maxval_test3(a,r) integer :: a(:,:) integer :: r(:) ! CHECK-DAG: %[[A:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %{{.*}} arg 1 {uniq_name = "_QFmaxval_test3Ea"} ! CHECK-DAG: %[[R:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %{{.*}} arg 2 {uniq_name = "_QFmaxval_test3Er"} ! CHECK-DAG: %[[C2:.*]] = arith.constant 2 : i32 r = maxval(a,dim=2) ! CHECK: %[[MAXVAL:.*]] = hlfir.maxval %[[A]]#0 dim %[[C2]] {fastmath = #arith.fastmath} : (!fir.box>, i32) -> !hlfir.expr ! CHECK: hlfir.assign %[[MAXVAL]] to %[[R]]#0 : !hlfir.expr, !fir.box> ! CHECK: hlfir.destroy %[[MAXVAL]] : !hlfir.expr end subroutine ! CHECK-LABEL: func @_QPtest_maxval_optional_scalar_mask( ! CHECK-SAME: %[[VAL_0:[^:]+]]: !fir.ref> {fir.bindc_name = "mask", fir.optional} subroutine test_maxval_optional_scalar_mask(mask, array) integer :: array(:) logical, optional :: mask print *, maxval(array, mask) ! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %{{.*}} arg 1 {fortran_attrs = #fir.var_attrs, ! CHECK: %[[IS_PRESENT:.*]] = fir.is_present %[[MASK]]#0 : (!fir.ref>) -> i1 ! CHECK: %[[EMBOX:.*]] = fir.embox %[[MASK]]#0 : (!fir.ref>) -> !fir.box> ! CHECK: %[[ABSENT:.*]] = fir.absent !fir.box> ! CHECK: %[[MASK_SEL:.*]] = arith.select %[[IS_PRESENT]], %[[EMBOX]], %[[ABSENT]] : !fir.box> ! CHECK: hlfir.maxval %{{.*}} mask %[[MASK_SEL]] {fastmath = #arith.fastmath} : (!fir.box>, !fir.box>) -> i32 end subroutine ! CHECK-LABEL: func @_QPtest_maxval_optional_array_mask( ! CHECK-SAME: %[[VAL_0:.*]]: !fir.box>> {fir.bindc_name = "mask", fir.optional} subroutine test_maxval_optional_array_mask(mask, array) integer :: array(:) logical, optional :: mask(:) print *, maxval(array, mask) ! CHECK-DAG: %[[MASK:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %{{.*}} arg 1 {fortran_attrs = #fir.var_attrs, ! CHECK: %[[IS_PRESENT:.*]] = fir.is_present %[[MASK]]#0 : (!fir.box>>) -> i1 ! CHECK: %[[ABSENT:.*]] = fir.absent !fir.box>> ! CHECK: %[[MASK_SEL:.*]] = arith.select %[[IS_PRESENT]], %[[MASK]]#1, %[[ABSENT]] : !fir.box>> ! CHECK: hlfir.maxval %{{.*}} mask %[[MASK_SEL]] {fastmath = #arith.fastmath} : (!fir.box>, !fir.box>>) -> i32 end subroutine