|
| 1 | +// Tests that for `boxchar` local values, we use the value yielded by the `init` |
| 2 | +// region rather than the local allocated storage. |
| 3 | + |
| 4 | +// RUN: fir-opt --split-input-file --simplify-fir-operations %s | FileCheck %s |
| 5 | + |
| 6 | +fir.local {type = local} @_QFtestEx_private_boxchar_c8xU : !fir.boxchar<1> init { |
| 7 | +^bb0(%arg0: !fir.boxchar<1>, %arg1: !fir.boxchar<1>): |
| 8 | + %0:2 = fir.unboxchar %arg0 : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) |
| 9 | + %1 = fir.allocmem !fir.char<1,?>(%0#1 : index) {bindc_name = "", uniq_name = ""} |
| 10 | + %2 = fir.emboxchar %1, %0#1 : (!fir.heap<!fir.char<1,?>>, index) -> !fir.boxchar<1> |
| 11 | + fir.yield(%2 : !fir.boxchar<1>) |
| 12 | +} dealloc { |
| 13 | +^bb0(%arg0: !fir.boxchar<1>): |
| 14 | + %0:2 = fir.unboxchar %arg0 : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) |
| 15 | + %1 = fir.convert %0#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.heap<!fir.char<1,?>> |
| 16 | + fir.freemem %1 : !fir.heap<!fir.char<1,?>> |
| 17 | + fir.yield |
| 18 | +} |
| 19 | +func.func @_QPtest(%arg0: !fir.boxchar<1> {fir.bindc_name = "x"}) { |
| 20 | + %0 = fir.dummy_scope : !fir.dscope |
| 21 | + %1:2 = fir.unboxchar %arg0 : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) |
| 22 | + %2:2 = hlfir.declare %1#0 typeparams %1#1 dummy_scope %0 {uniq_name = "_QFtestEx"} : (!fir.ref<!fir.char<1,?>>, index, !fir.dscope) -> (!fir.boxchar<1>, !fir.ref<!fir.char<1,?>>) |
| 23 | + %c1 = arith.constant 1 : index |
| 24 | + %c10 = arith.constant 10 : index |
| 25 | + fir.do_concurrent { |
| 26 | + %5 = fir.alloca i32 {bindc_name = "i"} |
| 27 | + %6:2 = hlfir.declare %5 {uniq_name = "_QFtestEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 28 | + fir.do_concurrent.loop (%arg1) = (%c1) to (%c10) step (%c1) local(@_QFtestEx_private_boxchar_c8xU %2#0 -> %arg2 : !fir.boxchar<1>) { |
| 29 | + %7 = fir.convert %arg1 : (index) -> i32 |
| 30 | + fir.store %7 to %6#0 : !fir.ref<i32> |
| 31 | + %8:2 = fir.unboxchar %arg2 : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index) |
| 32 | + } |
| 33 | + } |
| 34 | + return |
| 35 | +} |
| 36 | + |
| 37 | +// CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtestEx"} |
| 38 | +// CHECK: fir.do_loop %{{.*}} = %{{.*}} unordered { |
| 39 | +// CHECK: %[[X_UNBOX:.*]]:2 = fir.unboxchar %[[X_DECL:.*]]#0 |
| 40 | + |
| 41 | +// Verify that the value yielded by the `init` region is the one used through |
| 42 | +// out the loop region rather than the local allocation. |
| 43 | +// CHECK: %[[LOCAL_ALLOC:.*]] = fir.allocmem !fir.char<1,?>(%[[X_UNBOX]]#1 : index) |
| 44 | +// CHECK: %[[LOCAL_BOX:.*]] = fir.emboxchar %[[LOCAL_ALLOC]], %[[X_UNBOX]]#1 |
| 45 | +// CHECK: %[[LOCAL_UNBOX:.*]]:2 = fir.unboxchar %[[LOCAL_BOX]] |
| 46 | +// CHECK: %[[LOCAL_CVT:.*]] = fir.convert %[[LOCAL_UNBOX]]#0 |
| 47 | +// CHECK: fir.freemem %[[LOCAL_CVT]] |
| 48 | +// CHECK: } |
0 commit comments