xref: /llvm-project/flang/test/Lower/OpenMP/loop-directive.f90 (revision d7e561b913d2a75c7c1807bf1c1e0bddc270a2b3)
1fd3ff200SKareem Ergawy! This test checks lowering of OpenMP loop Directive.
2fd3ff200SKareem Ergawy
3fd3ff200SKareem Ergawy! RUN: bbc -emit-hlfir -fopenmp -fopenmp-version=50 -o - %s 2>&1 | FileCheck %s
4fd3ff200SKareem Ergawy! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -o - %s 2>&1 | FileCheck %s
5fd3ff200SKareem Ergawy
6fd3ff200SKareem Ergawy! CHECK: omp.declare_reduction @[[RED:add_reduction_i32]] : i32
7fd3ff200SKareem Ergawy! CHECK: omp.private {type = private} @[[DUMMY_PRIV:.*test_privateEdummy_private.*]] : !fir.ref<i32>
8fd3ff200SKareem Ergawy! CHECK: omp.private {type = private} @[[I_PRIV:.*test_no_clausesEi.*]] : !fir.ref<i32>
9fd3ff200SKareem Ergawy
10fd3ff200SKareem Ergawy! CHECK-LABEL: func.func @_QPtest_no_clauses
11fd3ff200SKareem Ergawysubroutine test_no_clauses()
12fd3ff200SKareem Ergawy  integer :: i, j, dummy = 1
13fd3ff200SKareem Ergawy
1429f7392cSKareem Ergawy  ! CHECK: omp.simd private(@[[I_PRIV]] %{{.*}}#0 -> %[[ARG:.*]] : !fir.ref<i32>) {
15fd3ff200SKareem Ergawy  ! CHECK-NEXT:   omp.loop_nest (%[[IV:.*]]) : i32 = (%{{.*}}) to (%{{.*}}) {{.*}} {
16fd3ff200SKareem Ergawy  ! CHECK:          %[[ARG_DECL:.*]]:2 = hlfir.declare %[[ARG]]
17fd3ff200SKareem Ergawy  ! CHECK:          fir.store %[[IV]] to %[[ARG_DECL]]#1 : !fir.ref<i32>
18fd3ff200SKareem Ergawy  ! CHECK:        }
19fd3ff200SKareem Ergawy  ! CHECK: }
20fd3ff200SKareem Ergawy  !$omp loop
21fd3ff200SKareem Ergawy  do i=1,10
22fd3ff200SKareem Ergawy   dummy = dummy + 1
23fd3ff200SKareem Ergawy  end do
24fd3ff200SKareem Ergawy  !$omp end loop
25fd3ff200SKareem Ergawyend subroutine
26fd3ff200SKareem Ergawy
27fd3ff200SKareem Ergawy! CHECK-LABEL: func.func @_QPtest_collapse
28fd3ff200SKareem Ergawysubroutine test_collapse()
29fd3ff200SKareem Ergawy  integer :: i, j, dummy = 1
3029f7392cSKareem Ergawy  ! CHECK: omp.simd private(@{{.*}} %{{.*}}#0 -> %{{.*}}, @{{.*}} %{{.*}}#0 -> %{{.*}} : {{.*}}) {
31fd3ff200SKareem Ergawy  ! CHECK-NEXT:   omp.loop_nest (%{{.*}}, %{{.*}}) : i32 {{.*}} {
32fd3ff200SKareem Ergawy  ! CHECK:        }
33fd3ff200SKareem Ergawy  ! CHECK: }
34fd3ff200SKareem Ergawy  !$omp loop collapse(2)
35fd3ff200SKareem Ergawy  do i=1,10
36fd3ff200SKareem Ergawy    do j=2,20
37fd3ff200SKareem Ergawy     dummy = dummy + 1
38fd3ff200SKareem Ergawy    end do
39fd3ff200SKareem Ergawy  end do
40fd3ff200SKareem Ergawy  !$omp end loop
41fd3ff200SKareem Ergawyend subroutine
42fd3ff200SKareem Ergawy
43fd3ff200SKareem Ergawy! CHECK-LABEL: func.func @_QPtest_private
44fd3ff200SKareem Ergawysubroutine test_private()
45fd3ff200SKareem Ergawy  integer :: i, dummy = 1
4629f7392cSKareem Ergawy  ! CHECK: omp.simd private(@[[DUMMY_PRIV]] %{{.*}}#0 -> %[[DUMMY_ARG:.*]], @{{.*}} %{{.*}}#0 -> %{{.*}} : {{.*}}) {
47fd3ff200SKareem Ergawy  ! CHECK-NEXT:   omp.loop_nest (%{{.*}}) : i32 = (%{{.*}}) to (%{{.*}}) {{.*}} {
48fd3ff200SKareem Ergawy  ! CHECK:          %[[DUMMY_DECL:.*]]:2 = hlfir.declare %[[DUMMY_ARG]] {uniq_name = "_QFtest_privateEdummy"}
49fd3ff200SKareem Ergawy  ! CHECK:          %{{.*}} = fir.load %[[DUMMY_DECL]]#0
50fd3ff200SKareem Ergawy  ! CHECK:          hlfir.assign %{{.*}} to %[[DUMMY_DECL]]#0
51fd3ff200SKareem Ergawy  ! CHECK:        }
52fd3ff200SKareem Ergawy  ! CHECK: }
53fd3ff200SKareem Ergawy  !$omp loop private(dummy)
54fd3ff200SKareem Ergawy  do i=1,10
55fd3ff200SKareem Ergawy   dummy = dummy + 1
56fd3ff200SKareem Ergawy  end do
57fd3ff200SKareem Ergawy  !$omp end loop
58fd3ff200SKareem Ergawyend subroutine
59fd3ff200SKareem Ergawy
60fd3ff200SKareem Ergawy
61fd3ff200SKareem Ergawy! CHECK-LABEL: func.func @_QPtest_order
62fd3ff200SKareem Ergawysubroutine test_order()
63fd3ff200SKareem Ergawy  integer :: i, dummy = 1
64fd3ff200SKareem Ergawy  ! CHECK: omp.loop order(reproducible:concurrent) private(@{{.*}} %{{.*}}#0 -> %{{.*}} : {{.*}}) {
65fd3ff200SKareem Ergawy  ! CHECK: }
66fd3ff200SKareem Ergawy  !$omp loop order(concurrent)
67fd3ff200SKareem Ergawy  do i=1,10
68fd3ff200SKareem Ergawy   dummy = dummy + 1
69fd3ff200SKareem Ergawy  end do
70fd3ff200SKareem Ergawy  !$omp end loop
71fd3ff200SKareem Ergawyend subroutine
72fd3ff200SKareem Ergawy
73fd3ff200SKareem Ergawy! CHECK-LABEL: func.func @_QPtest_reduction
74fd3ff200SKareem Ergawysubroutine test_reduction()
75fd3ff200SKareem Ergawy  integer :: i, dummy = 1
76fd3ff200SKareem Ergawy
77fd3ff200SKareem Ergawy  ! CHECK: omp.loop private(@{{.*}} %{{.*}}#0 -> %{{.*}} : !{{.*}}) reduction
78fd3ff200SKareem Ergawy  ! CHECK-SAME:  (@[[RED]] %{{.*}}#0 -> %[[DUMMY_ARG:.*]] : !{{.*}}) {
79fd3ff200SKareem Ergawy  ! CHECK-NEXT:   omp.loop_nest (%{{.*}}) : i32 = (%{{.*}}) to (%{{.*}}) {{.*}} {
80fd3ff200SKareem Ergawy  ! CHECK:          %[[DUMMY_DECL:.*]]:2 = hlfir.declare %[[DUMMY_ARG]] {uniq_name = "_QFtest_reductionEdummy"}
81fd3ff200SKareem Ergawy  ! CHECK:          %{{.*}} = fir.load %[[DUMMY_DECL]]#0
82fd3ff200SKareem Ergawy  ! CHECK:          hlfir.assign %{{.*}} to %[[DUMMY_DECL]]#0
83fd3ff200SKareem Ergawy  ! CHECK:        }
84fd3ff200SKareem Ergawy  ! CHECK: }
85fd3ff200SKareem Ergawy  !$omp loop reduction(+:dummy)
86fd3ff200SKareem Ergawy  do i=1,10
87fd3ff200SKareem Ergawy   dummy = dummy + 1
88fd3ff200SKareem Ergawy  end do
89fd3ff200SKareem Ergawy  !$omp end loop
90fd3ff200SKareem Ergawyend subroutine
91b4c0ef18SKareem Ergawy
92b4c0ef18SKareem Ergawy! CHECK-LABEL: func.func @_QPtest_bind
93b4c0ef18SKareem Ergawysubroutine test_bind()
94b4c0ef18SKareem Ergawy  integer :: i, dummy = 1
95*d7e561b9SKareem Ergawy  ! CHECK: omp.simd private(@{{.*}} %{{.*}}#0 -> %{{.*}} : {{.*}}) {
96b4c0ef18SKareem Ergawy  ! CHECK: }
97b4c0ef18SKareem Ergawy  !$omp loop bind(thread)
98b4c0ef18SKareem Ergawy  do i=1,10
99b4c0ef18SKareem Ergawy   dummy = dummy + 1
100b4c0ef18SKareem Ergawy  end do
101b4c0ef18SKareem Ergawy  !$omp end loop
102b4c0ef18SKareem Ergawyend subroutine
10329f7392cSKareem Ergawy
10429f7392cSKareem Ergawy! CHECK-LABEL: func.func @_QPtest_nested_directives
10529f7392cSKareem Ergawysubroutine test_nested_directives
10629f7392cSKareem Ergawy  implicit none
10729f7392cSKareem Ergawy  integer, parameter :: N = 100000
10829f7392cSKareem Ergawy  integer a(N), b(N), c(N)
10929f7392cSKareem Ergawy  integer j,i, num, flag;
11029f7392cSKareem Ergawy  num = N
11129f7392cSKareem Ergawy
11229f7392cSKareem Ergawy  ! CHECK: omp.teams {
11329f7392cSKareem Ergawy
11429f7392cSKareem Ergawy  ! Verify the first `loop` directive was combined with `target teams` into
11529f7392cSKareem Ergawy  ! `target teams distribute parallel do`.
11629f7392cSKareem Ergawy  ! CHECK:   omp.parallel {{.*}} {
11729f7392cSKareem Ergawy  ! CHECK:     omp.distribute {
11829f7392cSKareem Ergawy  ! CHECK:       omp.wsloop {
11929f7392cSKareem Ergawy  ! CHECK:         omp.loop_nest {{.*}} {
12029f7392cSKareem Ergawy
12129f7392cSKareem Ergawy  ! Very the second `loop` directive was rewritten to `simd`.
12229f7392cSKareem Ergawy  ! CHECK:           omp.simd {{.*}} {
12329f7392cSKareem Ergawy  ! CHECK:             omp.loop_nest {{.*}} {
12429f7392cSKareem Ergawy  ! CHECK:             }
12529f7392cSKareem Ergawy  ! CHECK:           }
12629f7392cSKareem Ergawy
12729f7392cSKareem Ergawy  ! CHECK:         }
12829f7392cSKareem Ergawy  ! CHECK:       } {omp.composite}
12929f7392cSKareem Ergawy  ! CHECK:     } {omp.composite}
13029f7392cSKareem Ergawy  ! CHECK:   } {omp.composite}
13129f7392cSKareem Ergawy  ! CHECK: }
13229f7392cSKareem Ergawy  !$omp target teams map(to: a,b) map(from: c)
13329f7392cSKareem Ergawy  !$omp loop
13429f7392cSKareem Ergawy  do j=1,1000
13529f7392cSKareem Ergawy    !$omp loop
13629f7392cSKareem Ergawy    do i=1,N
13729f7392cSKareem Ergawy      c(i) = a(i) * b(i)
13829f7392cSKareem Ergawy    end do
13929f7392cSKareem Ergawy  end do
14029f7392cSKareem Ergawy  !$omp end target teams
14129f7392cSKareem Ergawyend subroutine
142*d7e561b9SKareem Ergawy
143*d7e561b9SKareem Ergawy! CHECK-LABEL: func.func @_QPtest_standalone_bind_teams
144*d7e561b9SKareem Ergawysubroutine test_standalone_bind_teams
145*d7e561b9SKareem Ergawy  implicit none
146*d7e561b9SKareem Ergawy  integer, parameter :: N = 100000
147*d7e561b9SKareem Ergawy  integer a(N), b(N), c(N)
148*d7e561b9SKareem Ergawy  integer j,i, num, flag;
149*d7e561b9SKareem Ergawy  num = N
150*d7e561b9SKareem Ergawy
151*d7e561b9SKareem Ergawy  ! CHECK:     omp.distribute
152*d7e561b9SKareem Ergawy  ! CHECK-SAME:  private(@{{.*}}Ea_private_ref_100000xi32 {{[^,]*}},
153*d7e561b9SKareem Ergawy  ! CHECK-SAME:          @{{.*}}Ei_private_ref_i32 {{.*}} : {{.*}}) {
154*d7e561b9SKareem Ergawy  ! CHECK:       omp.loop_nest {{.*}} {
155*d7e561b9SKareem Ergawy  ! CHECK:       }
156*d7e561b9SKareem Ergawy  ! CHECK:     }
157*d7e561b9SKareem Ergawy  !$omp loop bind(teams) private(a)
158*d7e561b9SKareem Ergawy  do i=1,N
159*d7e561b9SKareem Ergawy    c(i) = a(i) * b(i)
160*d7e561b9SKareem Ergawy  end do
161*d7e561b9SKareem Ergawyend subroutine
162*d7e561b9SKareem Ergawy
163*d7e561b9SKareem Ergawy! CHECK-LABEL: func.func @_QPtest_standalone_bind_parallel
164*d7e561b9SKareem Ergawysubroutine test_standalone_bind_parallel
165*d7e561b9SKareem Ergawy  implicit none
166*d7e561b9SKareem Ergawy  integer, parameter :: N = 100000
167*d7e561b9SKareem Ergawy  integer a(N), b(N), c(N)
168*d7e561b9SKareem Ergawy  integer j,i, num, flag;
169*d7e561b9SKareem Ergawy  num = N
170*d7e561b9SKareem Ergawy
171*d7e561b9SKareem Ergawy  ! CHECK:     omp.wsloop
172*d7e561b9SKareem Ergawy  ! CHECK-SAME:  private(@{{.*}}Ea_private_ref_100000xi32 {{[^,]*}},
173*d7e561b9SKareem Ergawy  ! CHECK-SAME:          @{{.*}}Ei_private_ref_i32 {{.*}} : {{.*}}) {
174*d7e561b9SKareem Ergawy  ! CHECK:       omp.loop_nest {{.*}} {
175*d7e561b9SKareem Ergawy  ! CHECK:       }
176*d7e561b9SKareem Ergawy  ! CHECK:     }
177*d7e561b9SKareem Ergawy  !$omp loop bind(parallel) private(a)
178*d7e561b9SKareem Ergawy  do i=1,N
179*d7e561b9SKareem Ergawy    c(i) = a(i) * b(i)
180*d7e561b9SKareem Ergawy  end do
181*d7e561b9SKareem Ergawyend subroutine
182