brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.3 KiB · 25442ae Raw
283 lines · plain
1! Test lowering of EOSHIFT intrinsic to HLFIR2! RUN: bbc -emit-hlfir -o - -I nowhere %s 2>&1 | FileCheck %s3 4module eoshift_types5  type t6  end type t7  type, extends(t) :: t28  end type t29end module eoshift_types10 11! 1d shift by scalar12subroutine eoshift1(a, s)13  integer :: a(:), s14  a = EOSHIFT(a, 2)15end subroutine16! CHECK-LABEL:   func.func @_QPeoshift1(17! CHECK-SAME:                          %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"},18! CHECK-SAME:                          %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}) {19! CHECK:           %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope20! CHECK:           %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]21! CHECK:           %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]22! CHECK:           %[[VAL_5:.*]] = arith.constant 2 : i3223! CHECK:           %[[VAL_6:.*]] = hlfir.eoshift %[[VAL_3]]#0 %[[VAL_5]] : (!fir.box<!fir.array<?xi32>>, i32) -> !hlfir.expr<?xi32>24! CHECK:           hlfir.assign %[[VAL_6]] to %[[VAL_3]]#0 : !hlfir.expr<?xi32>, !fir.box<!fir.array<?xi32>>25! CHECK:           hlfir.destroy %[[VAL_6]] : !hlfir.expr<?xi32>26! CHECK:           return27! CHECK:         }28 29! 1d shift by scalar with dim30subroutine eoshift2(a, s)31  integer :: a(:), s32  a = EOSHIFT(a, 2, dim=1)33end subroutine34! CHECK-LABEL:   func.func @_QPeoshift2(35! CHECK-SAME:                          %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"},36! CHECK-SAME:                          %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}) {37! CHECK:           %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope38! CHECK:           %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]39! CHECK:           %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]40! CHECK:           %[[VAL_5:.*]] = arith.constant 2 : i3241! CHECK:           %[[VAL_6:.*]] = arith.constant 1 : i3242! CHECK:           %[[VAL_7:.*]] = hlfir.eoshift %[[VAL_3]]#0 %[[VAL_5]] dim %[[VAL_6]] : (!fir.box<!fir.array<?xi32>>, i32, i32) -> !hlfir.expr<?xi32>43! CHECK:           hlfir.assign %[[VAL_7]] to %[[VAL_3]]#0 : !hlfir.expr<?xi32>, !fir.box<!fir.array<?xi32>>44! CHECK:           hlfir.destroy %[[VAL_7]] : !hlfir.expr<?xi32>45! CHECK:           return46! CHECK:         }47 48! 2d shift by scalar49subroutine eoshift3(a, s)50  integer :: a(:,:), s51  a = EOSHIFT(a, 2)52end subroutine53! CHECK-LABEL:   func.func @_QPeoshift3(54! CHECK-SAME:                          %[[VAL_0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "a"},55! CHECK-SAME:                          %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}) {56! CHECK:           %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope57! CHECK:           %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]58! CHECK:           %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]59! CHECK:           %[[VAL_5:.*]] = arith.constant 2 : i3260! CHECK:           %[[VAL_6:.*]] = hlfir.eoshift %[[VAL_3]]#0 %[[VAL_5]] : (!fir.box<!fir.array<?x?xi32>>, i32) -> !hlfir.expr<?x?xi32>61! CHECK:           hlfir.assign %[[VAL_6]] to %[[VAL_3]]#0 : !hlfir.expr<?x?xi32>, !fir.box<!fir.array<?x?xi32>>62! CHECK:           hlfir.destroy %[[VAL_6]] : !hlfir.expr<?x?xi32>63! CHECK:           return64! CHECK:         }65 66! 2d shift by scalar with dim67subroutine eoshift4(a, s)68  integer :: a(:,:), s69  a = EOSHIFT(a, 2, dim=2)70end subroutine71! CHECK-LABEL:   func.func @_QPeoshift4(72! CHECK-SAME:                          %[[VAL_0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "a"},73! CHECK-SAME:                          %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}) {74! CHECK:           %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope75! CHECK:           %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]76! CHECK:           %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]77! CHECK:           %[[VAL_5:.*]] = arith.constant 2 : i3278! CHECK:           %[[VAL_6:.*]] = arith.constant 2 : i3279! CHECK:           %[[VAL_7:.*]] = hlfir.eoshift %[[VAL_3]]#0 %[[VAL_5]] dim %[[VAL_6]] : (!fir.box<!fir.array<?x?xi32>>, i32, i32) -> !hlfir.expr<?x?xi32>80! CHECK:           hlfir.assign %[[VAL_7]] to %[[VAL_3]]#0 : !hlfir.expr<?x?xi32>, !fir.box<!fir.array<?x?xi32>>81! CHECK:           hlfir.destroy %[[VAL_7]] : !hlfir.expr<?x?xi32>82! CHECK:           return83! CHECK:         }84 85! 2d shift by array86subroutine eoshift5(a, s)87  integer :: a(:,:), s(:)88  a = EOSHIFT(a, s)89end subroutine90! CHECK-LABEL:   func.func @_QPeoshift5(91! CHECK-SAME:                          %[[VAL_0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "a"},92! CHECK-SAME:                          %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "s"}) {93! CHECK:           %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope94! CHECK:           %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]95! CHECK:           %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]96! CHECK:           %[[VAL_5:.*]] = hlfir.eoshift %[[VAL_3]]#0 %[[VAL_4]]#0 : (!fir.box<!fir.array<?x?xi32>>, !fir.box<!fir.array<?xi32>>) -> !hlfir.expr<?x?xi32>97! CHECK:           hlfir.assign %[[VAL_5]] to %[[VAL_3]]#0 : !hlfir.expr<?x?xi32>, !fir.box<!fir.array<?x?xi32>>98! CHECK:           hlfir.destroy %[[VAL_5]] : !hlfir.expr<?x?xi32>99! CHECK:           return100! CHECK:         }101 102! 2d shift by array expr103subroutine eoshift6(a, s)104  integer :: a(:,:), s(:)105  a = EOSHIFT(a, s + 1)106end subroutine107! CHECK-LABEL:   func.func @_QPeoshift6(108! CHECK-SAME:                          %[[VAL_0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "a"},109! CHECK-SAME:                          %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "s"}) {110! CHECK:           %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope111! CHECK:           %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]112! CHECK:           %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]113! CHECK:           %[[VAL_5:.*]] = arith.constant 1 : i32114! CHECK:           %[[VAL_6:.*]] = arith.constant 0 : index115! CHECK:           %[[VAL_7:.*]]:3 = fir.box_dims %[[VAL_4]]#0, %[[VAL_6]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)116! CHECK:           %[[VAL_8:.*]] = fir.shape %[[VAL_7]]#1 : (index) -> !fir.shape<1>117! CHECK:           %[[VAL_9:.*]] = hlfir.elemental %[[VAL_8]] unordered : (!fir.shape<1>) -> !hlfir.expr<?xi32>118! CHECK:           %[[VAL_14:.*]] = hlfir.eoshift %[[VAL_3]]#0 %[[VAL_9]] : (!fir.box<!fir.array<?x?xi32>>, !hlfir.expr<?xi32>) -> !hlfir.expr<?x?xi32>119! CHECK:           hlfir.assign %[[VAL_14]] to %[[VAL_3]]#0 : !hlfir.expr<?x?xi32>, !fir.box<!fir.array<?x?xi32>>120! CHECK:           hlfir.destroy %[[VAL_14]] : !hlfir.expr<?x?xi32>121! CHECK:           hlfir.destroy %[[VAL_9]] : !hlfir.expr<?xi32>122! CHECK:           return123! CHECK:         }124 125! 1d character(10,2) shift by scalar126subroutine eoshift7(a, s)127  character(10,2) :: a(:)128  a = EOSHIFT(a, 2)129end subroutine130! CHECK-LABEL:   func.func @_QPeoshift7(131! CHECK-SAME:                          %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.char<2,10>>> {fir.bindc_name = "a"},132! CHECK-SAME:                          %[[VAL_1:.*]]: !fir.ref<f32> {fir.bindc_name = "s"}) {133! CHECK:           %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope134! CHECK:           %[[VAL_3:.*]] = arith.constant 10 : index135! CHECK:           %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_0]]136! CHECK:           %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_1]]137! CHECK:           %[[VAL_6:.*]] = arith.constant 2 : i32138! CHECK:           %[[VAL_7:.*]] = hlfir.eoshift %[[VAL_4]]#0 %[[VAL_6]] : (!fir.box<!fir.array<?x!fir.char<2,10>>>, i32) -> !hlfir.expr<?x!fir.char<2,10>>139! CHECK:           hlfir.assign %[[VAL_7]] to %[[VAL_4]]#0 : !hlfir.expr<?x!fir.char<2,10>>, !fir.box<!fir.array<?x!fir.char<2,10>>>140! CHECK:           hlfir.destroy %[[VAL_7]] : !hlfir.expr<?x!fir.char<2,10>>141! CHECK:           return142! CHECK:         }143 144! 1d character(*) shift by scalar145subroutine eoshift8(a, s)146  character(*) :: a(:)147  a = EOSHIFT(a, 2)148end subroutine149! CHECK-LABEL:   func.func @_QPeoshift8(150! CHECK-SAME:                          %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.char<1,?>>> {fir.bindc_name = "a"},151! CHECK-SAME:                          %[[VAL_1:.*]]: !fir.ref<f32> {fir.bindc_name = "s"}) {152! CHECK:           %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope153! CHECK:           %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]154! CHECK:           %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]155! CHECK:           %[[VAL_5:.*]] = arith.constant 2 : i32156! CHECK:           %[[VAL_6:.*]] = hlfir.eoshift %[[VAL_3]]#0 %[[VAL_5]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>, i32) -> !hlfir.expr<?x!fir.char<1,?>>157! CHECK:           hlfir.assign %[[VAL_6]] to %[[VAL_3]]#0 : !hlfir.expr<?x!fir.char<1,?>>, !fir.box<!fir.array<?x!fir.char<1,?>>>158! CHECK:           hlfir.destroy %[[VAL_6]] : !hlfir.expr<?x!fir.char<1,?>>159! CHECK:           return160! CHECK:         }161 162! 1d type(t) shift by scalar163subroutine eoshift9(a, s)164  use eoshift_types165  type(t) :: a(:)166  a = EOSHIFT(a, 2, boundary=t())167end subroutine168! CHECK-LABEL:   func.func @_QPeoshift9(169! CHECK-SAME:      %[[ARG0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMeoshift_typesTt>>> {fir.bindc_name = "a"},170! CHECK-SAME:      %[[ARG1:.*]]: !fir.ref<f32> {fir.bindc_name = "s"}) {171! CHECK:           %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope172! CHECK:           %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg {{[0-9]+}} {uniq_name = "_QFeoshift9Ea"} : (!fir.box<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>, !fir.dscope) -> (!fir.box<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>, !fir.box<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>)173! CHECK:           %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg {{[0-9]+}} {uniq_name = "_QFeoshift9Es"} : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)174! CHECK:           %[[VAL_3:.*]] = arith.constant 2 : i32175! CHECK:           %[[VAL_4:.*]] = fir.address_of(@_QQro._QMeoshift_typesTt.0) : !fir.ref<!fir.type<_QMeoshift_typesTt>>176! CHECK:           %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_4]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro._QMeoshift_typesTt.0"} : (!fir.ref<!fir.type<_QMeoshift_typesTt>>) -> (!fir.ref<!fir.type<_QMeoshift_typesTt>>, !fir.ref<!fir.type<_QMeoshift_typesTt>>)177! CHECK:           %[[VAL_6:.*]] = hlfir.eoshift %[[VAL_1]]#0 %[[VAL_3]] boundary %[[VAL_5]]#0 : (!fir.box<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>, i32, !fir.ref<!fir.type<_QMeoshift_typesTt>>) -> !hlfir.expr<?x!fir.type<_QMeoshift_typesTt>>178! CHECK:           hlfir.assign %[[VAL_6]] to %[[VAL_1]]#0 : !hlfir.expr<?x!fir.type<_QMeoshift_typesTt>>, !fir.box<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>179! CHECK:           hlfir.destroy %[[VAL_6]] : !hlfir.expr<?x!fir.type<_QMeoshift_typesTt>>180! CHECK:           return181! CHECK:         }182 183! 1d class(t) shift by scalar184subroutine eoshift10(a, s)185  use eoshift_types186  class(t), allocatable :: a(:)187  a = EOSHIFT(a, 2, boundary=t())188end subroutine189! CHECK-LABEL:   func.func @_QPeoshift10(190! CHECK-SAME:      %[[ARG0:.*]]: !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>>> {fir.bindc_name = "a"},191! CHECK-SAME:      %[[ARG1:.*]]: !fir.ref<f32> {fir.bindc_name = "s"}) {192! CHECK:           %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope193! CHECK:           %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg {{[0-9]+}} {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFeoshift10Ea"} : (!fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>>>, !fir.dscope) -> (!fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>>>, !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>>>)194! CHECK:           %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg {{[0-9]+}} {uniq_name = "_QFeoshift10Es"} : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)195! CHECK:           %[[VAL_3:.*]] = arith.constant 2 : i32196! CHECK:           %[[VAL_4:.*]] = fir.address_of(@_QQro._QMeoshift_typesTt.1) : !fir.ref<!fir.type<_QMeoshift_typesTt>>197! CHECK:           %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_4]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro._QMeoshift_typesTt.1"} : (!fir.ref<!fir.type<_QMeoshift_typesTt>>) -> (!fir.ref<!fir.type<_QMeoshift_typesTt>>, !fir.ref<!fir.type<_QMeoshift_typesTt>>)198! CHECK:           %[[VAL_6:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>>>199! CHECK:           %[[VAL_7:.*]] = hlfir.eoshift %[[VAL_6]] %[[VAL_3]] boundary %[[VAL_5]]#0 : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>>, i32, !fir.ref<!fir.type<_QMeoshift_typesTt>>) -> !hlfir.expr<?x!fir.type<_QMeoshift_typesTt>?>200! CHECK:           hlfir.assign %[[VAL_7]] to %[[VAL_1]]#0 realloc : !hlfir.expr<?x!fir.type<_QMeoshift_typesTt>?>, !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>>>201! CHECK:           hlfir.destroy %[[VAL_7]] : !hlfir.expr<?x!fir.type<_QMeoshift_typesTt>?>202! CHECK:           return203! CHECK:         }204 205! 1d shift by scalar with variable dim206subroutine eoshift11(a, s, d)207  integer :: a(:), s, d208  a = EOSHIFT(a, 2, dim=d)209end subroutine210! CHECK-LABEL:   func.func @_QPeoshift11(211! CHECK-SAME:                           %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"},212! CHECK-SAME:                           %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"},213! CHECK-SAME:                           %[[VAL_2:.*]]: !fir.ref<i32> {fir.bindc_name = "d"}) {214! CHECK:           %[[VAL_3:.*]] = fir.dummy_scope : !fir.dscope215! CHECK:           %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %[[VAL_3]] arg {{[0-9]+}} {uniq_name = "_QFeoshift11Ea"} : (!fir.box<!fir.array<?xi32>>, !fir.dscope) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)216! CHECK:           %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_2]] dummy_scope %[[VAL_3]] arg {{[0-9]+}} {uniq_name = "_QFeoshift11Ed"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)217! CHECK:           %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_1]] dummy_scope %[[VAL_3]] arg {{[0-9]+}} {uniq_name = "_QFeoshift11Es"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)218! CHECK:           %[[VAL_7:.*]] = arith.constant 2 : i32219! CHECK:           %[[VAL_8:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<i32>220! CHECK:           %[[VAL_9:.*]] = hlfir.eoshift %[[VAL_4]]#0 %[[VAL_7]] dim %[[VAL_8]] : (!fir.box<!fir.array<?xi32>>, i32, i32) -> !hlfir.expr<?xi32>221! CHECK:           hlfir.assign %[[VAL_9]] to %[[VAL_4]]#0 : !hlfir.expr<?xi32>, !fir.box<!fir.array<?xi32>>222! CHECK:           hlfir.destroy %[[VAL_9]] : !hlfir.expr<?xi32>223! CHECK:           return224! CHECK:         }225 226subroutine eoshift12(array, shift, boundary, dim)227  real :: array(:,:)228  real, optional :: boundary229  integer :: shift(:), dim230  array = EOSHIFT(array, shift, boundary, dim)231end subroutine eoshift12232! CHECK-LABEL:   func.func @_QPeoshift12(233! CHECK-SAME:      %[[ARG0:.*]]: !fir.box<!fir.array<?x?xf32>> {fir.bindc_name = "array"},234! CHECK-SAME:      %[[ARG1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "shift"},235! CHECK-SAME:      %[[ARG2:.*]]: !fir.ref<f32> {fir.bindc_name = "boundary", fir.optional},236! CHECK-SAME:      %[[ARG3:.*]]: !fir.ref<i32> {fir.bindc_name = "dim"}) {237! CHECK:           %[[VAL_0:.*]] = fir.dummy_scope : !fir.dscope238! CHECK:           %[[VAL_1:.*]]:2 = hlfir.declare %[[ARG0]] dummy_scope %[[VAL_0]] arg {{[0-9]+}} {uniq_name = "_QFeoshift12Earray"} : (!fir.box<!fir.array<?x?xf32>>, !fir.dscope) -> (!fir.box<!fir.array<?x?xf32>>, !fir.box<!fir.array<?x?xf32>>)239! CHECK:           %[[VAL_2:.*]]:2 = hlfir.declare %[[ARG2]] dummy_scope %[[VAL_0]] arg {{[0-9]+}} {fortran_attrs = #fir.var_attrs<optional>, uniq_name = "_QFeoshift12Eboundary"} : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)240! CHECK:           %[[VAL_3:.*]]:2 = hlfir.declare %[[ARG3]] dummy_scope %[[VAL_0]] arg {{[0-9]+}} {uniq_name = "_QFeoshift12Edim"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)241! CHECK:           %[[VAL_4:.*]]:2 = hlfir.declare %[[ARG1]] dummy_scope %[[VAL_0]] arg {{[0-9]+}} {uniq_name = "_QFeoshift12Eshift"} : (!fir.box<!fir.array<?xi32>>, !fir.dscope) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)242! CHECK:           %[[VAL_5:.*]] = fir.is_present %[[VAL_2]]#0 : (!fir.ref<f32>) -> i1243! CHECK:           %[[VAL_6:.*]] = fir.embox %[[VAL_2]]#0 : (!fir.ref<f32>) -> !fir.box<f32>244! CHECK:           %[[VAL_7:.*]] = fir.absent !fir.box<f32>245! CHECK:           %[[VAL_8:.*]] = arith.select %[[VAL_5]], %[[VAL_6]], %[[VAL_7]] : !fir.box<f32>246! CHECK:           %[[VAL_9:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<i32>247! CHECK:           %[[VAL_10:.*]] = hlfir.eoshift %[[VAL_1]]#0 %[[VAL_4]]#0 boundary %[[VAL_8]] dim %[[VAL_9]] : (!fir.box<!fir.array<?x?xf32>>, !fir.box<!fir.array<?xi32>>, !fir.box<f32>, i32) -> !hlfir.expr<?x?xf32>248! CHECK:           hlfir.assign %[[VAL_10]] to %[[VAL_1]]#0 : !hlfir.expr<?x?xf32>, !fir.box<!fir.array<?x?xf32>>249! CHECK:           hlfir.destroy %[[VAL_10]] : !hlfir.expr<?x?xf32>250! CHECK:           return251! CHECK:         }252 253! Test scalar logical boundary.254! CHECK-LABEL:   func.func @_QPeoshift13(255subroutine eoshift13(array)256  logical(1) :: array(:)257  array = EOSHIFT(array, -1, .true._1)258! CHECK:           %[[VAL_5:.*]] = hlfir.eoshift %{{.*}} %{{.*}} boundary %{{.*}} : (!fir.box<!fir.array<?x!fir.logical<1>>>, i32, !fir.logical<1>) -> !hlfir.expr<?x!fir.logical<1>>259  array = EOSHIFT(array.EQV..false., -1, .true.)260! CHECK:           %[[VAL_24:.*]] = hlfir.eoshift %{{.*}} %{{.*}} boundary %{{.*}} : (!hlfir.expr<?x!fir.logical<4>>, i32, !fir.logical<4>) -> !hlfir.expr<?x!fir.logical<4>>261end subroutine eoshift13262 263! Test scalar constant BOUNDARY value of UNSIGNED type.264! The BOUNDARY operand of hlfir.eoshift must have ui32 type265! (i.e. consistent with the array/result type).266! CHECK-LABEL:   func.func @_QPeoshift14(267subroutine eoshift14(array)268  unsigned :: array(:)269  array = EOSHIFT(array, shift=1, boundary=1u)270! CHECK-DAG:           %[[VAL_4:.*]] = fir.convert %[[VAL_3:.*]] : (i32) -> ui32271! CHECK-DAG:           %[[VAL_3]] = arith.constant 1 : i32272! CHECK:           %[[VAL_5:.*]] = hlfir.eoshift{{.*}}boundary %[[VAL_4]] : (!fir.box<!fir.array<?xui32>>, i32, ui32) -> !hlfir.expr<?xui32>273end subroutine eoshift14274 275! CHECK-LABEL:   func.func @_QPeoshift15(276subroutine eoshift15(array, boundary)277  use eoshift_types278  class(t), allocatable :: array(:,:)279  type(t) :: boundary(:)280  array = eoshift(array, shift=1, boundary=boundary)281! CHECK:           hlfir.eoshift %{{.*}} %{{.*}} boundary %{{.*}}#0 : (!fir.class<!fir.heap<!fir.array<?x?x!fir.type<_QMeoshift_typesTt>>>>, i32, !fir.box<!fir.array<?x!fir.type<_QMeoshift_typesTt>>>) -> !hlfir.expr<?x?x!fir.type<_QMeoshift_typesTt>?>282end subroutine eoshift15283