1// Test code generation of hlfir.where, and hlfir.elsewhere when there 2// is no need to create temporary storage. 3// RUN: fir-opt %s --lower-hlfir-ordered-assignments | FileCheck %s 4 5func.func @test_simple(%arg0: !fir.box<!fir.array<?xf32>>, %arg1: !fir.box<!fir.array<?x!fir.logical<4>>>) { 6 %cst = arith.constant 4.200000e+01 : f32 7 %0:2 = hlfir.declare %arg1 {uniq_name = "mask"} : (!fir.box<!fir.array<?x!fir.logical<4>>>) -> (!fir.box<!fir.array<?x!fir.logical<4>>>, !fir.box<!fir.array<?x!fir.logical<4>>>) 8 %1:2 = hlfir.declare %arg0 {uniq_name = "x"} : (!fir.box<!fir.array<?xf32>>) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>) 9 hlfir.where { 10 hlfir.yield %0#0 : !fir.box<!fir.array<?x!fir.logical<4>>> 11 } do { 12 hlfir.region_assign { 13 hlfir.yield %cst : f32 14 } to { 15 hlfir.yield %1#0 : !fir.box<!fir.array<?xf32>> 16 } 17 } 18 return 19} 20// CHECK-LABEL: func.func @test_simple( 21// CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<?xf32>>, 22// CHECK-SAME: %[[VAL_1:.*]]: !fir.box<!fir.array<?x!fir.logical<4>>>) { 23// CHECK: %[[VAL_2:.*]] = arith.constant 4.200000e+01 : f32 24// CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_1]] {uniq_name = "mask"} : (!fir.box<!fir.array<?x!fir.logical<4>>>) -> (!fir.box<!fir.array<?x!fir.logical<4>>>, !fir.box<!fir.array<?x!fir.logical<4>>>) 25// CHECK: %[[VAL_4:.*]]:2 = hlfir.declare %[[VAL_0]] {uniq_name = "x"} : (!fir.box<!fir.array<?xf32>>) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>) 26// CHECK: %[[VAL_5:.*]] = arith.constant 0 : index 27// CHECK: %[[VAL_6:.*]]:3 = fir.box_dims %[[VAL_3]]#0, %[[VAL_5]] : (!fir.box<!fir.array<?x!fir.logical<4>>>, index) -> (index, index, index) 28// CHECK: %[[VAL_7:.*]] = fir.shape %[[VAL_6]]#1 : (index) -> !fir.shape<1> 29// CHECK: %[[VAL_8:.*]] = arith.constant 1 : index 30// CHECK: fir.do_loop %[[VAL_9:.*]] = %[[VAL_8]] to %[[VAL_6]]#1 step %[[VAL_8]] { 31// CHECK: %[[VAL_10:.*]] = hlfir.designate %[[VAL_3]]#0 (%[[VAL_9]]) : (!fir.box<!fir.array<?x!fir.logical<4>>>, index) -> !fir.ref<!fir.logical<4>> 32// CHECK: %[[VAL_11:.*]] = fir.load %[[VAL_10]] : !fir.ref<!fir.logical<4>> 33// CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_11]] : (!fir.logical<4>) -> i1 34// CHECK: fir.if %[[VAL_12]] { 35// CHECK: %[[VAL_13:.*]] = hlfir.designate %[[VAL_4]]#0 (%[[VAL_9]]) : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32> 36// CHECK: hlfir.assign %[[VAL_2]] to %[[VAL_13]] : f32, !fir.ref<f32> 37// CHECK: } 38// CHECK: } 39// CHECK: return 40// CHECK: } 41 42 43func.func @test_elsewhere(%arg0: !fir.ref<!fir.array<100xf32>>, %arg1: !fir.ref<!fir.array<100xf32>>, %arg2: !fir.ref<!fir.array<100xf32>>, %arg3: !fir.ref<!fir.array<100x!fir.logical<4>>>, %arg4: !fir.ref<!fir.array<100x!fir.logical<4>>> {fir.bindc_name = "mask2"}) { 44 %c100 = arith.constant 100 : index 45 %0 = fir.shape %c100 : (index) -> !fir.shape<1> 46 %1:2 = hlfir.declare %arg3(%0) {uniq_name = "mask"} : (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.ref<!fir.array<100x!fir.logical<4>>>) 47 %2:2 = hlfir.declare %arg4(%0) {uniq_name = "mask2"} : (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.ref<!fir.array<100x!fir.logical<4>>>) 48 %3:2 = hlfir.declare %arg0(%0) {uniq_name = "x"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>) 49 %4:2 = hlfir.declare %arg1(%0) {uniq_name = "y"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>) 50 %5:2 = hlfir.declare %arg2(%0) {uniq_name = "z"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>) 51 hlfir.where { 52 hlfir.yield %1#0 : !fir.ref<!fir.array<100x!fir.logical<4>>> 53 } do { 54 hlfir.region_assign { 55 hlfir.yield %4#0 : !fir.ref<!fir.array<100xf32>> 56 } to { 57 hlfir.yield %3#0 : !fir.ref<!fir.array<100xf32>> 58 } 59 hlfir.elsewhere mask { 60 hlfir.yield %2#0 : !fir.ref<!fir.array<100x!fir.logical<4>>> 61 } do { 62 hlfir.region_assign { 63 hlfir.yield %3#0 : !fir.ref<!fir.array<100xf32>> 64 } to { 65 hlfir.yield %4#0 : !fir.ref<!fir.array<100xf32>> 66 } 67 hlfir.elsewhere do { 68 hlfir.region_assign { 69 hlfir.yield %4#0 : !fir.ref<!fir.array<100xf32>> 70 } to { 71 hlfir.yield %5#0 : !fir.ref<!fir.array<100xf32>> 72 } 73 } 74 } 75 } 76 return 77} 78// CHECK-LABEL: func.func @test_elsewhere( 79// CHECK-SAME: %[[VAL_0:[^:]*]]: !fir.ref<!fir.array<100xf32>>, 80// CHECK-SAME: %[[VAL_1:[^:]*]]: !fir.ref<!fir.array<100xf32>>, 81// CHECK-SAME: %[[VAL_2:[^:]*]]: !fir.ref<!fir.array<100xf32>>, 82// CHECK-SAME: %[[VAL_3:[^:]*]]: !fir.ref<!fir.array<100x!fir.logical<4>>>, 83// CHECK-SAME: %[[VAL_4:[^:]*]]: !fir.ref<!fir.array<100x!fir.logical<4>>> {fir.bindc_name = "mask2"}) { 84// CHECK: %[[VAL_5:.*]] = arith.constant 100 : index 85// CHECK: %[[VAL_6:.*]] = fir.shape %[[VAL_5]] : (index) -> !fir.shape<1> 86// CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_3]](%[[VAL_6]]) {uniq_name = "mask"} : (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.ref<!fir.array<100x!fir.logical<4>>>) 87// CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_4]](%[[VAL_6]]) {uniq_name = "mask2"} : (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100x!fir.logical<4>>>, !fir.ref<!fir.array<100x!fir.logical<4>>>) 88// CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_6]]) {uniq_name = "x"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>) 89// CHECK: %[[VAL_10:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_6]]) {uniq_name = "y"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>) 90// CHECK: %[[VAL_11:.*]]:2 = hlfir.declare %[[VAL_2]](%[[VAL_6]]) {uniq_name = "z"} : (!fir.ref<!fir.array<100xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<100xf32>>, !fir.ref<!fir.array<100xf32>>) 91// CHECK: %[[VAL_12:.*]] = arith.constant 1 : index 92// CHECK: fir.do_loop %[[VAL_13:.*]] = %[[VAL_12]] to %[[VAL_5]] step %[[VAL_12]] { 93// CHECK: %[[VAL_14:.*]] = hlfir.designate %[[VAL_7]]#0 (%[[VAL_13]]) : (!fir.ref<!fir.array<100x!fir.logical<4>>>, index) -> !fir.ref<!fir.logical<4>> 94// CHECK: %[[VAL_15:.*]] = fir.load %[[VAL_14]] : !fir.ref<!fir.logical<4>> 95// CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (!fir.logical<4>) -> i1 96// CHECK: fir.if %[[VAL_16]] { 97// CHECK: %[[VAL_17:.*]] = hlfir.designate %[[VAL_10]]#0 (%[[VAL_13]]) : (!fir.ref<!fir.array<100xf32>>, index) -> !fir.ref<f32> 98// CHECK: %[[VAL_18:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_13]]) : (!fir.ref<!fir.array<100xf32>>, index) -> !fir.ref<f32> 99// CHECK: hlfir.assign %[[VAL_17]] to %[[VAL_18]] : !fir.ref<f32>, !fir.ref<f32> 100// CHECK: } 101// CHECK: } 102// CHECK: %[[VAL_19:.*]] = arith.constant 1 : index 103// CHECK: fir.do_loop %[[VAL_20:.*]] = %[[VAL_19]] to %[[VAL_5]] step %[[VAL_19]] { 104// CHECK: %[[VAL_21:.*]] = hlfir.designate %[[VAL_7]]#0 (%[[VAL_20]]) : (!fir.ref<!fir.array<100x!fir.logical<4>>>, index) -> !fir.ref<!fir.logical<4>> 105// CHECK: %[[VAL_22:.*]] = fir.load %[[VAL_21]] : !fir.ref<!fir.logical<4>> 106// CHECK: %[[VAL_23:.*]] = fir.convert %[[VAL_22]] : (!fir.logical<4>) -> i1 107// CHECK: fir.if %[[VAL_23]] { 108// CHECK: } else { 109// CHECK: %[[VAL_24:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[VAL_20]]) : (!fir.ref<!fir.array<100x!fir.logical<4>>>, index) -> !fir.ref<!fir.logical<4>> 110// CHECK: %[[VAL_25:.*]] = fir.load %[[VAL_24]] : !fir.ref<!fir.logical<4>> 111// CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (!fir.logical<4>) -> i1 112// CHECK: fir.if %[[VAL_26]] { 113// CHECK: %[[VAL_27:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_20]]) : (!fir.ref<!fir.array<100xf32>>, index) -> !fir.ref<f32> 114// CHECK: %[[VAL_28:.*]] = hlfir.designate %[[VAL_10]]#0 (%[[VAL_20]]) : (!fir.ref<!fir.array<100xf32>>, index) -> !fir.ref<f32> 115// CHECK: hlfir.assign %[[VAL_27]] to %[[VAL_28]] : !fir.ref<f32>, !fir.ref<f32> 116// CHECK: } 117// CHECK: } 118// CHECK: } 119// CHECK: %[[VAL_29:.*]] = arith.constant 1 : index 120// CHECK: fir.do_loop %[[VAL_30:.*]] = %[[VAL_29]] to %[[VAL_5]] step %[[VAL_29]] { 121// CHECK: %[[VAL_31:.*]] = hlfir.designate %[[VAL_7]]#0 (%[[VAL_30]]) : (!fir.ref<!fir.array<100x!fir.logical<4>>>, index) -> !fir.ref<!fir.logical<4>> 122// CHECK: %[[VAL_32:.*]] = fir.load %[[VAL_31]] : !fir.ref<!fir.logical<4>> 123// CHECK: %[[VAL_33:.*]] = fir.convert %[[VAL_32]] : (!fir.logical<4>) -> i1 124// CHECK: fir.if %[[VAL_33]] { 125// CHECK: } else { 126// CHECK: %[[VAL_34:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[VAL_30]]) : (!fir.ref<!fir.array<100x!fir.logical<4>>>, index) -> !fir.ref<!fir.logical<4>> 127// CHECK: %[[VAL_35:.*]] = fir.load %[[VAL_34]] : !fir.ref<!fir.logical<4>> 128// CHECK: %[[VAL_36:.*]] = fir.convert %[[VAL_35]] : (!fir.logical<4>) -> i1 129// CHECK: fir.if %[[VAL_36]] { 130// CHECK: } else { 131// CHECK: %[[VAL_37:.*]] = hlfir.designate %[[VAL_10]]#0 (%[[VAL_30]]) : (!fir.ref<!fir.array<100xf32>>, index) -> !fir.ref<f32> 132// CHECK: %[[VAL_38:.*]] = hlfir.designate %[[VAL_11]]#0 (%[[VAL_30]]) : (!fir.ref<!fir.array<100xf32>>, index) -> !fir.ref<f32> 133// CHECK: hlfir.assign %[[VAL_37]] to %[[VAL_38]] : !fir.ref<f32>, !fir.ref<f32> 134// CHECK: } 135// CHECK: } 136// CHECK: } 137// CHECK: return 138// CHECK: } 139 140func.func @expr_tree(%arg0: !fir.box<!fir.array<?xf32>>, %arg1: !fir.box<!fir.array<?xf32>>, %arg2: !fir.box<!fir.array<?x!fir.logical<4>>>) { 141 %cst = arith.constant 0.000000e+00 : f32 142 %c-1 = arith.constant -1 : index 143 %c1 = arith.constant 1 : index 144 %c10 = arith.constant 10 : index 145 %0:2 = hlfir.declare %arg2 {uniq_name = "mask"} : (!fir.box<!fir.array<?x!fir.logical<4>>>) -> (!fir.box<!fir.array<?x!fir.logical<4>>>, !fir.box<!fir.array<?x!fir.logical<4>>>) 146 %1:2 = hlfir.declare %arg0 {uniq_name = "x"} : (!fir.box<!fir.array<?xf32>>) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>) 147 %2:2 = hlfir.declare %arg1 {uniq_name = "y"} : (!fir.box<!fir.array<?xf32>>) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>) 148 hlfir.where { 149 %3 = fir.shape %c10 : (index) -> !fir.shape<1> 150 %4 = hlfir.designate %2#0 (%c10:%c1:%c-1) shape %3 : (!fir.box<!fir.array<?xf32>>, index, index, index, !fir.shape<1>) -> !fir.box<!fir.array<10xf32>> 151 %5 = hlfir.elemental %3 : (!fir.shape<1>) -> !hlfir.expr<10xf32> { 152 ^bb0(%arg3: index): 153 %9 = hlfir.designate %4 (%arg3) : (!fir.box<!fir.array<10xf32>>, index) -> !fir.ref<f32> 154 %10 = fir.load %9 : !fir.ref<f32> 155 %11 = math.absf %10 fastmath<contract> : f32 156 hlfir.yield_element %11 : f32 157 } 158 %6 = hlfir.elemental %3 : (!fir.shape<1>) -> !hlfir.expr<10x!fir.logical<4>> { 159 ^bb0(%arg3: index): 160 %9 = hlfir.apply %5, %arg3 : (!hlfir.expr<10xf32>, index) -> f32 161 %10 = arith.cmpf ogt, %9, %cst : f32 162 %11 = fir.convert %10 : (i1) -> !fir.logical<4> 163 hlfir.yield_element %11 : !fir.logical<4> 164 } 165 %7 = hlfir.elemental %3 : (!fir.shape<1>) -> !hlfir.expr<10x!fir.logical<4>> { 166 ^bb0(%arg3: index): 167 %9 = hlfir.apply %6, %arg3 : (!hlfir.expr<10x!fir.logical<4>>, index) -> !fir.logical<4> 168 %10 = hlfir.no_reassoc %9 : !fir.logical<4> 169 hlfir.yield_element %10 : !fir.logical<4> 170 } 171 %8 = hlfir.elemental %3 : (!fir.shape<1>) -> !hlfir.expr<10x!fir.logical<4>> { 172 ^bb0(%arg3: index): 173 %9 = hlfir.apply %7, %arg3 : (!hlfir.expr<10x!fir.logical<4>>, index) -> !fir.logical<4> 174 %10 = hlfir.designate %0#0 (%arg3) : (!fir.box<!fir.array<?x!fir.logical<4>>>, index) -> !fir.ref<!fir.logical<4>> 175 %11 = fir.load %10 : !fir.ref<!fir.logical<4>> 176 %12 = fir.convert %9 : (!fir.logical<4>) -> i1 177 %13 = fir.convert %11 : (!fir.logical<4>) -> i1 178 %14 = arith.andi %12, %13 : i1 179 %15 = fir.convert %14 : (i1) -> !fir.logical<4> 180 hlfir.yield_element %15 : !fir.logical<4> 181 } 182 hlfir.yield %8 : !hlfir.expr<10x!fir.logical<4>> cleanup { 183 hlfir.destroy %8 : !hlfir.expr<10x!fir.logical<4>> 184 hlfir.destroy %7 : !hlfir.expr<10x!fir.logical<4>> 185 hlfir.destroy %6 : !hlfir.expr<10x!fir.logical<4>> 186 hlfir.destroy %5 : !hlfir.expr<10xf32> 187 } 188 } do { 189 hlfir.region_assign { 190 hlfir.yield %2#0 : !fir.box<!fir.array<?xf32>> 191 } to { 192 hlfir.yield %1#0 : !fir.box<!fir.array<?xf32>> 193 } 194 } 195 return 196} 197// CHECK-LABEL: func.func @expr_tree( 198// CHECK-SAME: %[[VAL_0:[^:]*]]: !fir.box<!fir.array<?xf32>>, 199// CHECK-SAME: %[[VAL_1:[^:]*]]: !fir.box<!fir.array<?xf32>>, 200// CHECK-SAME: %[[VAL_2:.*]]: !fir.box<!fir.array<?x!fir.logical<4>>>) { 201// CHECK: %[[VAL_3:.*]] = arith.constant 0.000000e+00 : f32 202// CHECK: %[[VAL_4:.*]] = arith.constant -1 : index 203// CHECK: %[[VAL_5:.*]] = arith.constant 1 : index 204// CHECK: %[[VAL_6:.*]] = arith.constant 10 : index 205// CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_2]] {uniq_name = "mask"} : (!fir.box<!fir.array<?x!fir.logical<4>>>) -> (!fir.box<!fir.array<?x!fir.logical<4>>>, !fir.box<!fir.array<?x!fir.logical<4>>>) 206// CHECK: %[[VAL_8:.*]]:2 = hlfir.declare %[[VAL_0]] {uniq_name = "x"} : (!fir.box<!fir.array<?xf32>>) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>) 207// CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_1]] {uniq_name = "y"} : (!fir.box<!fir.array<?xf32>>) -> (!fir.box<!fir.array<?xf32>>, !fir.box<!fir.array<?xf32>>) 208// CHECK: %[[VAL_10:.*]] = fir.shape %[[VAL_6]] : (index) -> !fir.shape<1> 209// CHECK: %[[VAL_11:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_6]]:%[[VAL_5]]:%[[VAL_4]]) shape %[[VAL_10]] : (!fir.box<!fir.array<?xf32>>, index, index, index, !fir.shape<1>) -> !fir.box<!fir.array<10xf32>> 210// CHECK: %[[VAL_12:.*]] = arith.constant 1 : index 211// CHECK: fir.do_loop %[[VAL_13:.*]] = %[[VAL_12]] to %[[VAL_6]] step %[[VAL_12]] { 212// CHECK: %[[VAL_14:.*]] = hlfir.designate %[[VAL_11]] (%[[VAL_13]]) : (!fir.box<!fir.array<10xf32>>, index) -> !fir.ref<f32> 213// CHECK: %[[VAL_15:.*]] = fir.load %[[VAL_14]] : !fir.ref<f32> 214// CHECK: %[[VAL_16:.*]] = math.absf %[[VAL_15]] fastmath<contract> : f32 215// CHECK: %[[VAL_17:.*]] = arith.cmpf ogt, %[[VAL_16]], %[[VAL_3]] : f32 216// CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_17]] : (i1) -> !fir.logical<4> 217// CHECK: %[[VAL_19:.*]] = hlfir.no_reassoc %[[VAL_18]] : !fir.logical<4> 218// CHECK: %[[VAL_20:.*]] = hlfir.designate %[[VAL_7]]#0 (%[[VAL_13]]) : (!fir.box<!fir.array<?x!fir.logical<4>>>, index) -> !fir.ref<!fir.logical<4>> 219// CHECK: %[[VAL_21:.*]] = fir.load %[[VAL_20]] : !fir.ref<!fir.logical<4>> 220// CHECK: %[[VAL_22:.*]] = fir.convert %[[VAL_19]] : (!fir.logical<4>) -> i1 221// CHECK: %[[VAL_23:.*]] = fir.convert %[[VAL_21]] : (!fir.logical<4>) -> i1 222// CHECK: %[[VAL_24:.*]] = arith.andi %[[VAL_22]], %[[VAL_23]] : i1 223// CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_24]] : (i1) -> !fir.logical<4> 224// CHECK: %[[VAL_26:.*]] = fir.convert %[[VAL_25]] : (!fir.logical<4>) -> i1 225// CHECK: fir.if %[[VAL_26]] { 226// CHECK: %[[VAL_27:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_13]]) : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32> 227// CHECK: %[[VAL_28:.*]] = hlfir.designate %[[VAL_8]]#0 (%[[VAL_13]]) : (!fir.box<!fir.array<?xf32>>, index) -> !fir.ref<f32> 228// CHECK: hlfir.assign %[[VAL_27]] to %[[VAL_28]] : !fir.ref<f32>, !fir.ref<f32> 229// CHECK: } 230// CHECK: } 231// CHECK: return 232// CHECK: } 233 234func.func @inside_forall(%arg0: !fir.ref<!fir.array<10x20xf32>>, %arg1: !fir.ref<!fir.array<20xf32>>) { 235 %c1 = arith.constant 1 : index 236 %cst = arith.constant 0.000000e+00 : f32 237 %c10_i32 = arith.constant 10 : i32 238 %c1_i32 = arith.constant 1 : i32 239 %c10 = arith.constant 10 : index 240 %c20 = arith.constant 20 : index 241 %0 = fir.shape %c10, %c20 : (index, index) -> !fir.shape<2> 242 %1:2 = hlfir.declare %arg0(%0) {uniq_name = "x"} : (!fir.ref<!fir.array<10x20xf32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<10x20xf32>>, !fir.ref<!fir.array<10x20xf32>>) 243 %2 = fir.shape %c20 : (index) -> !fir.shape<1> 244 %3:2 = hlfir.declare %arg1(%2) {uniq_name = "y"} : (!fir.ref<!fir.array<20xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<20xf32>>, !fir.ref<!fir.array<20xf32>>) 245 hlfir.forall lb { 246 hlfir.yield %c1_i32 : i32 247 } ub { 248 hlfir.yield %c10_i32 : i32 249 } (%arg2: i32) { 250 hlfir.where { 251 %4 = hlfir.elemental %2 : (!fir.shape<1>) -> !hlfir.expr<20x!fir.logical<4>> { 252 ^bb0(%arg3: index): 253 %5 = hlfir.designate %3#0 (%arg3) : (!fir.ref<!fir.array<20xf32>>, index) -> !fir.ref<f32> 254 %6 = fir.load %5 : !fir.ref<f32> 255 %7 = arith.cmpf ogt, %6, %cst : f32 256 %8 = fir.convert %7 : (i1) -> !fir.logical<4> 257 hlfir.yield_element %8 : !fir.logical<4> 258 } 259 hlfir.yield %4 : !hlfir.expr<20x!fir.logical<4>> cleanup { 260 hlfir.destroy %4 : !hlfir.expr<20x!fir.logical<4>> 261 } 262 } do { 263 hlfir.region_assign { 264 hlfir.yield %3#0 : !fir.ref<!fir.array<20xf32>> 265 } to { 266 %4 = fir.convert %arg2 : (i32) -> i64 267 %5 = hlfir.designate %1#0 (%4, %c1:%c20:%c1) shape %2 : (!fir.ref<!fir.array<10x20xf32>>, i64, index, index, index, !fir.shape<1>) -> !fir.box<!fir.array<20xf32>> 268 hlfir.yield %5 : !fir.box<!fir.array<20xf32>> 269 } 270 } 271 } 272 return 273} 274// CHECK-LABEL: func.func @inside_forall( 275// CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<!fir.array<10x20xf32>>, 276// CHECK-SAME: %[[VAL_1:.*]]: !fir.ref<!fir.array<20xf32>>) { 277// CHECK: %[[VAL_2:.*]] = arith.constant 1 : index 278// CHECK: %[[VAL_3:.*]] = arith.constant 0.000000e+00 : f32 279// CHECK: %[[VAL_4:.*]] = arith.constant 10 : i32 280// CHECK: %[[VAL_5:.*]] = arith.constant 1 : i32 281// CHECK: %[[VAL_6:.*]] = arith.constant 10 : index 282// CHECK: %[[VAL_7:.*]] = arith.constant 20 : index 283// CHECK: %[[VAL_8:.*]] = fir.shape %[[VAL_6]], %[[VAL_7]] : (index, index) -> !fir.shape<2> 284// CHECK: %[[VAL_9:.*]]:2 = hlfir.declare %[[VAL_0]](%[[VAL_8]]) {uniq_name = "x"} : (!fir.ref<!fir.array<10x20xf32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<10x20xf32>>, !fir.ref<!fir.array<10x20xf32>>) 285// CHECK: %[[VAL_10:.*]] = fir.shape %[[VAL_7]] : (index) -> !fir.shape<1> 286// CHECK: %[[VAL_11:.*]]:2 = hlfir.declare %[[VAL_1]](%[[VAL_10]]) {uniq_name = "y"} : (!fir.ref<!fir.array<20xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<20xf32>>, !fir.ref<!fir.array<20xf32>>) 287// CHECK: %[[VAL_12:.*]] = fir.convert %[[VAL_5]] : (i32) -> index 288// CHECK: %[[VAL_13:.*]] = fir.convert %[[VAL_4]] : (i32) -> index 289// CHECK: %[[VAL_14:.*]] = arith.constant 1 : index 290// CHECK: fir.do_loop %[[VAL_15:.*]] = %[[VAL_12]] to %[[VAL_13]] step %[[VAL_14]] { 291// CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (index) -> i32 292// CHECK: %[[VAL_17:.*]] = arith.constant 1 : index 293// CHECK: fir.do_loop %[[VAL_20:.*]] = %[[VAL_17]] to %[[VAL_7]] step %[[VAL_17]] { 294// CHECK: %[[VAL_21:.*]] = hlfir.designate %[[VAL_11]]#0 (%[[VAL_20]]) : (!fir.ref<!fir.array<20xf32>>, index) -> !fir.ref<f32> 295// CHECK: %[[VAL_22:.*]] = fir.load %[[VAL_21]] : !fir.ref<f32> 296// CHECK: %[[VAL_23:.*]] = arith.cmpf ogt, %[[VAL_22]], %[[VAL_3]] : f32 297// CHECK: %[[VAL_24:.*]] = fir.convert %[[VAL_23]] : (i1) -> !fir.logical<4> 298// CHECK: %[[VAL_25:.*]] = fir.convert %[[VAL_24]] : (!fir.logical<4>) -> i1 299// CHECK: fir.if %[[VAL_25]] { 300// CHECK: %[[VAL_26:.*]] = hlfir.designate %[[VAL_11]]#0 (%[[VAL_20]]) : (!fir.ref<!fir.array<20xf32>>, index) -> !fir.ref<f32> 301// CHECK: %[[VAL_18:.*]] = fir.convert %[[VAL_16]] : (i32) -> i64 302// CHECK: %[[VAL_19:.*]] = hlfir.designate %[[VAL_9]]#0 (%[[VAL_18]], %[[VAL_2]]:%[[VAL_7]]:%[[VAL_2]]) shape %[[VAL_10]] : (!fir.ref<!fir.array<10x20xf32>>, i64, index, index, index, !fir.shape<1>) -> !fir.box<!fir.array<20xf32>> 303// CHECK: %[[VAL_27:.*]] = hlfir.designate %[[VAL_19]] (%[[VAL_20]]) : (!fir.box<!fir.array<20xf32>>, index) -> !fir.ref<f32> 304// CHECK: hlfir.assign %[[VAL_26]] to %[[VAL_27]] : !fir.ref<f32>, !fir.ref<f32> 305// CHECK: } 306// CHECK: } 307// CHECK: } 308// CHECK: return 309// CHECK: } 310