// RUN: fir-opt --boxed-procedure %s | FileCheck %s // Test the boxed procedure pass with OpenMP declaration operations. // Check minimally, only arguments, yields and the private types. // Test a private declaration with one region (alloc) //CHECK: omp.private {type = private} @_QFsub1Et1_private_rec__QFsub1Tt : !fir.type<_QFsub1TtUnboxProc{p1:() -> ()}>{{$}} omp.private {type = private} @_QFsub1Et1_private_rec__QFsub1Tt : !fir.type<_QFsub1Tt{p1:!fir.boxproc<() -> ()>}> func.func @_QPsub1() { %0 = fir.alloca !fir.type<_QFsub1Tt{p1:!fir.boxproc<() -> ()>}> {bindc_name = "t1", uniq_name = "_QFsub1Et1"} %1 = fir.declare %0 {uniq_name = "_QFsub1Et1"} : (!fir.ref ()>}>>) -> !fir.ref ()>}>> //CHECK: omp.parallel private(@_QFsub1Et1_private_rec__QFsub1Tt %{{.*}} -> %{{.*}} : !fir.ref ()}>>) { omp.parallel private(@_QFsub1Et1_private_rec__QFsub1Tt %1 -> %arg0 : !fir.ref ()>}>>) { %2 = fir.declare %arg0 {uniq_name = "_QFsub1Et1"} : (!fir.ref ()>}>>) -> !fir.ref ()>}>> omp.terminator } return } // Test a private declaration with all regions (alloc, copy, dealloc) //CHECK: omp.private {type = firstprivate} @_QFsub2Et1_firstprivate_box_heap_rec__QFsub2Tt : //CHECK-SAME: [[TYPE:!fir.box \(\)\}>>>]] init { omp.private {type = firstprivate} @_QFsub2Et1_firstprivate_box_heap_rec__QFsub2Tt : !fir.box ()>}>>> init { //CHECK: ^bb0(%{{.*}}: !fir.ref<[[TYPE]]>, %{{.*}}: !fir.ref<[[TYPE]]>): ^bb0(%arg0: !fir.ref ()>}>>>>, %arg1:!fir.ref ()>}>>>>): %0 = fir.alloca !fir.box ()>}>>> {bindc_name = "t1", pinned, uniq_name = "_QFsub2Et1"} %1 = fir.declare %0 {fortran_attrs = #fir.var_attrs, uniq_name = "_QFsub2Et1"} : (!fir.ref ()>}>>>>) -> !fir.ref ()>}>>>> //CHECK: omp.yield(%{{.*}} : !fir.ref ()}>>>>) omp.yield(%1 : !fir.ref ()>}>>>>) } copy { //CHECK: ^bb0(%{{.*}}: !fir.ref ()}>>>>, //CHECK-SAME: %{{.*}}: !fir.ref ()}>>>>): ^bb0(%arg0: !fir.ref ()>}>>>>, %arg1: !fir.ref ()>}>>>>): %c5_i32 = arith.constant 5 : i32 %0 = fir.load %arg0 : !fir.ref ()>}>>>> %1 = fir.box_addr %0 : (!fir.box ()>}>>>) -> !fir.heap ()>}>> %2 = fir.embox %1 : (!fir.heap ()>}>>) -> !fir.box ()>}>> %3 = fir.address_of(@_QQclXea) : !fir.ref> %4 = fir.convert %arg1 : (!fir.ref ()>}>>>>) -> !fir.ref> %5 = fir.convert %2 : (!fir.box ()>}>>) -> !fir.box %6 = fir.convert %3 : (!fir.ref>) -> !fir.ref fir.call @_FortranAAssign(%4, %5, %6, %c5_i32) : (!fir.ref>, !fir.box, !fir.ref, i32) -> () //CHECK: omp.yield(%{{.*}} : !fir.ref ()}>>>>) omp.yield(%arg1 : !fir.ref ()>}>>>>) } dealloc { //CHECK: ^bb0(%{{.*}}: !fir.ref ()}>>>>): ^bb0(%arg0: !fir.ref ()>}>>>>): %c5_i32 = arith.constant 5 : i32 %false = arith.constant false %0 = fir.absent !fir.box %1 = fir.address_of(@_QQclXea) : !fir.ref> %2 = fir.convert %arg0 : (!fir.ref ()>}>>>>) -> !fir.ref> %3 = fir.convert %1 : (!fir.ref>) -> !fir.ref %4 = fir.call @_FortranAAllocatableDeallocate(%2, %false, %0, %3, %c5_i32) fastmath : (!fir.ref>, i1, !fir.box, !fir.ref, i32) -> i32 omp.yield } func.func @_QPsub2() { %0 = fir.alloca !fir.box ()>}>>> {bindc_name = "t1", uniq_name = "_QFsub2Et1"} %1 = fir.declare %0 {fortran_attrs = #fir.var_attrs, uniq_name = "_QFsub2Et1"} : (!fir.ref ()>}>>>>) -> !fir.ref ()>}>>>> //CHECK: omp.parallel private(@_QFsub2Et1_firstprivate_box_heap_rec__QFsub2Tt %{{.*}} -> %{{.*}} : //CHECK-SAME: !fir.ref ()}>>>>) { omp.parallel private(@_QFsub2Et1_firstprivate_box_heap_rec__QFsub2Tt %1 -> %arg0 : !fir.ref ()>}>>>>) { %2 = fir.declare %arg0 {fortran_attrs = #fir.var_attrs, uniq_name = "_QFsub2Et1"} : (!fir.ref ()>}>>>>) -> !fir.ref ()>}>>>> omp.terminator } return } func.func private @_FortranAInitialize(!fir.box, !fir.ref, i32) -> () attributes {fir.runtime} fir.global linkonce @_QQclXea constant : !fir.char<1,8> { %0 = fir.string_lit "pp.f90\00"(8) : !fir.char<1,8> fir.has_value %0 : !fir.char<1,8> } func.func private @_FortranAAllocatableDeallocate(!fir.ref>, i1, !fir.box, !fir.ref, i32) -> i32 attributes {fir.runtime} func.func private @_FortranAAssign(!fir.ref>, !fir.box, !fir.ref, i32) -> () attributes {fir.runtime}