209 lines · plain
1! REQUIRES: openmp_runtime2 3!RUN: %flang_fc1 -emit-hlfir %openmp_flags %s -o - | FileCheck %s4 5!CHECK-LABEL: func @_QPparallel_simple6subroutine parallel_simple()7 !CHECK: omp.parallel8!$omp parallel9 !CHECK: fir.call10 call f1()11!$omp end parallel12end subroutine parallel_simple13 14!===============================================================================15! `if` clause16!===============================================================================17 18!CHECK-LABEL: func @_QPparallel_if19subroutine parallel_if(alpha, beta, gamma)20 integer, intent(in) :: alpha21 logical, intent(in) :: beta22 logical(1) :: logical123 logical(2) :: logical224 logical(4) :: logical425 logical(8) :: logical826 27 !CHECK: omp.parallel if(%{{.*}}) {28 !$omp parallel if(alpha .le. 0)29 !CHECK: fir.call30 call f1()31 !CHECK: omp.terminator32 !$omp end parallel33 34 !CHECK: omp.parallel if(%{{.*}}) {35 !$omp parallel if(.false.)36 !CHECK: fir.call37 call f2()38 !CHECK: omp.terminator39 !$omp end parallel40 41 !CHECK: omp.parallel if(%{{.*}}) {42 !$omp parallel if(alpha .ge. 0)43 !CHECK: fir.call44 call f3()45 !CHECK: omp.terminator46 !$omp end parallel47 48 !CHECK: omp.parallel if(%{{.*}}) {49 !$omp parallel if(.true.)50 !CHECK: fir.call51 call f4()52 !CHECK: omp.terminator53 !$omp end parallel54 55 !CHECK: omp.parallel if(%{{.*}}) {56 !$omp parallel if(beta)57 !CHECK: fir.call58 call f1()59 !CHECK: omp.terminator60 !$omp end parallel61 62 !CHECK: omp.parallel if(%{{.*}}) {63 !$omp parallel if(logical1)64 !CHECK: fir.call65 call f1()66 !CHECK: omp.terminator67 !$omp end parallel68 69 !CHECK: omp.parallel if(%{{.*}}) {70 !$omp parallel if(logical2)71 !CHECK: fir.call72 call f1()73 !CHECK: omp.terminator74 !$omp end parallel75 76 !CHECK: omp.parallel if(%{{.*}}) {77 !$omp parallel if(logical4)78 !CHECK: fir.call79 call f1()80 !CHECK: omp.terminator81 !$omp end parallel82 83 !CHECK: omp.parallel if(%{{.*}}) {84 !$omp parallel if(logical8)85 !CHECK: fir.call86 call f1()87 !CHECK: omp.terminator88 !$omp end parallel89 90end subroutine parallel_if91 92!===============================================================================93! `num_threads` clause94!===============================================================================95 96!CHECK-LABEL: func @_QPparallel_numthreads97subroutine parallel_numthreads(num_threads)98 integer, intent(inout) :: num_threads99 100 !CHECK: omp.parallel num_threads(%{{.*}}: i32) {101 !$omp parallel num_threads(16)102 !CHECK: fir.call103 call f1()104 !CHECK: omp.terminator105 !$omp end parallel106 107 num_threads = 4108 109 !CHECK: omp.parallel num_threads(%{{.*}} : i32) {110 !$omp parallel num_threads(num_threads)111 !CHECK: fir.call112 call f2()113 !CHECK: omp.terminator114 !$omp end parallel115 116end subroutine parallel_numthreads117 118!===============================================================================119! `proc_bind` clause120!===============================================================================121 122!CHECK-LABEL: func @_QPparallel_proc_bind123subroutine parallel_proc_bind()124 125 !CHECK: omp.parallel proc_bind(master) {126 !$omp parallel proc_bind(master)127 !CHECK: fir.call128 call f1()129 !CHECK: omp.terminator130 !$omp end parallel131 132 !CHECK: omp.parallel proc_bind(close) {133 !$omp parallel proc_bind(close)134 !CHECK: fir.call135 call f2()136 !CHECK: omp.terminator137 !$omp end parallel138 139 !CHECK: omp.parallel proc_bind(spread) {140 !$omp parallel proc_bind(spread)141 !CHECK: fir.call142 call f3()143 !CHECK: omp.terminator144 !$omp end parallel145 146end subroutine parallel_proc_bind147 148!===============================================================================149! `allocate` clause150!===============================================================================151 152!CHECK-LABEL: func @_QPparallel_allocate153subroutine parallel_allocate()154 use omp_lib155 integer :: x156 !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.addi161 x = x + 12162 !CHECK: omp.terminator163 !$omp end parallel164end subroutine parallel_allocate165 166!===============================================================================167! multiple clauses168!===============================================================================169 170!CHECK-LABEL: func @_QPparallel_multiple_clauses171subroutine parallel_multiple_clauses(alpha, num_threads)172 use omp_lib173 integer, intent(inout) :: alpha174 integer, intent(in) :: num_threads175 176 !CHECK: omp.parallel if({{.*}}) proc_bind(master) {177 !$omp parallel if(alpha .le. 0) proc_bind(master)178 !CHECK: fir.call179 call f1()180 !CHECK: omp.terminator181 !$omp end parallel182 183 !CHECK: omp.parallel num_threads({{.*}} : i32) proc_bind(close) {184 !$omp parallel proc_bind(close) num_threads(num_threads)185 !CHECK: fir.call186 call f2()187 !CHECK: omp.terminator188 !$omp end parallel189 190 !CHECK: omp.parallel if({{.*}}) num_threads({{.*}} : i32) {191 !$omp parallel num_threads(num_threads) if(alpha .le. 0)192 !CHECK: fir.call193 call f3()194 !CHECK: omp.terminator195 !$omp end parallel196 197 !CHECK: omp.parallel allocate(%{{.+}} : i64 -> %{{.+}}#0 : !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.call202 call f3()203 !CHECK: arith.addi204 alpha = alpha + 12205 !CHECK: omp.terminator206 !$omp end parallel207 208end subroutine parallel_multiple_clauses209