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