1656b8d6cSValentin Clement! Test lowering of elemental calls with character argument 2656b8d6cSValentin Clement! without the VALUE attribute. 3*a88677edSYusuke MINATO! RUN: bbc -hlfir=false -fwrapv -o - %s | FileCheck %s 4656b8d6cSValentin Clement 5656b8d6cSValentin Clementmodule char_elem 6656b8d6cSValentin Clement 7656b8d6cSValentin Clementinterface 8656b8d6cSValentin Clementelemental integer function elem(c) 9656b8d6cSValentin Clement character(*), intent(in) :: c 10656b8d6cSValentin Clementend function 11656b8d6cSValentin Clement 12656b8d6cSValentin Clementelemental integer function elem2(c, j) 13656b8d6cSValentin Clement character(*), intent(in) :: c 14656b8d6cSValentin Clement integer, intent(in) :: j 15656b8d6cSValentin Clementend function 16656b8d6cSValentin Clement 17656b8d6cSValentin Clementend interface 18656b8d6cSValentin Clement 19656b8d6cSValentin Clementcontains 20656b8d6cSValentin Clement 21656b8d6cSValentin Clement! CHECK-LABEL: func @_QMchar_elemPfoo1( 22656b8d6cSValentin Clement! CHECK-SAME: %[[VAL_15:.*]]: !fir.ref<!fir.array<10xi32>>{{.*}}, %[[VAL_4:.*]]: !fir.boxchar<1>{{.*}}) { 23656b8d6cSValentin Clementsubroutine foo1(i, c) 24656b8d6cSValentin Clement integer :: i(10) 25656b8d6cSValentin Clement character(*) :: c(10) 26656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_0:.*]] = arith.constant 10 : index 27656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_1:.*]] = arith.constant 0 : index 28656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_2:.*]] = arith.constant 1 : index 29656b8d6cSValentin Clement! CHECK: %[[VAL_3:.*]]:2 = fir.unboxchar %[[VAL_4]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 30656b8d6cSValentin Clement! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_3]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<10x!fir.char<1,?>>> 31656b8d6cSValentin Clement! CHECK: %[[VAL_6:.*]] = fir.shape %[[VAL_0]] : (index) -> !fir.shape<1> 32656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_1]], %[[VAL_0]] : index, index) 33656b8d6cSValentin Clement! CHECK: ^bb1(%[[VAL_7:.*]]: index, %[[VAL_8:.*]]: index): 34656b8d6cSValentin Clement! CHECK: %[[VAL_9:.*]] = arith.cmpi sgt, %[[VAL_8]], %[[VAL_1]] : index 35656b8d6cSValentin Clement! CHECK: cond_br %[[VAL_9]], ^bb2, ^bb3 36656b8d6cSValentin Clement! CHECK: ^bb2: 37656b8d6cSValentin Clement! CHECK: %[[VAL_10:.*]] = arith.addi %[[VAL_7]], %[[VAL_2]] : index 38656b8d6cSValentin Clement! CHECK: %[[VAL_11:.*]] = fir.array_coor %[[VAL_5]](%[[VAL_6]]) %[[VAL_10]] typeparams %[[VAL_3]]#1 : (!fir.ref<!fir.array<10x!fir.char<1,?>>>, !fir.shape<1>, index, index) -> !fir.ref<!fir.char<1,?>> 39656b8d6cSValentin Clement! CHECK: %[[VAL_12:.*]] = fir.emboxchar %[[VAL_11]], %[[VAL_3]]#1 : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1> 404cc9437aSTom Eccles! CHECK: %[[VAL_13:.*]] = fir.call @_QPelem(%[[VAL_12]]) {{.*}}: (!fir.boxchar<1>) -> i32 41656b8d6cSValentin Clement! CHECK: %[[VAL_14:.*]] = fir.array_coor %[[VAL_15]](%[[VAL_6]]) %[[VAL_10]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, index) -> !fir.ref<i32> 42656b8d6cSValentin Clement! CHECK: fir.store %[[VAL_13]] to %[[VAL_14]] : !fir.ref<i32> 43656b8d6cSValentin Clement! CHECK: %[[VAL_16:.*]] = arith.subi %[[VAL_8]], %[[VAL_2]] : index 44656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_10]], %[[VAL_16]] : index, index) 45656b8d6cSValentin Clement! CHECK: ^bb3: 46656b8d6cSValentin Clement! CHECK: return 47656b8d6cSValentin Clement i = elem(c) 48656b8d6cSValentin Clementend subroutine 49656b8d6cSValentin Clement 50656b8d6cSValentin Clement! CHECK-LABEL: func @_QMchar_elemPfoo1b( 51656b8d6cSValentin Clement! CHECK-SAME: %[[VAL_33:.*]]: !fir.ref<!fir.array<10xi32>>{{.*}}, %[[VAL_21:.*]]: !fir.boxchar<1>{{.*}}) { 52656b8d6cSValentin Clementsubroutine foo1b(i, c) 53656b8d6cSValentin Clement integer :: i(10) 54656b8d6cSValentin Clement character(10) :: c(10) 55656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_17:.*]] = arith.constant 10 : index 56656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_18:.*]] = arith.constant 0 : index 57656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_19:.*]] = arith.constant 1 : index 58656b8d6cSValentin Clement! CHECK: %[[VAL_20:.*]]:2 = fir.unboxchar %[[VAL_21]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 59656b8d6cSValentin Clement! CHECK: %[[VAL_22:.*]] = fir.convert %[[VAL_20]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<10x!fir.char<1,10>>> 60656b8d6cSValentin Clement! CHECK: %[[VAL_23:.*]] = fir.shape %[[VAL_17]] : (index) -> !fir.shape<1> 61656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_18]], %[[VAL_17]] : index, index) 62656b8d6cSValentin Clement! CHECK: ^bb1(%[[VAL_24:.*]]: index, %[[VAL_25:.*]]: index): 63656b8d6cSValentin Clement! CHECK: %[[VAL_26:.*]] = arith.cmpi sgt, %[[VAL_25]], %[[VAL_18]] : index 64656b8d6cSValentin Clement! CHECK: cond_br %[[VAL_26]], ^bb2, ^bb3 65656b8d6cSValentin Clement! CHECK: ^bb2: 66656b8d6cSValentin Clement! CHECK: %[[VAL_27:.*]] = arith.addi %[[VAL_24]], %[[VAL_19]] : index 67656b8d6cSValentin Clement! CHECK: %[[VAL_28:.*]] = fir.array_coor %[[VAL_22]](%[[VAL_23]]) %[[VAL_27]] : (!fir.ref<!fir.array<10x!fir.char<1,10>>>, !fir.shape<1>, index) -> !fir.ref<!fir.char<1,10>> 68c0cb8f73SjeanPerier! CHECK: %[[VAL_30:.*]] = fir.emboxchar %[[VAL_28]], %[[VAL_17]] : (!fir.ref<!fir.char<1,10>>, index) -> !fir.boxchar<1> 694cc9437aSTom Eccles! CHECK: %[[VAL_31:.*]] = fir.call @_QPelem(%[[VAL_30]]) {{.*}}: (!fir.boxchar<1>) -> i32 70656b8d6cSValentin Clement! CHECK: %[[VAL_32:.*]] = fir.array_coor %[[VAL_33]](%[[VAL_23]]) %[[VAL_27]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, index) -> !fir.ref<i32> 71656b8d6cSValentin Clement! CHECK: fir.store %[[VAL_31]] to %[[VAL_32]] : !fir.ref<i32> 72656b8d6cSValentin Clement! CHECK: %[[VAL_34:.*]] = arith.subi %[[VAL_25]], %[[VAL_19]] : index 73656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_27]], %[[VAL_34]] : index, index) 74656b8d6cSValentin Clement! CHECK: ^bb3: 75656b8d6cSValentin Clement! CHECK: return 76656b8d6cSValentin Clement i = elem(c) 77656b8d6cSValentin Clementend subroutine 78656b8d6cSValentin Clement 79656b8d6cSValentin Clement! CHECK-LABEL: func @_QMchar_elemPfoo2( 80656b8d6cSValentin Clement! CHECK-SAME: %[[VAL_50:[^:]+]]: !fir.ref<!fir.array<10xi32>>{{.*}}, %[[VAL_47:[^:]+]]: !fir.ref<!fir.array<10xi32>>{{.*}}, %[[VAL_39:.*]]: !fir.boxchar<1>{{.*}}) { 81656b8d6cSValentin Clementsubroutine foo2(i, j, c) 82656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_35:.*]] = arith.constant 10 : index 83656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_36:.*]] = arith.constant 0 : index 84656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_37:.*]] = arith.constant 1 : index 85656b8d6cSValentin Clement! CHECK: %[[VAL_38:.*]]:2 = fir.unboxchar %[[VAL_39]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 86656b8d6cSValentin Clement! CHECK: %[[VAL_40:.*]] = fir.shape %[[VAL_35]] : (index) -> !fir.shape<1> 87656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_36]], %[[VAL_35]] : index, index) 88656b8d6cSValentin Clement! CHECK: ^bb1(%[[VAL_41:.*]]: index, %[[VAL_42:.*]]: index): 89656b8d6cSValentin Clement! CHECK: %[[VAL_43:.*]] = arith.cmpi sgt, %[[VAL_42]], %[[VAL_36]] : index 90656b8d6cSValentin Clement! CHECK: cond_br %[[VAL_43]], ^bb2, ^bb3 91656b8d6cSValentin Clement! CHECK: ^bb2: 92656b8d6cSValentin Clement! CHECK: %[[VAL_44:.*]] = fir.emboxchar %[[VAL_38]]#0, %[[VAL_38]]#1 : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1> 93656b8d6cSValentin Clement! CHECK: %[[VAL_45:.*]] = arith.addi %[[VAL_41]], %[[VAL_37]] : index 94656b8d6cSValentin Clement! CHECK: %[[VAL_46:.*]] = fir.array_coor %[[VAL_47]](%[[VAL_40]]) %[[VAL_45]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, index) -> !fir.ref<i32> 954cc9437aSTom Eccles! CHECK: %[[VAL_48:.*]] = fir.call @_QPelem2(%[[VAL_44]], %[[VAL_46]]) {{.*}}: (!fir.boxchar<1>, !fir.ref<i32>) -> i32 96656b8d6cSValentin Clement! CHECK: %[[VAL_49:.*]] = fir.array_coor %[[VAL_50]](%[[VAL_40]]) %[[VAL_45]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, index) -> !fir.ref<i32> 97656b8d6cSValentin Clement! CHECK: fir.store %[[VAL_48]] to %[[VAL_49]] : !fir.ref<i32> 98656b8d6cSValentin Clement! CHECK: %[[VAL_51:.*]] = arith.subi %[[VAL_42]], %[[VAL_37]] : index 99656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_45]], %[[VAL_51]] : index, index) 100656b8d6cSValentin Clement! CHECK: ^bb3: 101656b8d6cSValentin Clement! CHECK: return 102656b8d6cSValentin Clement integer :: i(10), j(10) 103656b8d6cSValentin Clement character(*) :: c 104656b8d6cSValentin Clement i = elem2(c, j) 105656b8d6cSValentin Clementend subroutine 106656b8d6cSValentin Clement 1078df59132SSlava Zakharin! CHECK-LABEL: func.func @_QMchar_elemPfoo2b( 1088df59132SSlava Zakharin! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10xi32>>{{.*}}, %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi32>>{{.*}}, %[[VAL_2:.*]]: !fir.boxchar<1>{{.*}}) { 109656b8d6cSValentin Clementsubroutine foo2b(i, j, c) 110656b8d6cSValentin Clement integer :: i(10), j(10) 111656b8d6cSValentin Clement character(10) :: c 1128df59132SSlava Zakharin! CHECK-DAG: %[[VAL_3:.*]] = arith.constant 10 : index 1138df59132SSlava Zakharin! CHECK-DAG: %[[VAL_4:.*]] = arith.constant 0 : index 1148df59132SSlava Zakharin! CHECK-DAG: %[[VAL_5:.*]] = arith.constant 1 : index 1158df59132SSlava Zakharin! CHECK: %[[VAL_6:.*]]:2 = fir.unboxchar %[[VAL_2]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 1168df59132SSlava Zakharin! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.char<1,10>> 1178df59132SSlava Zakharin! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1> 1188df59132SSlava Zakharin! CHECK: cf.br ^bb1(%[[VAL_4]], %[[VAL_3]] : index, index) 1198df59132SSlava Zakharin! CHECK: ^bb1(%[[VAL_9:.*]]: index, %[[VAL_10:.*]]: index): 1208df59132SSlava Zakharin! CHECK: %[[VAL_11:.*]] = arith.cmpi sgt, %[[VAL_10]], %[[VAL_4]] : index 1218df59132SSlava Zakharin! CHECK: cf.cond_br %[[VAL_11]], ^bb2, ^bb3 122656b8d6cSValentin Clement! CHECK: ^bb2: 123c0cb8f73SjeanPerier! CHECK: %[[VAL_13:.*]] = fir.emboxchar %[[VAL_7]], %[[VAL_3]] : (!fir.ref<!fir.char<1,10>>, index) -> !fir.boxchar<1> 1248df59132SSlava Zakharin! CHECK: %[[VAL_14:.*]] = arith.addi %[[VAL_9]], %[[VAL_5]] : index 1258df59132SSlava Zakharin! CHECK: %[[VAL_15:.*]] = fir.array_coor %[[VAL_1]](%[[VAL_8]]) %[[VAL_14]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, index) -> !fir.ref<i32> 1263be8e3adSjeanPerier! CHECK: %[[VAL_16:.*]] = fir.call @_QPelem2(%[[VAL_13]], %[[VAL_15]]) proc_attrs<elemental, pure> fastmath<contract> : (!fir.boxchar<1>, !fir.ref<i32>) -> i32 1278df59132SSlava Zakharin! CHECK: %[[VAL_17:.*]] = fir.array_coor %[[VAL_0]](%[[VAL_8]]) %[[VAL_14]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, index) -> !fir.ref<i32> 1288df59132SSlava Zakharin! CHECK: fir.store %[[VAL_16]] to %[[VAL_17]] : !fir.ref<i32> 1298df59132SSlava Zakharin! CHECK: %[[VAL_18:.*]] = arith.subi %[[VAL_10]], %[[VAL_5]] : index 1308df59132SSlava Zakharin! CHECK: cf.br ^bb1(%[[VAL_14]], %[[VAL_18]] : index, index) 131656b8d6cSValentin Clement! CHECK: ^bb3: 132656b8d6cSValentin Clement! CHECK: return 1338df59132SSlava Zakharin! CHECK: } 134656b8d6cSValentin Clement i = elem2(c, j) 135656b8d6cSValentin Clementend subroutine 136656b8d6cSValentin Clement 137656b8d6cSValentin Clement! CHECK-LABEL: func @_QMchar_elemPfoo3( 138656b8d6cSValentin Clement! CHECK-SAME: %[[VAL_88:[^:]+]]: !fir.ref<!fir.array<10xi32>>{{.*}}, %[[VAL_79:[^:]+]]: !fir.ref<!fir.array<10xi32>>{{.*}}) 139656b8d6cSValentin Clementsubroutine foo3(i, j) 140656b8d6cSValentin Clement integer :: i(10), j(10) 141656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_69:.*]] = arith.constant 10 : index 142656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_70:.*]] = arith.constant 0 : index 143656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_71:.*]] = arith.constant 1 : index 144656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_72:.*]] = fir.alloca !fir.char<1> 145656b8d6cSValentin Clement! CHECK: %[[VAL_73:.*]] = fir.shape %[[VAL_69]] : (index) -> !fir.shape<1> 146656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_70]], %[[VAL_69]] : index, index) 147656b8d6cSValentin Clement! CHECK: ^bb1(%[[VAL_74:.*]]: index, %[[VAL_75:.*]]: index): 148656b8d6cSValentin Clement! CHECK: %[[VAL_76:.*]] = arith.cmpi sgt, %[[VAL_75]], %[[VAL_70]] : index 149656b8d6cSValentin Clement! CHECK: cond_br %[[VAL_76]], ^bb2, ^bb3 150656b8d6cSValentin Clement! CHECK: ^bb2: 151656b8d6cSValentin Clement! CHECK: %[[VAL_77:.*]] = arith.addi %[[VAL_74]], %[[VAL_71]] : index 152656b8d6cSValentin Clement! CHECK: %[[VAL_78:.*]] = fir.array_coor %[[VAL_79]](%[[VAL_73]]) %[[VAL_77]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, index) -> !fir.ref<i32> 153656b8d6cSValentin Clement! CHECK: %[[VAL_80:.*]] = fir.load %[[VAL_78]] : !fir.ref<i32> 154656b8d6cSValentin Clement! CHECK: %[[VAL_81:.*]] = fir.convert %[[VAL_80]] : (i32) -> i8 155656b8d6cSValentin Clement! CHECK: %[[VAL_82:.*]] = fir.undefined !fir.char<1> 156656b8d6cSValentin Clement! CHECK: %[[VAL_83:.*]] = fir.insert_value %[[VAL_82]], %[[VAL_81]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 157656b8d6cSValentin Clement! CHECK: fir.store %[[VAL_83]] to %[[VAL_72]] : !fir.ref<!fir.char<1>> 158c0cb8f73SjeanPerier! CHECK: %[[VAL_85:.*]] = fir.emboxchar %[[VAL_72]], %[[VAL_71]] : (!fir.ref<!fir.char<1>>, index) -> !fir.boxchar<1> 1594cc9437aSTom Eccles! CHECK: %[[VAL_86:.*]] = fir.call @_QPelem(%[[VAL_85]]) {{.*}}: (!fir.boxchar<1>) -> i32 160656b8d6cSValentin Clement! CHECK: %[[VAL_87:.*]] = fir.array_coor %[[VAL_88]](%[[VAL_73]]) %[[VAL_77]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, index) -> !fir.ref<i32> 161656b8d6cSValentin Clement! CHECK: fir.store %[[VAL_86]] to %[[VAL_87]] : !fir.ref<i32> 162656b8d6cSValentin Clement! CHECK: %[[VAL_89:.*]] = arith.subi %[[VAL_75]], %[[VAL_71]] : index 163656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_77]], %[[VAL_89]] : index, index) 164656b8d6cSValentin Clement! CHECK: ^bb3: 165656b8d6cSValentin Clement! CHECK: return 166656b8d6cSValentin Clement i = elem(char(j)) 167656b8d6cSValentin Clementend subroutine 168656b8d6cSValentin Clement 169656b8d6cSValentin Clement! CHECK-LABEL: func @_QMchar_elemPfoo4( 170656b8d6cSValentin Clement! CHECK-SAME: %[[VAL_106:[^:]+]]: !fir.ref<!fir.array<10xi32>>{{.*}}, %[[VAL_103:[^:]+]]: !fir.ref<!fir.array<10xi32>>{{.*}}) 171656b8d6cSValentin Clementsubroutine foo4(i, j) 172656b8d6cSValentin Clement integer :: i(10), j(10) 173656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_90:.*]] = arith.constant 5 : index 174656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_91:.*]] = arith.constant 10 : index 175656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_92:.*]] = arith.constant 0 : index 176656b8d6cSValentin Clement! CHECK-DAG: %[[VAL_93:.*]] = arith.constant 1 : index 177656b8d6cSValentin Clement! CHECK: %[[VAL_94:.*]] = fir.shape %[[VAL_91]] : (index) -> !fir.shape<1> 178656b8d6cSValentin Clement! CHECK: %[[VAL_95:.*]] = fir.address_of(@{{.*}}) : !fir.ref<!fir.char<1,5>> 179656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_92]], %[[VAL_91]] : index, index) 180656b8d6cSValentin Clement! CHECK: ^bb1(%[[VAL_96:.*]]: index, %[[VAL_97:.*]]: index): 181656b8d6cSValentin Clement! CHECK: %[[VAL_98:.*]] = arith.cmpi sgt, %[[VAL_97]], %[[VAL_92]] : index 182656b8d6cSValentin Clement! CHECK: cond_br %[[VAL_98]], ^bb2, ^bb3 183656b8d6cSValentin Clement! CHECK: ^bb2: 184c0cb8f73SjeanPerier! CHECK: %[[VAL_100:.*]] = fir.emboxchar %[[VAL_95]], %[[VAL_90]] : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1> 185656b8d6cSValentin Clement! CHECK: %[[VAL_101:.*]] = arith.addi %[[VAL_96]], %[[VAL_93]] : index 186656b8d6cSValentin Clement! CHECK: %[[VAL_102:.*]] = fir.array_coor %[[VAL_103]](%[[VAL_94]]) %[[VAL_101]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, index) -> !fir.ref<i32> 1874cc9437aSTom Eccles! CHECK: %[[VAL_104:.*]] = fir.call @_QPelem2(%[[VAL_100]], %[[VAL_102]]) {{.*}}: (!fir.boxchar<1>, !fir.ref<i32>) -> i32 188656b8d6cSValentin Clement! CHECK: %[[VAL_105:.*]] = fir.array_coor %[[VAL_106]](%[[VAL_94]]) %[[VAL_101]] : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>, index) -> !fir.ref<i32> 189656b8d6cSValentin Clement! CHECK: fir.store %[[VAL_104]] to %[[VAL_105]] : !fir.ref<i32> 190656b8d6cSValentin Clement! CHECK: %[[VAL_107:.*]] = arith.subi %[[VAL_97]], %[[VAL_93]] : index 191656b8d6cSValentin Clement! CHECK: br ^bb1(%[[VAL_101]], %[[VAL_107]] : index, index) 192656b8d6cSValentin Clement! CHECK: ^bb3: 193656b8d6cSValentin Clement! CHECK: return 194656b8d6cSValentin Clement i = elem2("hello", j) 195656b8d6cSValentin Clementend subroutine 196656b8d6cSValentin Clement 197656b8d6cSValentin Clement! Test character return for elemental functions. 198656b8d6cSValentin Clement 199656b8d6cSValentin Clement! CHECK-LABEL: func @_QMchar_elemPelem_return_char( 200656b8d6cSValentin Clement! CHECK-SAME: %{{.*}}: !fir.ref<!fir.char<1,?>>{{.*}}, %{{.*}}: index{{.*}}, %{{.*}}: !fir.boxchar<1>{{.*}}) -> !fir.boxchar<1> 201656b8d6cSValentin Clementelemental function elem_return_char(c) 202656b8d6cSValentin Clement character(*), intent(in) :: c 203656b8d6cSValentin Clement character(len(c)) :: elem_return_char 204656b8d6cSValentin Clement elem_return_char = "ab" // c 205656b8d6cSValentin Clementend function 206656b8d6cSValentin Clement 207656b8d6cSValentin Clement! CHECK-LABEL: func @_QMchar_elemPfoo6( 208656b8d6cSValentin Clement! CHECK-SAME: %[[VAL_0:.*]]: !fir.boxchar<1> {fir.bindc_name = "c"}) { 209656b8d6cSValentin Clementsubroutine foo6(c) 210656b8d6cSValentin Clement ! CHECK-DAG: %[[VAL_1:.*]] = arith.constant 10 : index 211656b8d6cSValentin Clement ! CHECK-DAG: %[[VAL_2:.*]] = arith.constant 1 : index 212656b8d6cSValentin Clement ! CHECK-DAG: %[[VAL_3:.*]] = arith.constant 0 : index 213656b8d6cSValentin Clement ! CHECK-DAG: %[[VAL_4:.*]] = arith.constant false 214656b8d6cSValentin Clement ! CHECK-DAG: %[[VAL_5:.*]] = arith.constant 32 : i8 215656b8d6cSValentin Clement ! CHECK: %[[VAL_6:.*]]:2 = fir.unboxchar %[[VAL_0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) 216656b8d6cSValentin Clement ! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_6]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<10x!fir.char<1,?>>> 217656b8d6cSValentin Clement ! CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1> 218656b8d6cSValentin Clement ! CHECK: br ^bb1(%[[VAL_3]], %[[VAL_1]] : index, index) 219656b8d6cSValentin Clement ! CHECK: ^bb1(%[[VAL_9:.*]]: index, %[[VAL_10:.*]]: index): 220656b8d6cSValentin Clement ! CHECK: %[[VAL_11:.*]] = arith.cmpi sgt, %[[VAL_10]], %[[VAL_3]] : index 221656b8d6cSValentin Clement ! CHECK: cond_br %[[VAL_11]], ^bb2, ^bb6 222656b8d6cSValentin Clement ! CHECK: ^bb2: 223656b8d6cSValentin Clement ! CHECK: %[[VAL_12:.*]] = arith.addi %[[VAL_9]], %[[VAL_2]] : index 224656b8d6cSValentin Clement ! CHECK: %[[VAL_13:.*]] = fir.array_coor %[[VAL_7]](%[[VAL_8]]) %[[VAL_12]] typeparams %[[VAL_6]]#1 : (!fir.ref<!fir.array<10x!fir.char<1,?>>>, !fir.shape<1>, index, index) -> !fir.ref<!fir.char<1,?>> 225656b8d6cSValentin Clement ! CHECK: %[[VAL_14:.*]] = fir.emboxchar %[[VAL_13]], %[[VAL_6]]#1 : (!fir.ref<!fir.char<1,?>>, index) -> !fir.boxchar<1> 226656b8d6cSValentin Clement ! CHECK: %[[VAL_15:.*]] = fir.convert %[[VAL_6]]#1 : (index) -> i32 227656b8d6cSValentin Clement ! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> index 2284235bd60SValentin Clement ! CHECK: %[[CMPI:.*]] = arith.cmpi sgt, %[[VAL_16]], %{{.*}} : index 2294235bd60SValentin Clement ! CHECK: %[[SELECT:.*]] = arith.select %[[CMPI]], %[[VAL_16]], %{{.*}} : index 2305aaf384bSTom Eccles ! CHECK: %[[VAL_17:.*]] = llvm.intr.stacksave : !llvm.ptr 2314235bd60SValentin Clement ! CHECK: %[[VAL_18:.*]] = fir.alloca !fir.char<1,?>(%[[SELECT]] : index) {bindc_name = ".result"} 2324cc9437aSTom Eccles ! CHECK: %[[VAL_19:.*]] = fir.call @_QMchar_elemPelem_return_char(%[[VAL_18]], %[[SELECT]], %[[VAL_14]]) {{.*}}: (!fir.ref<!fir.char<1,?>>, index, !fir.boxchar<1>) -> !fir.boxchar<1> 2334235bd60SValentin Clement ! CHECK: %[[VAL_20:.*]] = arith.cmpi slt, %[[VAL_6]]#1, %[[SELECT]] : index 2344235bd60SValentin Clement ! CHECK: %[[VAL_21:.*]] = arith.select %[[VAL_20]], %[[VAL_6]]#1, %[[SELECT]] : index 235656b8d6cSValentin Clement ! CHECK: %[[VAL_22:.*]] = fir.convert %[[VAL_21]] : (index) -> i64 236656b8d6cSValentin Clement ! CHECK: %[[VAL_23:.*]] = fir.convert %[[VAL_13]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 237656b8d6cSValentin Clement ! CHECK: %[[VAL_24:.*]] = fir.convert %[[VAL_18]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<i8> 2384cc9437aSTom Eccles ! CHECK: fir.call @llvm.memmove.p0.p0.i64(%[[VAL_23]], %[[VAL_24]], %[[VAL_22]], %[[VAL_4]]) {{.*}}: (!fir.ref<i8>, !fir.ref<i8>, i64, i1) -> () 239656b8d6cSValentin Clement ! CHECK: %[[VAL_25:.*]] = arith.subi %[[VAL_6]]#1, %[[VAL_2]] : index 240656b8d6cSValentin Clement ! CHECK: %[[VAL_26:.*]] = fir.undefined !fir.char<1> 241656b8d6cSValentin Clement ! CHECK: %[[VAL_27:.*]] = fir.insert_value %[[VAL_26]], %[[VAL_5]], [0 : index] : (!fir.char<1>, i8) -> !fir.char<1> 242656b8d6cSValentin Clement ! CHECK: %[[VAL_28:.*]] = arith.subi %[[VAL_25]], %[[VAL_21]] : index 243656b8d6cSValentin Clement ! CHECK: %[[VAL_29:.*]] = arith.addi %[[VAL_28]], %[[VAL_2]] : index 244656b8d6cSValentin Clement ! CHECK: br ^bb3(%[[VAL_21]], %[[VAL_29]] : index, index) 245656b8d6cSValentin Clement ! CHECK: ^bb3(%[[VAL_30:.*]]: index, %[[VAL_31:.*]]: index): 246656b8d6cSValentin Clement ! CHECK: %[[VAL_32:.*]] = arith.cmpi sgt, %[[VAL_31]], %[[VAL_3]] : index 247656b8d6cSValentin Clement ! CHECK: cond_br %[[VAL_32]], ^bb4, ^bb5 248656b8d6cSValentin Clement ! CHECK: ^bb4: 249656b8d6cSValentin Clement ! CHECK: %[[VAL_33:.*]] = fir.convert %[[VAL_13]] : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<?x!fir.char<1>>> 250656b8d6cSValentin Clement ! CHECK: %[[VAL_34:.*]] = fir.coordinate_of %[[VAL_33]], %[[VAL_30]] : (!fir.ref<!fir.array<?x!fir.char<1>>>, index) -> !fir.ref<!fir.char<1>> 251656b8d6cSValentin Clement ! CHECK: fir.store %[[VAL_27]] to %[[VAL_34]] : !fir.ref<!fir.char<1>> 252656b8d6cSValentin Clement ! CHECK: %[[VAL_35:.*]] = arith.addi %[[VAL_30]], %[[VAL_2]] : index 253656b8d6cSValentin Clement ! CHECK: %[[VAL_36:.*]] = arith.subi %[[VAL_31]], %[[VAL_2]] : index 254656b8d6cSValentin Clement ! CHECK: br ^bb3(%[[VAL_35]], %[[VAL_36]] : index, index) 255656b8d6cSValentin Clement ! CHECK: ^bb5: 2565aaf384bSTom Eccles ! CHECK: llvm.intr.stackrestore %[[VAL_17]] : !llvm.ptr 257656b8d6cSValentin Clement ! CHECK: %[[VAL_37:.*]] = arith.subi %[[VAL_10]], %[[VAL_2]] : index 258656b8d6cSValentin Clement ! CHECK: br ^bb1(%[[VAL_12]], %[[VAL_37]] : index, index) 259656b8d6cSValentin Clement ! CHECK: ^bb6: 260656b8d6cSValentin Clement 261656b8d6cSValentin Clement implicit none 262656b8d6cSValentin Clement character(*) :: c(10) 263656b8d6cSValentin Clement c = elem_return_char(c) 264656b8d6cSValentin Clement ! CHECK: return 265656b8d6cSValentin Clement ! CHECK: } 266656b8d6cSValentin Clementend subroutine 267656b8d6cSValentin Clement 268656b8d6cSValentin Clementend module 269