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