1! REQUIRES: openmp_runtime 2 3!RUN: %flang_fc1 -emit-hlfir %openmp_flags %s -o - | FileCheck %s 4 5!CHECK-LABEL: func @_QPparallel_simple 6subroutine parallel_simple() 7 !CHECK: omp.parallel 8!$omp parallel 9 !CHECK: fir.call 10 call f1() 11!$omp end parallel 12end subroutine parallel_simple 13 14!=============================================================================== 15! `if` clause 16!=============================================================================== 17 18!CHECK-LABEL: func @_QPparallel_if 19subroutine parallel_if(alpha, beta, gamma) 20 integer, intent(in) :: alpha 21 logical, intent(in) :: beta 22 logical(1) :: logical1 23 logical(2) :: logical2 24 logical(4) :: logical4 25 logical(8) :: logical8 26 27 !CHECK: omp.parallel if(%{{.*}}) { 28 !$omp parallel if(alpha .le. 0) 29 !CHECK: fir.call 30 call f1() 31 !CHECK: omp.terminator 32 !$omp end parallel 33 34 !CHECK: omp.parallel if(%{{.*}}) { 35 !$omp parallel if(.false.) 36 !CHECK: fir.call 37 call f2() 38 !CHECK: omp.terminator 39 !$omp end parallel 40 41 !CHECK: omp.parallel if(%{{.*}}) { 42 !$omp parallel if(alpha .ge. 0) 43 !CHECK: fir.call 44 call f3() 45 !CHECK: omp.terminator 46 !$omp end parallel 47 48 !CHECK: omp.parallel if(%{{.*}}) { 49 !$omp parallel if(.true.) 50 !CHECK: fir.call 51 call f4() 52 !CHECK: omp.terminator 53 !$omp end parallel 54 55 !CHECK: omp.parallel if(%{{.*}}) { 56 !$omp parallel if(beta) 57 !CHECK: fir.call 58 call f1() 59 !CHECK: omp.terminator 60 !$omp end parallel 61 62 !CHECK: omp.parallel if(%{{.*}}) { 63 !$omp parallel if(logical1) 64 !CHECK: fir.call 65 call f1() 66 !CHECK: omp.terminator 67 !$omp end parallel 68 69 !CHECK: omp.parallel if(%{{.*}}) { 70 !$omp parallel if(logical2) 71 !CHECK: fir.call 72 call f1() 73 !CHECK: omp.terminator 74 !$omp end parallel 75 76 !CHECK: omp.parallel if(%{{.*}}) { 77 !$omp parallel if(logical4) 78 !CHECK: fir.call 79 call f1() 80 !CHECK: omp.terminator 81 !$omp end parallel 82 83 !CHECK: omp.parallel if(%{{.*}}) { 84 !$omp parallel if(logical8) 85 !CHECK: fir.call 86 call f1() 87 !CHECK: omp.terminator 88 !$omp end parallel 89 90end subroutine parallel_if 91 92!=============================================================================== 93! `num_threads` clause 94!=============================================================================== 95 96!CHECK-LABEL: func @_QPparallel_numthreads 97subroutine parallel_numthreads(num_threads) 98 integer, intent(inout) :: num_threads 99 100 !CHECK: omp.parallel num_threads(%{{.*}}: i32) { 101 !$omp parallel num_threads(16) 102 !CHECK: fir.call 103 call f1() 104 !CHECK: omp.terminator 105 !$omp end parallel 106 107 num_threads = 4 108 109 !CHECK: omp.parallel num_threads(%{{.*}} : i32) { 110 !$omp parallel num_threads(num_threads) 111 !CHECK: fir.call 112 call f2() 113 !CHECK: omp.terminator 114 !$omp end parallel 115 116end subroutine parallel_numthreads 117 118!=============================================================================== 119! `proc_bind` clause 120!=============================================================================== 121 122!CHECK-LABEL: func @_QPparallel_proc_bind 123subroutine parallel_proc_bind() 124 125 !CHECK: omp.parallel proc_bind(master) { 126 !$omp parallel proc_bind(master) 127 !CHECK: fir.call 128 call f1() 129 !CHECK: omp.terminator 130 !$omp end parallel 131 132 !CHECK: omp.parallel proc_bind(close) { 133 !$omp parallel proc_bind(close) 134 !CHECK: fir.call 135 call f2() 136 !CHECK: omp.terminator 137 !$omp end parallel 138 139 !CHECK: omp.parallel proc_bind(spread) { 140 !$omp parallel proc_bind(spread) 141 !CHECK: fir.call 142 call f3() 143 !CHECK: omp.terminator 144 !$omp end parallel 145 146end subroutine parallel_proc_bind 147 148!=============================================================================== 149! `allocate` clause 150!=============================================================================== 151 152!CHECK-LABEL: func @_QPparallel_allocate 153subroutine parallel_allocate() 154 use omp_lib 155 integer :: x 156 !CHECK: omp.parallel allocate( 157 !CHECK: %{{.+}} : i64 -> %{{.+}} : !fir.ref<i32> 158 !CHECK: ) { 159 !$omp parallel allocate(omp_high_bw_mem_alloc: x) private(x) 160 !CHECK: arith.addi 161 x = x + 12 162 !CHECK: omp.terminator 163 !$omp end parallel 164end subroutine parallel_allocate 165 166!=============================================================================== 167! multiple clauses 168!=============================================================================== 169 170!CHECK-LABEL: func @_QPparallel_multiple_clauses 171subroutine parallel_multiple_clauses(alpha, num_threads) 172 use omp_lib 173 integer, intent(inout) :: alpha 174 integer, intent(in) :: num_threads 175 176 !CHECK: omp.parallel if({{.*}}) proc_bind(master) { 177 !$omp parallel if(alpha .le. 0) proc_bind(master) 178 !CHECK: fir.call 179 call f1() 180 !CHECK: omp.terminator 181 !$omp end parallel 182 183 !CHECK: omp.parallel num_threads({{.*}} : i32) proc_bind(close) { 184 !$omp parallel proc_bind(close) num_threads(num_threads) 185 !CHECK: fir.call 186 call f2() 187 !CHECK: omp.terminator 188 !$omp end parallel 189 190 !CHECK: omp.parallel if({{.*}}) num_threads({{.*}} : i32) { 191 !$omp parallel num_threads(num_threads) if(alpha .le. 0) 192 !CHECK: fir.call 193 call f3() 194 !CHECK: omp.terminator 195 !$omp end parallel 196 197 !CHECK: omp.parallel allocate(%{{.+}} : i64 -> %{{.+}}#1 : !fir.ref<i32>) 198 !CHECK: if({{.*}}) num_threads({{.*}} : i32) 199 !CHECK: private(@{{.+}} %{{.+}}#0 -> %{{.+}} : !fir.ref<i32>) { 200 !$omp parallel num_threads(num_threads) if(alpha .le. 0) allocate(omp_high_bw_mem_alloc: alpha) private(alpha) 201 !CHECK: fir.call 202 call f3() 203 !CHECK: arith.addi 204 alpha = alpha + 12 205 !CHECK: omp.terminator 206 !$omp end parallel 207 208end subroutine parallel_multiple_clauses 209