!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s !=============================================================================== ! parallel construct with function call which has master construct internally !=============================================================================== !CHECK-LABEL: func @_QPomp_master subroutine omp_master() !CHECK: omp.master { !$omp master !CHECK: fir.call @_QPmaster() {{.*}}: () -> () call master() !CHECK: omp.terminator !$omp end master end subroutine omp_master !CHECK-LABEL: func @_QPparallel_function_master subroutine parallel_function_master() !CHECK: omp.parallel { !$omp parallel !CHECK: fir.call @_QPfoo() {{.*}}: () -> () call foo() !CHECK: omp.terminator !$omp end parallel end subroutine parallel_function_master !=============================================================================== ! master construct nested inside parallel construct !=============================================================================== !CHECK-LABEL: func @_QPomp_parallel_master subroutine omp_parallel_master() !CHECK: omp.parallel { !$omp parallel !CHECK: fir.call @_QPparallel() {{.*}}: () -> () call parallel() !CHECK: omp.master { !$omp master !CHECK: fir.call @_QPparallel_master() {{.*}}: () -> () call parallel_master() !CHECK: omp.terminator !$omp end master !CHECK: omp.terminator !$omp end parallel end subroutine omp_parallel_master !=============================================================================== ! master construct nested inside parallel construct with conditional flow !=============================================================================== !CHECK-LABEL: func @_QPomp_master_parallel subroutine omp_master_parallel() integer :: alpha, beta, gama alpha = 4 beta = 5 gama = 6 !CHECK: omp.master { !$omp master !CHECK: %{{.*}} = fir.load %{{.*}} !CHECK: %{{.*}} = fir.load %{{.*}} !CHECK: %[[RESULT:.*]] = arith.cmpi sge, %{{.*}}, %{{.*}} !CHECK: fir.if %[[RESULT]] { if (alpha .ge. gama) then !CHECK: omp.parallel { !$omp parallel !CHECK: fir.call @_QPinside_if_parallel() {{.*}}: () -> () call inside_if_parallel() !CHECK: omp.terminator !$omp end parallel !CHECK: %{{.*}} = fir.load %{{.*}} !CHECK: %{{.*}} = fir.load %{{.*}} !CHECK: %{{.*}} = arith.addi %{{.*}}, %{{.*}} !CHECK: hlfir.assign %{{.*}} to %{{.*}}#0 : i32, !fir.ref beta = alpha + gama end if !CHECK: else !CHECK: omp.terminator !$omp end master end subroutine omp_master_parallel