1// Test code generation of hlfir.region_assign where the left-hand 2// side terminator is an hlfir.elemental_addr (Fortran assignments to 3// vector subscripted designators). 4// RUN: fir-opt %s --lower-hlfir-ordered-assignments | FileCheck %s 5 6func.func @simple(%arg0: !fir.ref<!fir.array<100xf32>> , %arg1: !fir.ref<!fir.array<10xi64>> , %arg2: !fir.ref<!fir.array<10xf32>> ) { 7 %c10 = arith.constant 10 : index 8 %c100 = arith.constant 100 : index 9 %0 = fir.shape %c100 : (index) -> !fir.shape<1> 10 %1:2 = hlfir.declare %arg0(%0) {uniq_name = "_QFsimpleEx"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>) 11 %2 = fir.shape %c10 : (index) -> !fir.shape<1> 12 %3:2 = hlfir.declare %arg1(%2) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>) 13 %4:2 = hlfir.declare %arg2(%2) {uniq_name = "z"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) 14 hlfir.region_assign { 15 hlfir.yield %4#0 : !fir.ref<!fir.array<10xf32>> 16 } to { 17 hlfir.elemental_addr %2 : !fir.shape<1> { 18 ^bb0(%arg3: index): 19 %5 = hlfir.designate %3#0 (%arg3) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64> 20 %6 = fir.load %5 : !fir.ref<i64> 21 %7 = hlfir.designate %1#0 (%6) : (!fir.ref<!fir.array<100xf32>>, i64) -> !fir.ref<f32> 22 hlfir.yield %7 : !fir.ref<f32> 23 } 24 } 25 return 26} 27// CHECK-LABEL: func.func @simple( 28// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<100xf32>>, 29// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi64>>, 30// CHECK-SAME: %[[VAL_2:.*]]: !fir.ref<!fir.array<10xf32>>) { 31// CHECK: %[[VAL_3:.*]] = arith.constant 10 : index 32// CHECK: %[[VAL_4:.*]] = arith.constant 100 : index 33// CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 34// CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_5]]) {uniq_name = "_QFsimpleEx"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>) 35// CHECK: %[[VAL_7:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1> 36// CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_7]]) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>) 37// CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_2]](%[[VAL_7]]) {uniq_name = "z"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) 38// CHECK: %[[VAL_10:.*]] = arith.constant 1 : index 39// CHECK: fir.do_loop %[[VAL_11:.*]] = %[[VAL_10]] to %[[VAL_3]] step %[[VAL_10]] { 40// CHECK: %[[VAL_12:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[VAL_11]]) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64> 41// CHECK: %[[VAL_13:.*]] = fir.load %[[VAL_12]] : !fir.ref<i64> 42// CHECK: %[[VAL_14:.*]] = hlfir.designate %[[VAL_6]]#0 (%[[VAL_13]]) : (!fir.ref<!fir.array<100xf32>>, i64) -> !fir.ref<f32> 43// CHECK: %[[VAL_15:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_11]]) : (!fir.ref<!fir.array<10xf32>>, index) -> !fir.ref<f32> 44// CHECK: hlfir.assign %[[VAL_15]] to %[[VAL_14]] : !fir.ref<f32>, !fir.ref<f32> 45// CHECK: } 46 47func.func @forall_vector_lhs(%arg0: !fir.ref<!fir.array<100x20xf32>> , %arg1: !fir.ref<!fir.array<10xi64>> ) { 48 %c20_i32 = arith.constant 20 : i32 49 %c1_i32 = arith.constant 1 : i32 50 %c10 = arith.constant 10 : index 51 %c100 = arith.constant 100 : index 52 %c20 = arith.constant 20 : index 53 %0 = fir.shape %c100, %c20 : (index, index) -> !fir.shape<2> 54 %1:2 = hlfir.declare %arg0(%0) {uniq_name = "x"} : (!fir.ref<!fir.array<100x20xf32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<100x20xf32>>, !fir.ref<!fir.array<100x20xf32>>) 55 %2 = fir.shape %c10 : (index) -> !fir.shape<1> 56 %3:2 = hlfir.declare %arg1(%2) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>) 57 hlfir.forall lb { 58 hlfir.yield %c1_i32 : i32 59 } ub { 60 hlfir.yield %c20_i32 : i32 61 } (%arg2: i32) { 62 hlfir.region_assign { 63 %4 = hlfir.elemental %2 : (!fir.shape<1>) -> !hlfir.expr<10xf32> { 64 ^bb0(%arg3: index): 65 %5 = hlfir.designate %3#0 (%arg3) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64> 66 %6 = fir.load %5 : !fir.ref<i64> 67 %7 = fir.convert %6 : (i64) -> f32 68 hlfir.yield_element %7 : f32 69 } 70 hlfir.yield %4 : !hlfir.expr<10xf32> cleanup { 71 hlfir.destroy %4 : !hlfir.expr<10xf32> 72 } 73 } to { 74 %4 = fir.convert %arg2 : (i32) -> i64 75 hlfir.elemental_addr %2 : !fir.shape<1> { 76 ^bb0(%arg3: index): 77 %5 = hlfir.designate %3#0 (%arg3) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64> 78 %6 = fir.load %5 : !fir.ref<i64> 79 %7 = hlfir.designate %1#0 (%6, %4) : (!fir.ref<!fir.array<100x20xf32>>, i64, i64) -> !fir.ref<f32> 80 hlfir.yield %7 : !fir.ref<f32> 81 } 82 } 83 } 84 return 85} 86// CHECK-LABEL: func.func @forall_vector_lhs( 87// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<100x20xf32>>, 88// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi64>>) { 89// CHECK: %[[VAL_2:.*]] = arith.constant 20 : i32 90// CHECK: %[[VAL_3:.*]] = arith.constant 1 : i32 91// CHECK: %[[VAL_4:.*]] = arith.constant 10 : index 92// CHECK: %[[VAL_5:.*]] = arith.constant 100 : index 93// CHECK: %[[VAL_6:.*]] = arith.constant 20 : index 94// CHECK: %[[VAL_7:.*]] = fir.shape %[[VAL_5]], %[[VAL_6]] : (index, index) -> !fir.shape<2> 95// CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_7]]) {uniq_name = "x"} : (!fir.ref<!fir.array<100x20xf32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<100x20xf32>>, !fir.ref<!fir.array<100x20xf32>>) 96// CHECK: %[[VAL_9:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 97// CHECK: %[[VAL_10:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_9]]) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>) 98// CHECK: %[[VAL_11:.*]] = fir.convert %[[VAL_3]] : (i32) -> index 99// CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_2]] : (i32) -> index 100// CHECK: %[[VAL_13:.*]] = arith.constant 1 : index 101// CHECK: fir.do_loop %[[VAL_14:.*]] = %[[VAL_11]] to %[[VAL_12]] step %[[VAL_13]] { 102// CHECK: %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (index) -> i32 103// CHECK: %[[VAL_16:.*]] = hlfir.elemental %[[VAL_9]] : (!fir.shape<1>) -> !hlfir.expr<10xf32> { 104// CHECK: ^bb0(%[[VAL_17:.*]]: index): 105// CHECK: %[[VAL_18:.*]] = hlfir.designate %[[VAL_10]]#0 (%[[VAL_17]]) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64> 106// CHECK: %[[VAL_19:.*]] = fir.load %[[VAL_18]] : !fir.ref<i64> 107// CHECK: %[[VAL_20:.*]] = fir.convert %[[VAL_19]] : (i64) -> f32 108// CHECK: hlfir.yield_element %[[VAL_20]] : f32 109// CHECK: } 110// CHECK: %[[VAL_21:.*]] = fir.convert %[[VAL_15]] : (i32) -> i64 111// CHECK: %[[VAL_22:.*]] = arith.constant 1 : index 112// CHECK: fir.do_loop %[[VAL_23:.*]] = %[[VAL_22]] to %[[VAL_4]] step %[[VAL_22]] { 113// CHECK: %[[VAL_24:.*]] = hlfir.designate %[[VAL_10]]#0 (%[[VAL_23]]) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64> 114// CHECK: %[[VAL_25:.*]] = fir.load %[[VAL_24]] : !fir.ref<i64> 115// CHECK: %[[VAL_26:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[VAL_25]], %[[VAL_21]]) : (!fir.ref<!fir.array<100x20xf32>>, i64, i64) -> !fir.ref<f32> 116// CHECK: %[[VAL_27:.*]] = hlfir.apply %[[VAL_28:.*]], %[[VAL_23]] : (!hlfir.expr<10xf32>, index) -> f32 117// CHECK: hlfir.assign %[[VAL_27]] to %[[VAL_26]] : f32, !fir.ref<f32> 118// CHECK: } 119// CHECK: hlfir.destroy %[[VAL_16]] : !hlfir.expr<10xf32> 120// CHECK: } 121 122func.func @where_vector_subscripts(%arg0: !fir.ref<!fir.array<10x!fir.logical<4>>> , %arg1: !fir.ref<!fir.array<100xf32>> , %arg2: !fir.ref<!fir.array<10xi64>> ) { 123 %cst = arith.constant 0.000000e+00 : f32 124 %c100 = arith.constant 100 : index 125 %c10 = arith.constant 10 : index 126 %0 = fir.shape %c10 : (index) -> !fir.shape<1> 127 %1:2 = hlfir.declare %arg0(%0) {uniq_name = "l"} : (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.ref<!fir.array<10x!fir.logical<4>>>) 128 %2 = fir.shape %c100 : (index) -> !fir.shape<1> 129 %3:2 = hlfir.declare %arg1(%2) {uniq_name = "x"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>) 130 %4:2 = hlfir.declare %arg2(%0) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>) 131 hlfir.where { 132 hlfir.yield %1#0 : !fir.ref<!fir.array<10x!fir.logical<4>>> 133 } do { 134 hlfir.region_assign { 135 hlfir.yield %cst : f32 136 } to { 137 hlfir.elemental_addr %0 : !fir.shape<1> { 138 ^bb0(%arg3: index): 139 %5 = hlfir.designate %4#0 (%arg3) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64> 140 %6 = fir.load %5 : !fir.ref<i64> 141 %7 = hlfir.designate %3#0 (%6) : (!fir.ref<!fir.array<100xf32>>, i64) -> !fir.ref<f32> 142 hlfir.yield %7 : !fir.ref<f32> 143 } 144 } 145 } 146 return 147} 148// CHECK-LABEL: func.func @where_vector_subscripts( 149// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10x!fir.logical<4>>>, 150// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.array<100xf32>>, 151// CHECK-SAME: %[[VAL_2:.*]]: !fir.ref<!fir.array<10xi64>>) { 152// CHECK: %[[VAL_3:.*]] = arith.constant 0.000000e+00 : f32 153// CHECK: %[[VAL_4:.*]] = arith.constant 100 : index 154// CHECK: %[[VAL_5:.*]] = arith.constant 10 : index 155// CHECK: %[[VAL_6:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1> 156// CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_6]]) {uniq_name = "l"} : (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.ref<!fir.array<10x!fir.logical<4>>>) 157// CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 158// CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_8]]) {uniq_name = "x"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>) 159// CHECK: %[[VAL_10:.*]]:2 = hlfir.declare %[[VAL_2]](%[[VAL_6]]) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>) 160// CHECK: %[[VAL_11:.*]] = arith.constant 1 : index 161// CHECK: fir.do_loop %[[VAL_12:.*]] = %[[VAL_11]] to %[[VAL_5]] step %[[VAL_11]] { 162// CHECK: %[[VAL_13:.*]] = hlfir.designate %[[VAL_7]]#0 (%[[VAL_12]]) : (!fir.ref<!fir.array<10x!fir.logical<4>>>, index) -> !fir.ref<!fir.logical<4>> 163// CHECK: %[[VAL_14:.*]] = fir.load %[[VAL_13]] : !fir.ref<!fir.logical<4>> 164// CHECK: %[[VAL_15:.*]] = fir.convert %[[VAL_14]] : (!fir.logical<4>) -> i1 165// CHECK: fir.if %[[VAL_15]] { 166// CHECK: %[[VAL_16:.*]] = hlfir.designate %[[VAL_10]]#0 (%[[VAL_12]]) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64> 167// CHECK: %[[VAL_17:.*]] = fir.load %[[VAL_16]] : !fir.ref<i64> 168// CHECK: %[[VAL_18:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_17]]) : (!fir.ref<!fir.array<100xf32>>, i64) -> !fir.ref<f32> 169// CHECK: hlfir.assign %[[VAL_3]] to %[[VAL_18]] : f32, !fir.ref<f32> 170// CHECK: } 171// CHECK: } 172 173func.func @unordered(%arg0: !fir.ref<!fir.array<100xf32>> , %arg1: !fir.ref<!fir.array<10xi64>> , %arg2: !fir.ref<!fir.array<10xf32>> ) { 174 %c10 = arith.constant 10 : index 175 %c100 = arith.constant 100 : index 176 %0 = fir.shape %c100 : (index) -> !fir.shape<1> 177 %1:2 = hlfir.declare %arg0(%0) {uniq_name = "_QFsimpleEx"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>) 178 %2 = fir.shape %c10 : (index) -> !fir.shape<1> 179 %3:2 = hlfir.declare %arg1(%2) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>) 180 %4:2 = hlfir.declare %arg2(%2) {uniq_name = "z"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) 181 hlfir.region_assign { 182 hlfir.yield %4#0 : !fir.ref<!fir.array<10xf32>> 183 } to { 184 hlfir.elemental_addr %2 unordered : !fir.shape<1> { 185 ^bb0(%arg3: index): 186 %5 = hlfir.designate %3#0 (%arg3) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64> 187 %6 = fir.load %5 : !fir.ref<i64> 188 %7 = hlfir.designate %1#0 (%6) : (!fir.ref<!fir.array<100xf32>>, i64) -> !fir.ref<f32> 189 hlfir.yield %7 : !fir.ref<f32> 190 } 191 } 192 return 193} 194// CHECK-LABEL: func.func @unordered( 195// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<100xf32>>, 196// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.array<10xi64>>, 197// CHECK-SAME: %[[VAL_2:.*]]: !fir.ref<!fir.array<10xf32>>) { 198// CHECK: %[[VAL_3:.*]] = arith.constant 10 : index 199// CHECK: %[[VAL_4:.*]] = arith.constant 100 : index 200// CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1> 201// CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_5]]) {uniq_name = "_QFsimpleEx"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>) 202// CHECK: %[[VAL_7:.*]] = fir.shape %[[VAL_3]] : (index) -> !fir.shape<1> 203// CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_7]]) {uniq_name = "y"} : (!fir.ref<!fir.array<10xi64>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi64>>, !fir.ref<!fir.array<10xi64>>) 204// CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_2]](%[[VAL_7]]) {uniq_name = "z"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>) 205// CHECK: %[[VAL_10:.*]] = arith.constant 1 : index 206// CHECK: fir.do_loop %[[VAL_11:.*]] = %[[VAL_10]] to %[[VAL_3]] step %[[VAL_10]] unordered { 207// CHECK: %[[VAL_12:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[VAL_11]]) : (!fir.ref<!fir.array<10xi64>>, index) -> !fir.ref<i64> 208// CHECK: %[[VAL_13:.*]] = fir.load %[[VAL_12]] : !fir.ref<i64> 209// CHECK: %[[VAL_14:.*]] = hlfir.designate %[[VAL_6]]#0 (%[[VAL_13]]) : (!fir.ref<!fir.array<100xf32>>, i64) -> !fir.ref<f32> 210// CHECK: %[[VAL_15:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_11]]) : (!fir.ref<!fir.array<10xf32>>, index) -> !fir.ref<f32> 211// CHECK: hlfir.assign %[[VAL_15]] to %[[VAL_14]] : !fir.ref<f32>, !fir.ref<f32> 212// CHECK: } 213// CHECK: return 214// CHECK: } 215