brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · 45a0318 Raw
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