134 lines · plain
1! REQUIRES: openmp_runtime2 3!RUN: %flang_fc1 -emit-hlfir %openmp_flags %s -o - | FileCheck %s4!RUN: bbc -emit-hlfir %openmp_flags %s -o - | FileCheck %s5 6!===============================================================================7! Single construct8!===============================================================================9 10!CHECK-LABEL: func @_QPomp_single11!CHECK-SAME: (%[[X:.*]]: !fir.ref<i32> {fir.bindc_name = "x"})12subroutine omp_single(x)13 integer, intent(inout) :: x14 !CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {fortran_attrs = #fir.var_attrs<intent_inout>, uniq_name = "_QFomp_singleEx"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)15 !CHECK: omp.parallel16 !$omp parallel17 !CHECK: omp.single18 !$omp single19 !CHECK: %[[xval:.*]] = fir.load %[[X_DECL]]#0 : !fir.ref<i32>20 !CHECK: %[[res:.*]] = arith.addi %[[xval]], %{{.*}} : i3221 !CHECK: hlfir.assign %[[res]] to %[[X_DECL]]#0 : i32, !fir.ref<i32>22 x = x + 1223 !CHECK: omp.terminator24 !$omp end single25 !CHECK: omp.terminator26 !$omp end parallel27end subroutine omp_single28 29!===============================================================================30! Single construct with nowait31!===============================================================================32 33!CHECK-LABEL: func @_QPomp_single_nowait34!CHECK-SAME: (%[[X:.*]]: !fir.ref<i32> {fir.bindc_name = "x"})35subroutine omp_single_nowait(x)36 integer, intent(inout) :: x37 !CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {fortran_attrs = #fir.var_attrs<intent_inout>, uniq_name = "_QFomp_single_nowaitEx"} : (!fir.ref<i32>, !fir.dscope) -> (!fir.ref<i32>, !fir.ref<i32>)38 !CHECK: omp.parallel39 !$omp parallel40 !CHECK: omp.single nowait41 !$omp single42 !CHECK: %[[xval:.*]] = fir.load %[[X_DECL]]#0 : !fir.ref<i32>43 !CHECK: %[[res:.*]] = arith.addi %[[xval]], %{{.*}} : i3244 !CHECK: hlfir.assign %[[res]] to %[[X_DECL]]#0 : i32, !fir.ref<i32>45 x = x + 1246 !CHECK: omp.terminator47 !$omp end single nowait48 !CHECK: omp.terminator49 !$omp end parallel50end subroutine omp_single_nowait51 52!===============================================================================53! Single construct with allocate54!===============================================================================55 56!CHECK-LABEL: func @_QPsingle_allocate57subroutine single_allocate()58 use omp_lib59 integer :: x60 !CHECK: omp.parallel {61 !$omp parallel62 !CHECK: omp.single allocate(%{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>) {63 !$omp single allocate(omp_high_bw_mem_alloc: x) private(x)64 !CHECK: arith.addi65 x = x + 1266 !CHECK: omp.terminator67 !$omp end single68 !CHECK: omp.terminator69 !$omp end parallel70end subroutine single_allocate71 72!===============================================================================73! Single construct with private/firstprivate74!===============================================================================75 76! CHECK-LABEL: func.func @_QPsingle_privatization(77! CHECK-SAME: %[[X:.*]]: !fir.ref<f32> {fir.bindc_name = "x"}, 78! CHECK-SAME: %[[Y:.*]]: !fir.ref<f64> {fir.bindc_name = "y"}) {79! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFsingle_privatizationEx"} : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)80! CHECK: %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFsingle_privatizationEy"} : (!fir.ref<f64>, !fir.dscope) -> (!fir.ref<f64>, !fir.ref<f64>)81! CHECK: omp.single {82! CHECK: %[[X_PVT:.*]] = fir.alloca f32 {bindc_name = "x", pinned, uniq_name = "_QFsingle_privatizationEx"}83! CHECK: %[[X_PVT_DECL:.*]]:2 = hlfir.declare %[[X_PVT]] {uniq_name = "_QFsingle_privatizationEx"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)84! CHECK: %[[Y_PVT:.*]] = fir.alloca f64 {bindc_name = "y", pinned, uniq_name = "_QFsingle_privatizationEy"}85! CHECK: %[[Y_PVT_DECL:.*]]:2 = hlfir.declare %[[Y_PVT]] {uniq_name = "_QFsingle_privatizationEy"} : (!fir.ref<f64>) -> (!fir.ref<f64>, !fir.ref<f64>)86! CHECK: %[[Y_LOAD:.*]] = fir.load %[[Y_DECL]]#0 : !fir.ref<f64>87! CHECK: hlfir.assign %[[Y_LOAD]] to %[[Y_PVT_DECL]]#0 : f64, !fir.ref<f64>88! CHECK: fir.call @_QPbar(%[[X_PVT_DECL]]#0, %[[Y_PVT_DECL]]#0) fastmath<contract> : (!fir.ref<f32>, !fir.ref<f64>) -> ()89! CHECK: omp.terminator90! CHECK: }91! CHECK: return92! CHECK: }93 94subroutine single_privatization(x, y)95 real :: x96 real(8) :: y97 98 !$omp single private(x) firstprivate(y)99 call bar(x, y)100 !$omp end single101end subroutine102 103! CHECK-LABEL: func.func @_QPsingle_privatization2(104! CHECK-SAME: %[[X:.*]]: !fir.ref<f32> {fir.bindc_name = "x"},105! CHECK-SAME: %[[Y:.*]]: !fir.ref<f64> {fir.bindc_name = "y"}) {106! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFsingle_privatization2Ex"} : (!fir.ref<f32>, !fir.dscope) -> (!fir.ref<f32>, !fir.ref<f32>)107! CHECK: %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y]] dummy_scope %{{[0-9]+}} arg {{[0-9]+}} {uniq_name = "_QFsingle_privatization2Ey"} : (!fir.ref<f64>, !fir.dscope) -> (!fir.ref<f64>, !fir.ref<f64>)108! CHECK: omp.parallel {109! CHECK: omp.single {110! CHECK: %[[X_PVT:.*]] = fir.alloca f32 {bindc_name = "x", pinned, uniq_name = "_QFsingle_privatization2Ex"}111! CHECK: %[[X_PVT_DECL:.*]]:2 = hlfir.declare %[[X_PVT]] {uniq_name = "_QFsingle_privatization2Ex"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)112! CHECK: %[[Y_PVT:.*]] = fir.alloca f64 {bindc_name = "y", pinned, uniq_name = "_QFsingle_privatization2Ey"}113! CHECK: %[[Y_PVT_DECL:.*]]:2 = hlfir.declare %[[Y_PVT]] {uniq_name = "_QFsingle_privatization2Ey"} : (!fir.ref<f64>) -> (!fir.ref<f64>, !fir.ref<f64>)114! CHECK: %[[Y_LOAD:.*]] = fir.load %[[Y_DECL]]#0 : !fir.ref<f64>115! CHECK: hlfir.assign %[[Y_LOAD]] to %[[Y_PVT_DECL]]#0 : f64, !fir.ref<f64>116! CHECK: fir.call @_QPbar(%[[X_PVT_DECL]]#0, %[[Y_PVT_DECL]]#0) fastmath<contract> : (!fir.ref<f32>, !fir.ref<f64>) -> ()117! CHECK: omp.terminator118! CHECK: }119! CHECK: omp.terminator120! CHECK: }121! CHECK: return122! CHECK: }123 124subroutine single_privatization2(x, y)125 real :: x126 real(8) :: y127 128 !$omp parallel129 !$omp single private(x) firstprivate(y)130 call bar(x, y)131 !$omp end single132 !$omp end parallel133end subroutine134