219 lines · plain
1! Test lowering of CSHIFT intrinsic to HLFIR2! RUN: bbc -emit-hlfir -o - -I nowhere %s 2>&1 | FileCheck %s3 4module types5 type t6 end type t7end module types8 9! 1d shift by scalar10subroutine cshift1(a, s)11 integer :: a(:), s12 a = CSHIFT(a, 2)13end subroutine14! CHECK-LABEL: func.func @_QPcshift1(15! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"},16! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}) {17! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope18! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]19! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]20! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i3221! CHECK: %[[VAL_6:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_5]] : (!fir.box<!fir.array<?xi32>>, i32) -> !hlfir.expr<?xi32>22! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_3]]#0 : !hlfir.expr<?xi32>, !fir.box<!fir.array<?xi32>>23! CHECK: hlfir.destroy %[[VAL_6]] : !hlfir.expr<?xi32>24! CHECK: return25! CHECK: }26 27! 1d shift by scalar with dim28subroutine cshift2(a, s)29 integer :: a(:), s30 a = CSHIFT(a, 2, 1)31end subroutine32! CHECK-LABEL: func.func @_QPcshift2(33! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"},34! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}) {35! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope36! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]37! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]38! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i3239! CHECK: %[[VAL_6:.*]] = arith.constant 1 : i3240! CHECK: %[[VAL_7:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_5]] dim %[[VAL_6]] : (!fir.box<!fir.array<?xi32>>, i32, i32) -> !hlfir.expr<?xi32>41! CHECK: hlfir.assign %[[VAL_7]] to %[[VAL_3]]#0 : !hlfir.expr<?xi32>, !fir.box<!fir.array<?xi32>>42! CHECK: hlfir.destroy %[[VAL_7]] : !hlfir.expr<?xi32>43! CHECK: return44! CHECK: }45 46! 2d shift by scalar47subroutine cshift3(a, s)48 integer :: a(:,:), s49 a = CSHIFT(a, 2)50end subroutine51! CHECK-LABEL: func.func @_QPcshift3(52! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "a"},53! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}) {54! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope55! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]56! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]57! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i3258! CHECK: %[[VAL_6:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_5]] : (!fir.box<!fir.array<?x?xi32>>, i32) -> !hlfir.expr<?x?xi32>59! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_3]]#0 : !hlfir.expr<?x?xi32>, !fir.box<!fir.array<?x?xi32>>60! CHECK: hlfir.destroy %[[VAL_6]] : !hlfir.expr<?x?xi32>61! CHECK: return62! CHECK: }63 64! 2d shift by scalar with dim65subroutine cshift4(a, s)66 integer :: a(:,:), s67 a = CSHIFT(a, 2, 2)68end subroutine69! CHECK-LABEL: func.func @_QPcshift4(70! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "a"},71! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"}) {72! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope73! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]74! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]75! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i3276! CHECK: %[[VAL_6:.*]] = arith.constant 2 : i3277! CHECK: %[[VAL_7:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_5]] dim %[[VAL_6]] : (!fir.box<!fir.array<?x?xi32>>, i32, i32) -> !hlfir.expr<?x?xi32>78! CHECK: hlfir.assign %[[VAL_7]] to %[[VAL_3]]#0 : !hlfir.expr<?x?xi32>, !fir.box<!fir.array<?x?xi32>>79! CHECK: hlfir.destroy %[[VAL_7]] : !hlfir.expr<?x?xi32>80! CHECK: return81! CHECK: }82 83! 2d shift by array84subroutine cshift5(a, s)85 integer :: a(:,:), s(:)86 a = CSHIFT(a, s)87end subroutine88! CHECK-LABEL: func.func @_QPcshift5(89! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "a"},90! CHECK-SAME: %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "s"}) {91! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope92! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]93! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]94! CHECK: %[[VAL_5:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_4]]#0 : (!fir.box<!fir.array<?x?xi32>>, !fir.box<!fir.array<?xi32>>) -> !hlfir.expr<?x?xi32>95! CHECK: hlfir.assign %[[VAL_5]] to %[[VAL_3]]#0 : !hlfir.expr<?x?xi32>, !fir.box<!fir.array<?x?xi32>>96! CHECK: hlfir.destroy %[[VAL_5]] : !hlfir.expr<?x?xi32>97! CHECK: return98! CHECK: }99 100! 2d shift by array expr101subroutine cshift6(a, s)102 integer :: a(:,:), s(:)103 a = CSHIFT(a, s + 1)104end subroutine105! CHECK-LABEL: func.func @_QPcshift6(106! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x?xi32>> {fir.bindc_name = "a"},107! CHECK-SAME: %[[VAL_1:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "s"}) {108! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope109! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]110! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]111! CHECK: %[[VAL_5:.*]] = arith.constant 1 : i32112! CHECK: %[[VAL_6:.*]] = arith.constant 0 : index113! CHECK: %[[VAL_7:.*]]:3 = fir.box_dims %[[VAL_4]]#0, %[[VAL_6]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index)114! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_7]]#1 : (index) -> !fir.shape<1>115! CHECK: %[[VAL_9:.*]] = hlfir.elemental %[[VAL_8]] unordered : (!fir.shape<1>) -> !hlfir.expr<?xi32>116! CHECK: %[[VAL_14:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_9]] : (!fir.box<!fir.array<?x?xi32>>, !hlfir.expr<?xi32>) -> !hlfir.expr<?x?xi32>117! CHECK: hlfir.assign %[[VAL_14]] to %[[VAL_3]]#0 : !hlfir.expr<?x?xi32>, !fir.box<!fir.array<?x?xi32>>118! CHECK: hlfir.destroy %[[VAL_14]] : !hlfir.expr<?x?xi32>119! CHECK: hlfir.destroy %[[VAL_9]] : !hlfir.expr<?xi32>120! CHECK: return121! CHECK: }122 123! 1d character(10,2) shift by scalar124subroutine cshift7(a, s)125 character(10,2) :: a(:)126 a = CSHIFT(a, 2)127end subroutine128! CHECK-LABEL: func.func @_QPcshift7(129! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.char<2,10>>> {fir.bindc_name = "a"},130! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<f32> {fir.bindc_name = "s"}) {131! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope132! CHECK: %[[VAL_3:.*]] = arith.constant 10 : index133! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_0]]134! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_1]]135! CHECK: %[[VAL_6:.*]] = arith.constant 2 : i32136! CHECK: %[[VAL_7:.*]] = hlfir.cshift %[[VAL_4]]#0 %[[VAL_6]] : (!fir.box<!fir.array<?x!fir.char<2,10>>>, i32) -> !hlfir.expr<?x!fir.char<2,10>>137! 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>>>138! CHECK: hlfir.destroy %[[VAL_7]] : !hlfir.expr<?x!fir.char<2,10>>139! CHECK: return140! CHECK: }141 142! 1d character(*) shift by scalar143subroutine cshift8(a, s)144 character(*) :: a(:)145 a = CSHIFT(a, 2)146end subroutine147! CHECK-LABEL: func.func @_QPcshift8(148! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.char<1,?>>> {fir.bindc_name = "a"},149! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<f32> {fir.bindc_name = "s"}) {150! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope151! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]152! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]153! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i32154! CHECK: %[[VAL_6:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_5]] : (!fir.box<!fir.array<?x!fir.char<1,?>>>, i32) -> !hlfir.expr<?x!fir.char<1,?>>155! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_3]]#0 : !hlfir.expr<?x!fir.char<1,?>>, !fir.box<!fir.array<?x!fir.char<1,?>>>156! CHECK: hlfir.destroy %[[VAL_6]] : !hlfir.expr<?x!fir.char<1,?>>157! CHECK: return158! CHECK: }159 160! 1d type(t) shift by scalar161subroutine cshift9(a, s)162 use types163 type(t) :: a(:)164 a = CSHIFT(a, 2)165end subroutine166! CHECK-LABEL: func.func @_QPcshift9(167! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?x!fir.type<_QMtypesTt>>> {fir.bindc_name = "a"},168! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<f32> {fir.bindc_name = "s"}) {169! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope170! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]171! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]172! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i32173! CHECK: %[[VAL_6:.*]] = hlfir.cshift %[[VAL_3]]#0 %[[VAL_5]] : (!fir.box<!fir.array<?x!fir.type<_QMtypesTt>>>, i32) -> !hlfir.expr<?x!fir.type<_QMtypesTt>>174! CHECK: hlfir.assign %[[VAL_6]] to %[[VAL_3]]#0 : !hlfir.expr<?x!fir.type<_QMtypesTt>>, !fir.box<!fir.array<?x!fir.type<_QMtypesTt>>>175! CHECK: hlfir.destroy %[[VAL_6]] : !hlfir.expr<?x!fir.type<_QMtypesTt>>176! CHECK: return177! CHECK: }178 179! 1d class(t) shift by scalar180subroutine cshift10(a, s)181 use types182 class(t), allocatable :: a(:)183 a = CSHIFT(a, 2)184end subroutine185! CHECK-LABEL: func.func @_QPcshift10(186! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>> {fir.bindc_name = "a"},187! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<f32> {fir.bindc_name = "s"}) {188! CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope189! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_0]]190! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_1]]191! CHECK: %[[VAL_5:.*]] = arith.constant 2 : i32192! CHECK: %[[VAL_6:.*]] = fir.load %[[VAL_3]]#0 : !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>>193! CHECK: %[[VAL_7:.*]] = hlfir.cshift %[[VAL_6]] %[[VAL_5]] : (!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>, i32) -> !hlfir.expr<?x!fir.type<_QMtypesTt>?>194! CHECK: hlfir.assign %[[VAL_7]] to %[[VAL_3]]#0 realloc : !hlfir.expr<?x!fir.type<_QMtypesTt>?>, !fir.ref<!fir.class<!fir.heap<!fir.array<?x!fir.type<_QMtypesTt>>>>>195! CHECK: hlfir.destroy %[[VAL_7]] : !hlfir.expr<?x!fir.type<_QMtypesTt>?>196! CHECK: return197! CHECK: }198 199! 1d shift by scalar with variable dim200subroutine cshift11(a, s, d)201 integer :: a(:), s, d202 a = CSHIFT(a, 2, d)203end subroutine204! CHECK-LABEL: func.func @_QPcshift11(205! CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xi32>> {fir.bindc_name = "a"},206! CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<i32> {fir.bindc_name = "s"},207! CHECK-SAME: %[[VAL_2:.*]]: !fir.ref<i32> {fir.bindc_name = "d"}) {208! CHECK: %[[VAL_3:.*]] = fir.dummy_scope : !fir.dscope209! CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_0]] dummy_scope %[[VAL_3]] arg {{[0-9]+}} {uniq_name = "_QFcshift11Ea"} : (!fir.box<!fir.array<?xi32>>, !fir.dscope) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)210! CHECK: %[[VAL_5:.*]]:2 = hlfir.declare %[[VAL_2]] dummy_scope %[[VAL_3]] arg {{[0-9]+}} {uniq_name = "_QFcshift11Ed"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)211! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_1]] dummy_scope %[[VAL_3]] arg {{[0-9]+}} {uniq_name = "_QFcshift11Es"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)212! CHECK: %[[VAL_7:.*]] = arith.constant 2 : i32213! CHECK: %[[VAL_8:.*]] = fir.load %[[VAL_5]]#0 : !fir.ref<i32>214! CHECK: %[[VAL_9:.*]] = hlfir.cshift %[[VAL_4]]#0 %[[VAL_7]] dim %[[VAL_8]] : (!fir.box<!fir.array<?xi32>>, i32, i32) -> !hlfir.expr<?xi32>215! CHECK: hlfir.assign %[[VAL_9]] to %[[VAL_4]]#0 : !hlfir.expr<?xi32>, !fir.box<!fir.array<?xi32>>216! CHECK: hlfir.destroy %[[VAL_9]] : !hlfir.expr<?xi32>217! CHECK: return218! CHECK: }219