! This test checks the lowering of OpenMP scope construct. ! RUN: bbc -emit-hlfir -fopenmp -fopenmp-version=52 %s -o - | FileCheck %s ! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 %s -o - | FileCheck %s ! Module-level declarations emitted before any function body. ! CHECK-LABEL: omp.private {type = firstprivate} @_QFomp_scope_firstprivateEi_firstprivate_i32 : i32 copy { ! CHECK: fir.load %{{.*}} : !fir.ref ! CHECK: hlfir.assign %{{.*}} to %{{.*}} : i32, !fir.ref ! CHECK: omp.yield ! CHECK-LABEL: omp.declare_reduction @add_reduction_i32 : i32 init { ! CHECK: arith.constant 0 : i32 ! CHECK: omp.yield ! CHECK-LABEL: } combiner { ! CHECK: arith.addi ! CHECK: omp.yield ! CHECK: omp.private {type = private} @_QFomp_scope_privateEi_private_i32 : i32 ! CHECK-LABEL: func @_QPomp_scope_basic subroutine omp_scope_basic() integer :: x ! CHECK: hlfir.declare %{{.*}} {uniq_name = "_QFomp_scope_basicEx"} x = 10 ! CHECK: omp.scope { !$omp scope print *, "In scope", x ! CHECK: omp.terminator ! CHECK: } !$omp end scope end subroutine ! CHECK-LABEL: func @_QPomp_scope_nowait subroutine omp_scope_nowait() integer :: x ! CHECK: hlfir.declare %{{.*}} {uniq_name = "_QFomp_scope_nowaitEx"} x = 10 ! CHECK: omp.scope nowait { !$omp scope print *, "In scope", x ! CHECK: omp.terminator ! CHECK: } !$omp end scope nowait end subroutine ! CHECK-LABEL: func @_QPomp_scope_private subroutine omp_scope_private() integer :: i ! CHECK: hlfir.declare %{{.*}} {uniq_name = "_QFomp_scope_privateEi"} i = 10 ! CHECK: omp.scope private(@_QFomp_scope_privateEi_private_i32 %{{.*}}#0 -> %[[PRIV:.*]] : !fir.ref) { ! CHECK: %[[PDECL:.*]]:2 = hlfir.declare %[[PRIV]] {uniq_name = "_QFomp_scope_privateEi"} !$omp scope private(i) ! CHECK: fir.load %[[PDECL]]#0 : !fir.ref print *, "omp scope", i ! CHECK: omp.terminator ! CHECK: } !$omp end scope end subroutine ! CHECK-LABEL: func @_QPomp_scope_reduction subroutine omp_scope_reduction() integer :: sum ! CHECK: hlfir.declare %{{.*}} {uniq_name = "_QFomp_scope_reductionEsum"} sum = 0 ! CHECK: omp.scope reduction(@add_reduction_i32 %{{.*}}#0 -> %[[REDUC:.*]] : !fir.ref) { ! CHECK: %[[RDECL:.*]]:2 = hlfir.declare %[[REDUC]] {uniq_name = "_QFomp_scope_reductionEsum"} ! CHECK: fir.load %[[RDECL]]#0 : !fir.ref ! CHECK: arith.addi %{{.*}}, %{{.*}} : i32 ! CHECK: hlfir.assign %{{.*}} to %[[RDECL]]#0 : i32, !fir.ref !$omp scope reduction(+:sum) sum = sum + 1 ! CHECK: omp.terminator ! CHECK: } !$omp end scope end subroutine ! CHECK-LABEL: func @_QPomp_scope_firstprivate subroutine omp_scope_firstprivate() integer :: i ! CHECK: hlfir.declare %{{.*}} {uniq_name = "_QFomp_scope_firstprivateEi"} i = 42 ! CHECK: omp.scope private(@_QFomp_scope_firstprivateEi_firstprivate_i32 %{{.*}}#0 -> %[[FP:.*]] : !fir.ref) { ! CHECK: %[[FPDECL:.*]]:2 = hlfir.declare %[[FP]] {uniq_name = "_QFomp_scope_firstprivateEi"} !$omp scope firstprivate(i) ! CHECK: fir.load %[[FPDECL]]#0 : !fir.ref print *, "omp scope", i ! CHECK: omp.terminator ! CHECK: } !$omp end scope end subroutine ! CHECK-LABEL: func @_QPomp_scope_allocate subroutine omp_scope_allocate() integer :: i ! CHECK: hlfir.declare %{{.*}} {uniq_name = "_QFomp_scope_allocateEi"} i = 0 ! CHECK: omp.scope allocate(%{{.*}} : i32 -> %{{.*}}#0 : !fir.ref) private(@_QFomp_scope_allocateEi_private_i32 %{{.*}}#0 -> %[[APRIV:.*]] : !fir.ref) { ! CHECK: %[[ADECL:.*]]:2 = hlfir.declare %[[APRIV]] {uniq_name = "_QFomp_scope_allocateEi"} !$omp scope private(i) allocate(i) ! CHECK: hlfir.assign %{{.*}} to %[[ADECL]]#0 : i32, !fir.ref i = 1 ! CHECK: omp.terminator ! CHECK: } !$omp end scope end subroutine