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