xref: /llvm-project/flang/test/Lower/OpenMP/loop-directive.f90 (revision d7e561b913d2a75c7c1807bf1c1e0bddc270a2b3)
1! This test checks lowering of OpenMP loop Directive.
2
3! RUN: bbc -emit-hlfir -fopenmp -fopenmp-version=50 -o - %s 2>&1 | FileCheck %s
4! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -o - %s 2>&1 | FileCheck %s
5
6! CHECK: omp.declare_reduction @[[RED:add_reduction_i32]] : i32
7! CHECK: omp.private {type = private} @[[DUMMY_PRIV:.*test_privateEdummy_private.*]] : !fir.ref<i32>
8! CHECK: omp.private {type = private} @[[I_PRIV:.*test_no_clausesEi.*]] : !fir.ref<i32>
9
10! CHECK-LABEL: func.func @_QPtest_no_clauses
11subroutine test_no_clauses()
12  integer :: i, j, dummy = 1
13
14  ! CHECK: omp.simd private(@[[I_PRIV]] %{{.*}}#0 -> %[[ARG:.*]] : !fir.ref<i32>) {
15  ! CHECK-NEXT:   omp.loop_nest (%[[IV:.*]]) : i32 = (%{{.*}}) to (%{{.*}}) {{.*}} {
16  ! CHECK:          %[[ARG_DECL:.*]]:2 = hlfir.declare %[[ARG]]
17  ! CHECK:          fir.store %[[IV]] to %[[ARG_DECL]]#1 : !fir.ref<i32>
18  ! CHECK:        }
19  ! CHECK: }
20  !$omp loop
21  do i=1,10
22   dummy = dummy + 1
23  end do
24  !$omp end loop
25end subroutine
26
27! CHECK-LABEL: func.func @_QPtest_collapse
28subroutine test_collapse()
29  integer :: i, j, dummy = 1
30  ! CHECK: omp.simd private(@{{.*}} %{{.*}}#0 -> %{{.*}}, @{{.*}} %{{.*}}#0 -> %{{.*}} : {{.*}}) {
31  ! CHECK-NEXT:   omp.loop_nest (%{{.*}}, %{{.*}}) : i32 {{.*}} {
32  ! CHECK:        }
33  ! CHECK: }
34  !$omp loop collapse(2)
35  do i=1,10
36    do j=2,20
37     dummy = dummy + 1
38    end do
39  end do
40  !$omp end loop
41end subroutine
42
43! CHECK-LABEL: func.func @_QPtest_private
44subroutine test_private()
45  integer :: i, dummy = 1
46  ! CHECK: omp.simd private(@[[DUMMY_PRIV]] %{{.*}}#0 -> %[[DUMMY_ARG:.*]], @{{.*}} %{{.*}}#0 -> %{{.*}} : {{.*}}) {
47  ! CHECK-NEXT:   omp.loop_nest (%{{.*}}) : i32 = (%{{.*}}) to (%{{.*}}) {{.*}} {
48  ! CHECK:          %[[DUMMY_DECL:.*]]:2 = hlfir.declare %[[DUMMY_ARG]] {uniq_name = "_QFtest_privateEdummy"}
49  ! CHECK:          %{{.*}} = fir.load %[[DUMMY_DECL]]#0
50  ! CHECK:          hlfir.assign %{{.*}} to %[[DUMMY_DECL]]#0
51  ! CHECK:        }
52  ! CHECK: }
53  !$omp loop private(dummy)
54  do i=1,10
55   dummy = dummy + 1
56  end do
57  !$omp end loop
58end subroutine
59
60
61! CHECK-LABEL: func.func @_QPtest_order
62subroutine test_order()
63  integer :: i, dummy = 1
64  ! CHECK: omp.loop order(reproducible:concurrent) private(@{{.*}} %{{.*}}#0 -> %{{.*}} : {{.*}}) {
65  ! CHECK: }
66  !$omp loop order(concurrent)
67  do i=1,10
68   dummy = dummy + 1
69  end do
70  !$omp end loop
71end subroutine
72
73! CHECK-LABEL: func.func @_QPtest_reduction
74subroutine test_reduction()
75  integer :: i, dummy = 1
76
77  ! CHECK: omp.loop private(@{{.*}} %{{.*}}#0 -> %{{.*}} : !{{.*}}) reduction
78  ! CHECK-SAME:  (@[[RED]] %{{.*}}#0 -> %[[DUMMY_ARG:.*]] : !{{.*}}) {
79  ! CHECK-NEXT:   omp.loop_nest (%{{.*}}) : i32 = (%{{.*}}) to (%{{.*}}) {{.*}} {
80  ! CHECK:          %[[DUMMY_DECL:.*]]:2 = hlfir.declare %[[DUMMY_ARG]] {uniq_name = "_QFtest_reductionEdummy"}
81  ! CHECK:          %{{.*}} = fir.load %[[DUMMY_DECL]]#0
82  ! CHECK:          hlfir.assign %{{.*}} to %[[DUMMY_DECL]]#0
83  ! CHECK:        }
84  ! CHECK: }
85  !$omp loop reduction(+:dummy)
86  do i=1,10
87   dummy = dummy + 1
88  end do
89  !$omp end loop
90end subroutine
91
92! CHECK-LABEL: func.func @_QPtest_bind
93subroutine test_bind()
94  integer :: i, dummy = 1
95  ! CHECK: omp.simd private(@{{.*}} %{{.*}}#0 -> %{{.*}} : {{.*}}) {
96  ! CHECK: }
97  !$omp loop bind(thread)
98  do i=1,10
99   dummy = dummy + 1
100  end do
101  !$omp end loop
102end subroutine
103
104! CHECK-LABEL: func.func @_QPtest_nested_directives
105subroutine test_nested_directives
106  implicit none
107  integer, parameter :: N = 100000
108  integer a(N), b(N), c(N)
109  integer j,i, num, flag;
110  num = N
111
112  ! CHECK: omp.teams {
113
114  ! Verify the first `loop` directive was combined with `target teams` into
115  ! `target teams distribute parallel do`.
116  ! CHECK:   omp.parallel {{.*}} {
117  ! CHECK:     omp.distribute {
118  ! CHECK:       omp.wsloop {
119  ! CHECK:         omp.loop_nest {{.*}} {
120
121  ! Very the second `loop` directive was rewritten to `simd`.
122  ! CHECK:           omp.simd {{.*}} {
123  ! CHECK:             omp.loop_nest {{.*}} {
124  ! CHECK:             }
125  ! CHECK:           }
126
127  ! CHECK:         }
128  ! CHECK:       } {omp.composite}
129  ! CHECK:     } {omp.composite}
130  ! CHECK:   } {omp.composite}
131  ! CHECK: }
132  !$omp target teams map(to: a,b) map(from: c)
133  !$omp loop
134  do j=1,1000
135    !$omp loop
136    do i=1,N
137      c(i) = a(i) * b(i)
138    end do
139  end do
140  !$omp end target teams
141end subroutine
142
143! CHECK-LABEL: func.func @_QPtest_standalone_bind_teams
144subroutine test_standalone_bind_teams
145  implicit none
146  integer, parameter :: N = 100000
147  integer a(N), b(N), c(N)
148  integer j,i, num, flag;
149  num = N
150
151  ! CHECK:     omp.distribute
152  ! CHECK-SAME:  private(@{{.*}}Ea_private_ref_100000xi32 {{[^,]*}},
153  ! CHECK-SAME:          @{{.*}}Ei_private_ref_i32 {{.*}} : {{.*}}) {
154  ! CHECK:       omp.loop_nest {{.*}} {
155  ! CHECK:       }
156  ! CHECK:     }
157  !$omp loop bind(teams) private(a)
158  do i=1,N
159    c(i) = a(i) * b(i)
160  end do
161end subroutine
162
163! CHECK-LABEL: func.func @_QPtest_standalone_bind_parallel
164subroutine test_standalone_bind_parallel
165  implicit none
166  integer, parameter :: N = 100000
167  integer a(N), b(N), c(N)
168  integer j,i, num, flag;
169  num = N
170
171  ! CHECK:     omp.wsloop
172  ! CHECK-SAME:  private(@{{.*}}Ea_private_ref_100000xi32 {{[^,]*}},
173  ! CHECK-SAME:          @{{.*}}Ei_private_ref_i32 {{.*}} : {{.*}}) {
174  ! CHECK:       omp.loop_nest {{.*}} {
175  ! CHECK:       }
176  ! CHECK:     }
177  !$omp loop bind(parallel) private(a)
178  do i=1,N
179    c(i) = a(i) * b(i)
180  end do
181end subroutine
182