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