|
| 1 | +// RUN: fir-opt --split-input-file --omp-maps-for-privatized-symbols %s | FileCheck %s |
| 2 | +module attributes {omp.is_target_device = false} { |
| 3 | + omp.private {type = private} @_QFtarget_simpleEsimple_var_private_ref_box_heap_i32 : !fir.ref<!fir.box<!fir.heap<i32>>> alloc { |
| 4 | + ^bb0(%arg0: !fir.ref<!fir.box<!fir.heap<i32>>>): |
| 5 | + %0 = fir.alloca !fir.box<!fir.heap<i32>> {bindc_name = "simple_var", pinned, uniq_name = "_QFtarget_simpleEsimple_var"} |
| 6 | + %1 = fir.load %arg0 : !fir.ref<!fir.box<!fir.heap<i32>>> |
| 7 | + %2 = fir.box_addr %1 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32> |
| 8 | + %3 = fir.convert %2 : (!fir.heap<i32>) -> i64 |
| 9 | + %c0_i64 = arith.constant 0 : i64 |
| 10 | + %4 = arith.cmpi ne, %3, %c0_i64 : i64 |
| 11 | + fir.if %4 { |
| 12 | + %6 = fir.load %arg0 : !fir.ref<!fir.box<!fir.heap<i32>>> |
| 13 | + %7 = fir.box_addr %6 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32> |
| 14 | + %8 = fir.allocmem i32 {fir.must_be_heap = true, uniq_name = "_QFtarget_simpleEsimple_var.alloc"} |
| 15 | + %9 = fir.embox %8 : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>> |
| 16 | + fir.store %9 to %0 : !fir.ref<!fir.box<!fir.heap<i32>>> |
| 17 | + } else { |
| 18 | + %6 = fir.zero_bits !fir.heap<i32> |
| 19 | + %7 = fir.embox %6 : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>> |
| 20 | + fir.store %7 to %0 : !fir.ref<!fir.box<!fir.heap<i32>>> |
| 21 | + } |
| 22 | + %5:2 = hlfir.declare %0 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtarget_simpleEsimple_var"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>) |
| 23 | + omp.yield(%5#0 : !fir.ref<!fir.box<!fir.heap<i32>>>) |
| 24 | + } dealloc { |
| 25 | + ^bb0(%arg0: !fir.ref<!fir.box<!fir.heap<i32>>>): |
| 26 | + %0 = fir.load %arg0 : !fir.ref<!fir.box<!fir.heap<i32>>> |
| 27 | + %1 = fir.box_addr %0 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32> |
| 28 | + %2 = fir.convert %1 : (!fir.heap<i32>) -> i64 |
| 29 | + %c0_i64 = arith.constant 0 : i64 |
| 30 | + %3 = arith.cmpi ne, %2, %c0_i64 : i64 |
| 31 | + fir.if %3 { |
| 32 | + %false = arith.constant false |
| 33 | + %4 = fir.absent !fir.box<none> |
| 34 | + %c70 = arith.constant 70 : index |
| 35 | + %c10_i32 = arith.constant 10 : i32 |
| 36 | + %6 = fir.load %arg0 : !fir.ref<!fir.box<!fir.heap<i32>>> |
| 37 | + %7 = fir.box_addr %6 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32> |
| 38 | + fir.freemem %7 : !fir.heap<i32> |
| 39 | + %8 = fir.zero_bits !fir.heap<i32> |
| 40 | + %9 = fir.embox %8 : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>> |
| 41 | + fir.store %9 to %arg0 : !fir.ref<!fir.box<!fir.heap<i32>>> |
| 42 | + } |
| 43 | + omp.yield |
| 44 | + } |
| 45 | + func.func @_QPtarget_simple() { |
| 46 | + %0 = fir.alloca i32 {bindc_name = "a", uniq_name = "_QFtarget_simpleEa"} |
| 47 | + %1:2 = hlfir.declare %0 {uniq_name = "_QFtarget_simpleEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 48 | + %2 = fir.alloca !fir.box<!fir.heap<i32>> {bindc_name = "simple_var", uniq_name = "_QFtarget_simpleEsimple_var"} |
| 49 | + %3 = fir.zero_bits !fir.heap<i32> |
| 50 | + %4 = fir.embox %3 : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>> |
| 51 | + fir.store %4 to %2 : !fir.ref<!fir.box<!fir.heap<i32>>> |
| 52 | + %5:2 = hlfir.declare %2 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtarget_simpleEsimple_var"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>) |
| 53 | + %c2_i32 = arith.constant 2 : i32 |
| 54 | + hlfir.assign %c2_i32 to %1#0 : i32, !fir.ref<i32> |
| 55 | + %6 = omp.map.info var_ptr(%1#1 : !fir.ref<i32>, i32) map_clauses(to) capture(ByRef) -> !fir.ref<i32> {name = "a"} |
| 56 | + omp.target map_entries(%6 -> %arg0 : !fir.ref<i32>) private(@_QFtarget_simpleEsimple_var_private_ref_box_heap_i32 %5#0 -> %arg1 : !fir.ref<!fir.box<!fir.heap<i32>>>) { |
| 57 | + ^bb0(%arg0: !fir.ref<i32>, %arg1: !fir.ref<!fir.box<!fir.heap<i32>>>): |
| 58 | + %11:2 = hlfir.declare %arg0 {uniq_name = "_QFtarget_simpleEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 59 | + %12:2 = hlfir.declare %arg1 {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFtarget_simpleEsimple_var"} : (!fir.ref<!fir.box<!fir.heap<i32>>>) -> (!fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<!fir.box<!fir.heap<i32>>>) |
| 60 | + %c10_i32 = arith.constant 10 : i32 |
| 61 | + %13 = fir.load %11#0 : !fir.ref<i32> |
| 62 | + %14 = arith.addi %c10_i32, %13 : i32 |
| 63 | + hlfir.assign %14 to %12#0 realloc : i32, !fir.ref<!fir.box<!fir.heap<i32>>> |
| 64 | + omp.terminator |
| 65 | + } |
| 66 | + %7 = fir.load %5#1 : !fir.ref<!fir.box<!fir.heap<i32>>> |
| 67 | + %8 = fir.box_addr %7 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32> |
| 68 | + %9 = fir.convert %8 : (!fir.heap<i32>) -> i64 |
| 69 | + %c0_i64 = arith.constant 0 : i64 |
| 70 | + %10 = arith.cmpi ne, %9, %c0_i64 : i64 |
| 71 | + fir.if %10 { |
| 72 | + %11 = fir.load %5#1 : !fir.ref<!fir.box<!fir.heap<i32>>> |
| 73 | + %12 = fir.box_addr %11 : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32> |
| 74 | + fir.freemem %12 : !fir.heap<i32> |
| 75 | + %13 = fir.zero_bits !fir.heap<i32> |
| 76 | + %14 = fir.embox %13 : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>> |
| 77 | + fir.store %14 to %5#1 : !fir.ref<!fir.box<!fir.heap<i32>>> |
| 78 | + } |
| 79 | + return |
| 80 | + } |
| 81 | +} |
| 82 | +// CHECK: %[[MAP0:.*]] = omp.map.info var_ptr({{.*}} : !fir.ref<i32>, i32) map_clauses(to) capture(ByRef) -> !fir.ref<i32> {name = "a"} |
| 83 | +// CHECK: %[[MAP1:.*]] = omp.map.info var_ptr({{.*}} : !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.box<!fir.heap<i32>>) map_clauses(to) capture(ByRef) -> !fir.ref<!fir.box<!fir.heap<i32>>> |
| 84 | +// CHECK: omp.target map_entries(%[[MAP0]] -> %arg0, %[[MAP1]] -> %arg1 : !fir.ref<i32>, !fir.ref<!fir.box<!fir.heap<i32>>>) |
0 commit comments