317 lines · plain
1// RUN: fir-opt %s --fir-acc-recipe-bufferization -split-input-file | FileCheck %s2 3// -----4 5acc.private.recipe @priv_ref_box : !fir.box<i32> init {6^bb0(%arg0: !fir.box<i32>):7 %1 = fir.allocmem i328 %2 = fir.embox %1 : (!fir.heap<i32>) -> !fir.box<i32>9 acc.yield %2 : !fir.box<i32>10} destroy {11^bb0(%arg0: !fir.box<i32>, %arg1: !fir.box<i32>):12 %0 = fir.box_addr %arg1 : (!fir.box<i32>) -> !fir.ref<i32>13 %1 = fir.convert %0 : (!fir.ref<i32>) -> !fir.heap<i32>14 fir.freemem %1 : !fir.heap<i32>15 acc.yield16}17 18// CHECK-LABEL: acc.private.recipe @priv_ref_box : !fir.ref<!fir.box<i32>> init19// CHECK: ^bb0(%[[ARG:.*]]: !fir.ref<!fir.box<i32>>)20// CHECK: %[[EMBOX:.*]] = fir.embox21// CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.box<i32>22// CHECK: fir.store %[[EMBOX]] to %[[ALLOCA]] : !fir.ref<!fir.box<i32>>23// CHECK: acc.yield %[[ALLOCA]] : !fir.ref<!fir.box<i32>>24// CHECK: } destroy {25// CHECK: ^bb0(%[[DARG0:.*]]: !fir.ref<!fir.box<i32>>, %[[DARG1:.*]]: !fir.ref<!fir.box<i32>>)26// CHECK: %[[LD1:.*]] = fir.load %[[DARG1]] : !fir.ref<!fir.box<i32>>27// CHECK: %[[ADDR:.*]] = fir.box_addr %[[LD1]] : (!fir.box<i32>) -> !fir.ref<i32>28// CHECK: %[[CVT:.*]] = fir.convert %[[ADDR]] : (!fir.ref<i32>) -> !fir.heap<i32>29 30// -----31 32// Test private recipe without destroy region.33 34acc.private.recipe @priv_ref_box_no_destroy : !fir.box<i32> init {35^bb0(%arg0: !fir.box<i32>):36 %1 = fir.alloca i3237 %2 = fir.embox %1 : (!fir.ref<i32>) -> !fir.box<i32>38 acc.yield %2 : !fir.box<i32>39}40 41// CHECK-LABEL: acc.private.recipe @priv_ref_box_no_destroy : !fir.ref<!fir.box<i32>> init42// CHECK: ^bb0(%[[ARG:.*]]: !fir.ref<!fir.box<i32>>)43// CHECK: %[[EMBOX:.*]] = fir.embox44// CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.box<i32>45// CHECK: fir.store %[[EMBOX]] to %[[ALLOCA]] : !fir.ref<!fir.box<i32>>46// CHECK: acc.yield %[[ALLOCA]] : !fir.ref<!fir.box<i32>>47// CHECK: }48 49// -----50 51// Firstprivate recipe with destroy region.52acc.firstprivate.recipe @fp_ref_box : !fir.box<i32> init {53^bb0(%arg0: !fir.box<i32>):54 %0 = fir.allocmem i3255 %1 = fir.embox %0 : (!fir.heap<i32>) -> !fir.box<i32>56 acc.yield %1 : !fir.box<i32>57} copy {58^bb0(%src: !fir.box<i32>, %dst: !fir.box<i32>):59 %s_addr = fir.box_addr %src : (!fir.box<i32>) -> !fir.ref<i32>60 %val = fir.load %s_addr : !fir.ref<i32>61 %d_addr = fir.box_addr %dst : (!fir.box<i32>) -> !fir.ref<i32>62 fir.store %val to %d_addr : !fir.ref<i32>63 acc.yield64} destroy {65^bb0(%arg0: !fir.box<i32>, %arg1: !fir.box<i32>):66 acc.yield67}68 69// CHECK-LABEL: acc.firstprivate.recipe @fp_ref_box : !fir.ref<!fir.box<i32>> init70// CHECK: ^bb0(%[[IARG:.*]]: !fir.ref<!fir.box<i32>>)71// CHECK: %[[EMBOX_FP:.*]] = fir.embox72// CHECK: %[[ALLOCA_FP:.*]] = fir.alloca !fir.box<i32>73// CHECK: fir.store %[[EMBOX_FP]] to %[[ALLOCA_FP]] : !fir.ref<!fir.box<i32>>74// CHECK: acc.yield %[[ALLOCA_FP]] : !fir.ref<!fir.box<i32>>75// CHECK: } copy {76// CHECK: ^bb0(%[[SRC:.*]]: !fir.ref<!fir.box<i32>>, %[[DST:.*]]: !fir.ref<!fir.box<i32>>)77// CHECK: %[[LSRC:.*]] = fir.load %[[SRC]] : !fir.ref<!fir.box<i32>>78// CHECK: %[[LDST:.*]] = fir.load %[[DST]] : !fir.ref<!fir.box<i32>>79// CHECK: %[[SADDR:.*]] = fir.box_addr %[[LSRC]] : (!fir.box<i32>) -> !fir.ref<i32>80// CHECK: %[[VAL:.*]] = fir.load %[[SADDR]] : !fir.ref<i32>81// CHECK: %[[DADDR:.*]] = fir.box_addr %[[LDST]] : (!fir.box<i32>) -> !fir.ref<i32>82// CHECK: fir.store %[[VAL]] to %[[DADDR]] : !fir.ref<i32>83// CHECK: } destroy {84// CHECK: ^bb0(%[[FDARG0:.*]]: !fir.ref<!fir.box<i32>>, %[[FDARG1:.*]]: !fir.ref<!fir.box<i32>>)85 86// -----87 88// Firstprivate recipe without destroy region.89acc.firstprivate.recipe @fp_ref_box_no_destroy : !fir.box<i32> init {90^bb0(%arg0: !fir.box<i32>):91 %0 = fir.alloca i3292 %1 = fir.embox %0 : (!fir.ref<i32>) -> !fir.box<i32>93 acc.yield %1 : !fir.box<i32>94} copy {95^bb0(%src: !fir.box<i32>, %dst: !fir.box<i32>):96 %s_addr = fir.box_addr %src : (!fir.box<i32>) -> !fir.ref<i32>97 %val = fir.load %s_addr : !fir.ref<i32>98 %d_addr = fir.box_addr %dst : (!fir.box<i32>) -> !fir.ref<i32>99 fir.store %val to %d_addr : !fir.ref<i32>100 acc.yield101}102 103// CHECK-LABEL: acc.firstprivate.recipe @fp_ref_box_no_destroy : !fir.ref<!fir.box<i32>> init104// CHECK: ^bb0(%[[IARG2:.*]]: !fir.ref<!fir.box<i32>>)105// CHECK: %[[EMBOX_FP2:.*]] = fir.embox106// CHECK: %[[ALLOCA_FP2:.*]] = fir.alloca !fir.box<i32>107// CHECK: fir.store %[[EMBOX_FP2]] to %[[ALLOCA_FP2]] : !fir.ref<!fir.box<i32>>108// CHECK: acc.yield %[[ALLOCA_FP2]] : !fir.ref<!fir.box<i32>>109// CHECK: } copy {110// CHECK: ^bb0(%[[SRC2:.*]]: !fir.ref<!fir.box<i32>>, %[[DST2:.*]]: !fir.ref<!fir.box<i32>>)111// CHECK: %[[LSRC2:.*]] = fir.load %[[SRC2]] : !fir.ref<!fir.box<i32>>112// CHECK: %[[LDST2:.*]] = fir.load %[[DST2]] : !fir.ref<!fir.box<i32>>113// CHECK: %[[SADDR2:.*]] = fir.box_addr %[[LSRC2]] : (!fir.box<i32>) -> !fir.ref<i32>114// CHECK: %[[VAL2:.*]] = fir.load %[[SADDR2]] : !fir.ref<i32>115// CHECK: %[[DADDR2:.*]] = fir.box_addr %[[LDST2]] : (!fir.box<i32>) -> !fir.ref<i32>116// CHECK: fir.store %[[VAL2]] to %[[DADDR2]] : !fir.ref<i32>117 118// -----119 120// Reduction recipe with destroy region.121acc.reduction.recipe @red_ref_box : !fir.box<i32> reduction_operator <add> init {122^bb0(%arg0: !fir.box<i32>):123 %0 = fir.allocmem i32124 %1 = fir.embox %0 : (!fir.heap<i32>) -> !fir.box<i32>125 acc.yield %1 : !fir.box<i32>126} combiner {127^bb0(%lhs: !fir.box<i32>, %rhs: !fir.box<i32>):128 %l_addr = fir.box_addr %lhs : (!fir.box<i32>) -> !fir.ref<i32>129 %l_val = fir.load %l_addr : !fir.ref<i32>130 %r_addr = fir.box_addr %rhs : (!fir.box<i32>) -> !fir.ref<i32>131 %r_val = fir.load %r_addr : !fir.ref<i32>132 %sum = arith.addi %l_val, %r_val : i32133 %tmp = fir.alloca i32134 fir.store %sum to %tmp : !fir.ref<i32>135 %new = fir.embox %tmp : (!fir.ref<i32>) -> !fir.box<i32>136 acc.yield %new : !fir.box<i32>137} destroy {138^bb0(%arg0: !fir.box<i32>, %arg1: !fir.box<i32>):139 acc.yield140}141 142// CHECK-LABEL: acc.reduction.recipe @red_ref_box : !fir.ref<!fir.box<i32>> reduction_operator <add> init143// CHECK: ^bb0(%[[IARGR:.*]]: !fir.ref<!fir.box<i32>>)144// CHECK: %[[EMBOXR:.*]] = fir.embox145// CHECK: %[[ALLOCAR:.*]] = fir.alloca !fir.box<i32>146// CHECK: fir.store %[[EMBOXR]] to %[[ALLOCAR]] : !fir.ref<!fir.box<i32>>147// CHECK: acc.yield %[[ALLOCAR]] : !fir.ref<!fir.box<i32>>148// CHECK: } combiner {149// CHECK: ^bb0(%[[LHS:.*]]: !fir.ref<!fir.box<i32>>, %[[RHS:.*]]: !fir.ref<!fir.box<i32>>)150// CHECK: %[[LLHS:.*]] = fir.load %[[LHS]] : !fir.ref<!fir.box<i32>>151// CHECK: %[[LRHS:.*]] = fir.load %[[RHS]] : !fir.ref<!fir.box<i32>>152// CHECK: %[[LADDR:.*]] = fir.box_addr %[[LLHS]] : (!fir.box<i32>) -> !fir.ref<i32>153// CHECK: %[[LVAL:.*]] = fir.load %[[LADDR]] : !fir.ref<i32>154// CHECK: %[[RADDR:.*]] = fir.box_addr %[[LRHS]] : (!fir.box<i32>) -> !fir.ref<i32>155// CHECK: %[[RVAL:.*]] = fir.load %[[RADDR]] : !fir.ref<i32>156// CHECK: %[[SUM:.*]] = arith.addi %[[LVAL]], %[[RVAL]] : i32157// CHECK: %[[I32ALLOCA:.*]] = fir.alloca i32158// CHECK: fir.store %[[SUM]] to %[[I32ALLOCA]] : !fir.ref<i32>159// CHECK: %[[NEWBOX:.*]] = fir.embox %[[I32ALLOCA]] : (!fir.ref<i32>) -> !fir.box<i32>160// CHECK: %[[BOXALLOCA:.*]] = fir.alloca !fir.box<i32>161// CHECK: fir.store %[[NEWBOX]] to %[[BOXALLOCA]] : !fir.ref<!fir.box<i32>>162// CHECK: acc.yield %[[BOXALLOCA]] : !fir.ref<!fir.box<i32>>163// CHECK: } destroy {164// CHECK: ^bb0(%[[RD0:.*]]: !fir.ref<!fir.box<i32>>, %[[RD1:.*]]: !fir.ref<!fir.box<i32>>)165 166// -----167 168// Reduction recipe without destroy region.169acc.reduction.recipe @red_ref_box_no_destroy : !fir.box<i32> reduction_operator <add> init {170^bb0(%arg0: !fir.box<i32>):171 %0 = fir.alloca i32172 %1 = fir.embox %0 : (!fir.ref<i32>) -> !fir.box<i32>173 acc.yield %1 : !fir.box<i32>174} combiner {175^bb0(%lhs: !fir.box<i32>, %rhs: !fir.box<i32>):176 %l_addr = fir.box_addr %lhs : (!fir.box<i32>) -> !fir.ref<i32>177 %l_val = fir.load %l_addr : !fir.ref<i32>178 %r_addr = fir.box_addr %rhs : (!fir.box<i32>) -> !fir.ref<i32>179 %r_val = fir.load %r_addr : !fir.ref<i32>180 %sum = arith.addi %l_val, %r_val : i32181 %tmp = fir.alloca i32182 fir.store %sum to %tmp : !fir.ref<i32>183 %new = fir.embox %tmp : (!fir.ref<i32>) -> !fir.box<i32>184 acc.yield %new : !fir.box<i32>185}186 187// CHECK-LABEL: acc.reduction.recipe @red_ref_box_no_destroy : !fir.ref<!fir.box<i32>> reduction_operator <add> init188// CHECK: ^bb0(%[[IARGR2:.*]]: !fir.ref<!fir.box<i32>>)189// CHECK: %[[EMBOXR2:.*]] = fir.embox190// CHECK: %[[ALLOCAR2:.*]] = fir.alloca !fir.box<i32>191// CHECK: fir.store %[[EMBOXR2]] to %[[ALLOCAR2]] : !fir.ref<!fir.box<i32>>192// CHECK: acc.yield %[[ALLOCAR2]] : !fir.ref<!fir.box<i32>>193// CHECK: } combiner {194// CHECK: ^bb0(%[[LHS2:.*]]: !fir.ref<!fir.box<i32>>, %[[RHS2:.*]]: !fir.ref<!fir.box<i32>>)195// CHECK: %[[LLHS2:.*]] = fir.load %[[LHS2]] : !fir.ref<!fir.box<i32>>196// CHECK: %[[LRHS2:.*]] = fir.load %[[RHS2]] : !fir.ref<!fir.box<i32>>197// CHECK: %[[LADDR2:.*]] = fir.box_addr %[[LLHS2]] : (!fir.box<i32>) -> !fir.ref<i32>198// CHECK: %[[LVAL2:.*]] = fir.load %[[LADDR2]] : !fir.ref<i32>199// CHECK: %[[RADDR2:.*]] = fir.box_addr %[[LRHS2]] : (!fir.box<i32>) -> !fir.ref<i32>200// CHECK: %[[RVAL2:.*]] = fir.load %[[RADDR2]] : !fir.ref<i32>201// CHECK: %[[SUM2:.*]] = arith.addi %[[LVAL2]], %[[RVAL2]] : i32202// CHECK: %[[I32ALLOCA2:.*]] = fir.alloca i32203// CHECK: fir.store %[[SUM2]] to %[[I32ALLOCA2]] : !fir.ref<i32>204// CHECK: %[[NEWBOX2:.*]] = fir.embox %[[I32ALLOCA2]] : (!fir.ref<i32>) -> !fir.box<i32>205// CHECK: %[[BOXALLOCA2:.*]] = fir.alloca !fir.box<i32>206// CHECK: fir.store %[[NEWBOX2]] to %[[BOXALLOCA2]] : !fir.ref<!fir.box<i32>>207// CHECK: acc.yield %[[BOXALLOCA2]] : !fir.ref<!fir.box<i32>>208 209// -----210 211// Comprehensive tests that also test recipe usages updates.212 213acc.private.recipe @privatization_ref_i32 : !fir.ref<i32> init {214^bb0(%arg0: !fir.ref<i32>):215 %0 = fir.alloca i32216 %1 = fir.declare %0 {uniq_name = "acc.private.init"} : (!fir.ref<i32>) -> !fir.ref<i32>217 acc.yield %1 : !fir.ref<i32>218}219acc.private.recipe @privatization_box_Uxf32 : !fir.box<!fir.array<?xf32>> init {220^bb0(%arg0: !fir.box<!fir.array<?xf32>>):221 %c0 = arith.constant 0 : index222 %0:3 = fir.box_dims %arg0, %c0 : (!fir.box<!fir.array<?xf32>>, index) -> (index, index, index)223 %1 = fir.shape %0#1 : (index) -> !fir.shape<1>224 %2 = fir.allocmem !fir.array<?xf32>, %0#1 {bindc_name = ".tmp", uniq_name = ""}225 %3 = fir.declare %2(%1) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<?xf32>>, !fir.shape<1>) -> !fir.heap<!fir.array<?xf32>>226 %4 = fir.embox %3(%1) : (!fir.heap<!fir.array<?xf32>>, !fir.shape<1>) -> !fir.box<!fir.array<?xf32>>227 acc.yield %4 : !fir.box<!fir.array<?xf32>>228} destroy {229^bb0(%arg0: !fir.box<!fir.array<?xf32>>, %arg1: !fir.box<!fir.array<?xf32>>):230 %0 = fir.box_addr %arg1 : (!fir.box<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>>231 %1 = fir.convert %0 : (!fir.ref<!fir.array<?xf32>>) -> !fir.heap<!fir.array<?xf32>>232 fir.freemem %1 : !fir.heap<!fir.array<?xf32>>233 acc.terminator234}235func.func @_QPfoo(%arg0: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "x"}) {236 %c200_i32 = arith.constant 200 : i32237 %c1_i32 = arith.constant 1 : i32238 %0 = fir.dummy_scope : !fir.dscope239 %1 = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFfooEi"}240 %2 = fir.declare %1 {uniq_name = "_QFfooEi"} : (!fir.ref<i32>) -> !fir.ref<i32>241 %3 = fir.declare %arg0 dummy_scope %0 {uniq_name = "_QFfooEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>242 acc.parallel combined(loop) {243 %4 = acc.private var(%3 : !fir.box<!fir.array<?xf32>>) recipe(@privatization_box_Uxf32) -> !fir.box<!fir.array<?xf32>> {name = "x"}244 %5 = acc.private varPtr(%2 : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}245 acc.loop combined(parallel) private(%4, %5 : !fir.box<!fir.array<?xf32>>, !fir.ref<i32>) control(%arg1 : i32) = (%c1_i32 : i32) to (%c200_i32 : i32) step (%c1_i32 : i32) {246 %6 = fir.dummy_scope : !fir.dscope247 %7 = fir.declare %4 dummy_scope %6 {uniq_name = "_QFfooEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>248 %8 = fir.declare %5 {uniq_name = "_QFfooEi"} : (!fir.ref<i32>) -> !fir.ref<i32>249 %9 = fir.convert %arg1 : (i32) -> f32250 %10 = fir.convert %arg1 : (i32) -> i64251 %11 = fir.array_coor %7 %10 : (!fir.box<!fir.array<?xf32>>, i64) -> !fir.ref<f32>252 fir.store %9 to %11 : !fir.ref<f32>253 acc.yield254 } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}255 acc.yield256 }257 return258}259 260// CHECK-LABEL: acc.private.recipe @privatization_ref_i32 : !fir.ref<i32> init {261// CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<i32>):262// CHECK: %[[VAL_1:.*]] = fir.alloca i32263// CHECK: %[[VAL_2:.*]] = fir.declare %[[VAL_1]] {uniq_name = "acc.private.init"} : (!fir.ref<i32>) -> !fir.ref<i32>264// CHECK: acc.yield %[[VAL_2]] : !fir.ref<i32>265// CHECK: }266 267// CHECK-LABEL: acc.private.recipe @privatization_box_Uxf32 : !fir.ref<!fir.box<!fir.array<?xf32>>> init {268// CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<?xf32>>>):269// CHECK: %[[VAL_1:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<?xf32>>>270// CHECK: %[[VAL_2:.*]] = arith.constant 0 : index271// CHECK: %[[VAL_3:.*]]:3 = fir.box_dims %[[VAL_1]], %[[VAL_2]] : (!fir.box<!fir.array<?xf32>>, index) -> (index, index, index)272// CHECK: %[[VAL_4:.*]] = fir.shape %[[VAL_3]]#1 : (index) -> !fir.shape<1>273// CHECK: %[[VAL_5:.*]] = fir.allocmem !fir.array<?xf32>, %[[VAL_3]]#1 {bindc_name = ".tmp", uniq_name = ""}274// CHECK: %[[VAL_6:.*]] = fir.declare %[[VAL_5]](%[[VAL_4]]) {uniq_name = ".tmp"} : (!fir.heap<!fir.array<?xf32>>, !fir.shape<1>) -> !fir.heap<!fir.array<?xf32>>275// CHECK: %[[VAL_7:.*]] = fir.embox %[[VAL_6]](%[[VAL_4]]) : (!fir.heap<!fir.array<?xf32>>, !fir.shape<1>) -> !fir.box<!fir.array<?xf32>>276// CHECK: %[[VAL_8:.*]] = fir.alloca !fir.box<!fir.array<?xf32>>277// CHECK: fir.store %[[VAL_7]] to %[[VAL_8]] : !fir.ref<!fir.box<!fir.array<?xf32>>>278// CHECK: acc.yield %[[VAL_8]] : !fir.ref<!fir.box<!fir.array<?xf32>>>279 280// CHECK-LABEL: } destroy {281// CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<?xf32>>>, %[[VAL_1:.*]]: !fir.ref<!fir.box<!fir.array<?xf32>>>):282// CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.array<?xf32>>>283// CHECK: %[[VAL_3:.*]] = fir.box_addr %[[VAL_2]] : (!fir.box<!fir.array<?xf32>>) -> !fir.ref<!fir.array<?xf32>>284// CHECK: %[[VAL_4:.*]] = fir.convert %[[VAL_3]] : (!fir.ref<!fir.array<?xf32>>) -> !fir.heap<!fir.array<?xf32>>285// CHECK: fir.freemem %[[VAL_4]] : !fir.heap<!fir.array<?xf32>>286// CHECK: acc.terminator287// CHECK: }288 289// CHECK-LABEL: func.func @_QPfoo(290// CHECK-SAME: %[[ARG0:.*]]: !fir.box<!fir.array<?xf32>> {fir.bindc_name = "x"}) {291// CHECK: %[[VAL_0:.*]] = arith.constant 200 : i32292// CHECK: %[[VAL_1:.*]] = arith.constant 1 : i32293// CHECK: %[[VAL_2:.*]] = fir.dummy_scope : !fir.dscope294// CHECK: %[[VAL_3:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFfooEi"}295// CHECK: %[[VAL_4:.*]] = fir.declare %[[VAL_3]] {uniq_name = "_QFfooEi"} : (!fir.ref<i32>) -> !fir.ref<i32>296// CHECK: %[[VAL_5:.*]] = fir.declare %[[ARG0]] dummy_scope %[[VAL_2]] {uniq_name = "_QFfooEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>297// CHECK: %[[VAL_6:.*]] = fir.alloca !fir.box<!fir.array<?xf32>>298// CHECK: fir.store %[[VAL_5]] to %[[VAL_6]] : !fir.ref<!fir.box<!fir.array<?xf32>>>299// CHECK: acc.parallel combined(loop) {300// CHECK: %[[VAL_7:.*]] = acc.private varPtr(%[[VAL_6]] : !fir.ref<!fir.box<!fir.array<?xf32>>>) recipe(@privatization_box_Uxf32) -> !fir.ref<!fir.box<!fir.array<?xf32>>> {name = "x"}301// CHECK: %[[VAL_8:.*]] = acc.private varPtr(%[[VAL_4]] : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}302// CHECK: acc.loop combined(parallel) private(%[[VAL_7]], %[[VAL_8]] : !fir.ref<!fir.box<!fir.array<?xf32>>>, !fir.ref<i32>) control(%[[VAL_9:.*]] : i32) = (%[[VAL_1]] : i32) to (%[[VAL_0]] : i32) step (%[[VAL_1]] : i32) {303// CHECK: %[[VAL_10:.*]] = fir.dummy_scope : !fir.dscope304// CHECK: %[[VAL_11:.*]] = fir.load %[[VAL_7]] : !fir.ref<!fir.box<!fir.array<?xf32>>>305// CHECK: %[[VAL_12:.*]] = fir.declare %[[VAL_11]] dummy_scope %[[VAL_10]] {uniq_name = "_QFfooEx"} : (!fir.box<!fir.array<?xf32>>, !fir.dscope) -> !fir.box<!fir.array<?xf32>>306// CHECK: %[[VAL_13:.*]] = fir.declare %[[VAL_8]] {uniq_name = "_QFfooEi"} : (!fir.ref<i32>) -> !fir.ref<i32>307// CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_9]] : (i32) -> f32308// CHECK: %[[VAL_15:.*]] = fir.convert %[[VAL_9]] : (i32) -> i64309// CHECK: %[[VAL_16:.*]] = fir.array_coor %[[VAL_12]] %[[VAL_15]] : (!fir.box<!fir.array<?xf32>>, i64) -> !fir.ref<f32>310// CHECK: fir.store %[[VAL_14]] to %[[VAL_16]] : !fir.ref<f32>311// CHECK: acc.yield312// CHECK: } attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}313// CHECK: acc.yield314// CHECK: }315// CHECK: return316// CHECK: }317