xref: /llvm-project/flang/test/Lower/OpenMP/master.f90 (revision 8586d0330e36b22496f9ba5ed116bc1aac5a1f28)
1d1653c8eSKiran Chandramohan!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
2d1653c8eSKiran Chandramohan
3d1653c8eSKiran Chandramohan!===============================================================================
4d1653c8eSKiran Chandramohan! parallel construct with function call which has master construct internally
5d1653c8eSKiran Chandramohan!===============================================================================
6d1653c8eSKiran Chandramohan!CHECK-LABEL: func @_QPomp_master
7d1653c8eSKiran Chandramohansubroutine omp_master()
8d1653c8eSKiran Chandramohan
9d1653c8eSKiran Chandramohan!CHECK: omp.master  {
10d1653c8eSKiran Chandramohan!$omp master
11d1653c8eSKiran Chandramohan
12d1653c8eSKiran Chandramohan    !CHECK: fir.call @_QPmaster() {{.*}}: () -> ()
13d1653c8eSKiran Chandramohan    call master()
14d1653c8eSKiran Chandramohan
15d1653c8eSKiran Chandramohan!CHECK: omp.terminator
16d1653c8eSKiran Chandramohan!$omp end master
17d1653c8eSKiran Chandramohan
18d1653c8eSKiran Chandramohanend subroutine omp_master
19d1653c8eSKiran Chandramohan
20d1653c8eSKiran Chandramohan!CHECK-LABEL: func @_QPparallel_function_master
21d1653c8eSKiran Chandramohansubroutine parallel_function_master()
22d1653c8eSKiran Chandramohan
23d1653c8eSKiran Chandramohan!CHECK: omp.parallel {
24d1653c8eSKiran Chandramohan!$omp parallel
25d1653c8eSKiran Chandramohan
26d1653c8eSKiran Chandramohan    !CHECK: fir.call @_QPfoo() {{.*}}: () -> ()
27d1653c8eSKiran Chandramohan    call foo()
28d1653c8eSKiran Chandramohan
29d1653c8eSKiran Chandramohan!CHECK: omp.terminator
30d1653c8eSKiran Chandramohan!$omp end parallel
31d1653c8eSKiran Chandramohan
32d1653c8eSKiran Chandramohanend subroutine parallel_function_master
33d1653c8eSKiran Chandramohan
34d1653c8eSKiran Chandramohan!===============================================================================
35d1653c8eSKiran Chandramohan! master construct nested inside parallel construct
36d1653c8eSKiran Chandramohan!===============================================================================
37d1653c8eSKiran Chandramohan
38d1653c8eSKiran Chandramohan!CHECK-LABEL: func @_QPomp_parallel_master
39d1653c8eSKiran Chandramohansubroutine omp_parallel_master()
40d1653c8eSKiran Chandramohan
41d1653c8eSKiran Chandramohan!CHECK: omp.parallel {
42d1653c8eSKiran Chandramohan!$omp parallel
43d1653c8eSKiran Chandramohan    !CHECK: fir.call @_QPparallel() {{.*}}: () -> ()
44d1653c8eSKiran Chandramohan    call parallel()
45d1653c8eSKiran Chandramohan
46d1653c8eSKiran Chandramohan!CHECK: omp.master {
47d1653c8eSKiran Chandramohan!$omp master
48d1653c8eSKiran Chandramohan
49d1653c8eSKiran Chandramohan    !CHECK: fir.call @_QPparallel_master() {{.*}}: () -> ()
50d1653c8eSKiran Chandramohan    call parallel_master()
51d1653c8eSKiran Chandramohan
52d1653c8eSKiran Chandramohan!CHECK: omp.terminator
53d1653c8eSKiran Chandramohan!$omp end master
54d1653c8eSKiran Chandramohan
55d1653c8eSKiran Chandramohan!CHECK: omp.terminator
56d1653c8eSKiran Chandramohan!$omp end parallel
57d1653c8eSKiran Chandramohan
58d1653c8eSKiran Chandramohanend subroutine omp_parallel_master
59d1653c8eSKiran Chandramohan
60d1653c8eSKiran Chandramohan!===============================================================================
61d1653c8eSKiran Chandramohan! master construct nested inside parallel construct with conditional flow
62d1653c8eSKiran Chandramohan!===============================================================================
63d1653c8eSKiran Chandramohan
64d1653c8eSKiran Chandramohan!CHECK-LABEL: func @_QPomp_master_parallel
65d1653c8eSKiran Chandramohansubroutine omp_master_parallel()
66d1653c8eSKiran Chandramohan    integer :: alpha, beta, gama
67d1653c8eSKiran Chandramohan    alpha = 4
68d1653c8eSKiran Chandramohan    beta = 5
69d1653c8eSKiran Chandramohan    gama = 6
70d1653c8eSKiran Chandramohan
71d1653c8eSKiran Chandramohan!CHECK: omp.master {
72d1653c8eSKiran Chandramohan!$omp master
73d1653c8eSKiran Chandramohan
74d1653c8eSKiran Chandramohan    !CHECK: %{{.*}} = fir.load %{{.*}}
75d1653c8eSKiran Chandramohan    !CHECK: %{{.*}} = fir.load %{{.*}}
76d1653c8eSKiran Chandramohan    !CHECK: %[[RESULT:.*]] = arith.cmpi sge, %{{.*}}, %{{.*}}
77d1653c8eSKiran Chandramohan    !CHECK: fir.if %[[RESULT]] {
78d1653c8eSKiran Chandramohan    if (alpha .ge. gama) then
79d1653c8eSKiran Chandramohan
80d1653c8eSKiran Chandramohan!CHECK: omp.parallel {
81d1653c8eSKiran Chandramohan!$omp parallel
82d1653c8eSKiran Chandramohan        !CHECK: fir.call @_QPinside_if_parallel() {{.*}}: () -> ()
83d1653c8eSKiran Chandramohan        call inside_if_parallel()
84d1653c8eSKiran Chandramohan
85d1653c8eSKiran Chandramohan!CHECK: omp.terminator
86d1653c8eSKiran Chandramohan!$omp end parallel
87d1653c8eSKiran Chandramohan
88d1653c8eSKiran Chandramohan        !CHECK: %{{.*}} = fir.load %{{.*}}
89d1653c8eSKiran Chandramohan        !CHECK: %{{.*}} = fir.load %{{.*}}
90d1653c8eSKiran Chandramohan        !CHECK: %{{.*}} = arith.addi %{{.*}}, %{{.*}}
91d1653c8eSKiran Chandramohan        !CHECK: hlfir.assign %{{.*}} to %{{.*}}#0 : i32, !fir.ref<i32>
92d1653c8eSKiran Chandramohan        beta = alpha + gama
93d1653c8eSKiran Chandramohan    end if
94*8586d033Svdonaldson    !CHECK: }
95d1653c8eSKiran Chandramohan
96d1653c8eSKiran Chandramohan!CHECK: omp.terminator
97d1653c8eSKiran Chandramohan!$omp end master
98d1653c8eSKiran Chandramohan
99d1653c8eSKiran Chandramohanend subroutine omp_master_parallel
100