291 lines · plain
1! REQUIRES: openmp_runtime2 3!RUN: %flang_fc1 -emit-hlfir %openmp_flags %s -o - | FileCheck %s4 5!CHECK-LABEL: func @_QPomp_task_simple() {6subroutine omp_task_simple7 !CHECK: omp.task {8 !$omp task9 !CHECK: fir.call @_QPfoo() {{.*}}: () -> ()10 call foo()11 !CHECK: omp.terminator12 !$omp end task13end subroutine omp_task_simple14 15!===============================================================================16! `if` clause17!===============================================================================18 19!CHECK-LABEL: func @_QPomp_task_if(%{{.+}}) {20subroutine omp_task_if(bar)21 logical, intent(inout) :: bar22 !CHECK: omp.task if(%{{.+}}) {23 !$omp task if(bar)24 !CHECK: fir.call @_QPfoo() {{.*}}: () -> ()25 call foo()26 !CHECK: omp.terminator27 !$omp end task28end subroutine omp_task_if29 30!===============================================================================31! `final` clause32!===============================================================================33 34!CHECK-LABEL: func @_QPomp_task_final(%{{.+}}) {35subroutine omp_task_final(bar)36 logical, intent(inout) :: bar37 !CHECK: omp.task final(%{{.+}}) {38 !$omp task final(bar)39 !CHECK: fir.call @_QPfoo() {{.*}}: () -> ()40 call foo()41 !CHECK: omp.terminator42 !$omp end task43end subroutine omp_task_final44 45!===============================================================================46! `priority` clause47!===============================================================================48 49!CHECK-LABEL: func @_QPomp_task_priority(%{{.+}}) {50subroutine omp_task_priority(bar)51 integer, intent(inout) :: bar52 !CHECK: omp.task priority(%{{.+}}) {53 !$omp task priority(bar)54 !CHECK: fir.call @_QPfoo() {{.*}}: () -> ()55 call foo()56 !CHECK: omp.terminator57 !$omp end task58end subroutine omp_task_priority59 60!===============================================================================61! `allocate` clause62!===============================================================================63 64!CHECK-LABEL: func @_QPtask_allocate65subroutine task_allocate()66 use omp_lib67 integer :: x68 !CHECK: omp.task allocate(%{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>) {69 !$omp task allocate(omp_high_bw_mem_alloc: x) private(x)70 !CHECK: arith.addi71 x = x + 1272 !CHECK: omp.terminator73 !$omp end task74end subroutine task_allocate75 76!===============================================================================77! `depend` clause78!===============================================================================79 80!CHECK-LABEL: func @_QPtask_depend81subroutine task_depend()82 integer :: x83 !CHECK: omp.task depend(taskdependin -> %{{.+}} : !fir.ref<i32>) {84 !$omp task depend(in : x)85 !CHECK: arith.addi86 x = x + 1287 !CHECK: omp.terminator88 !$omp end task89end subroutine task_depend90 91!CHECK-LABEL: func @_QPtask_depend_non_int92subroutine task_depend_non_int()93 character(len = 15) :: x94 integer, allocatable :: y95 complex :: z96 !CHECK: omp.task depend(taskdependin -> %{{.+}} : !fir.ref<!fir.char<1,15>>, taskdependin -> %{{.+}} : !fir.heap<i32>, taskdependin -> %{{.+}} : !fir.ref<complex<f32>>) {97 !$omp task depend(in : x, y, z)98 !CHECK: omp.terminator99 !$omp end task100end subroutine task_depend_non_int101 102!CHECK-LABEL: func @_QPtask_depend_all_kinds_one_task103subroutine task_depend_all_kinds_one_task()104 integer :: x105 !CHECK: omp.task depend(taskdependin -> %{{.+}} : !fir.ref<i32>, taskdependout -> %{{.+}} : !fir.ref<i32>, taskdependinout -> %{{.+}} : !fir.ref<i32>) {106 !$omp task depend(in : x) depend(out : x) depend(inout : x)107 !CHECK: arith.addi108 x = x + 12109 !CHECK: omp.terminator110 !$omp end task111end subroutine task_depend_all_kinds_one_task112 113!CHECK-LABEL: func @_QPtask_depend_multi_var114subroutine task_depend_multi_var()115 integer :: x116 integer :: y117 !CHECK: omp.task depend(taskdependin -> %{{.*}} : !fir.ref<i32>, taskdependin -> %{{.+}} : !fir.ref<i32>) private({{.*x_firstprivate.*}}, {{.*y_firstprivate.*}}) {118 !$omp task depend(in :x,y)119 !CHECK: arith.addi120 x = x + 12121 y = y + 12122 !CHECK: omp.terminator123 !$omp end task124end subroutine task_depend_multi_var125 126!CHECK-LABEL: func @_QPtask_depend_multi_task127subroutine task_depend_multi_task()128 integer :: x129 !CHECK: omp.task depend(taskdependout -> %{{.+}} : !fir.ref<i32>)130 !$omp task depend(out : x)131 !CHECK: arith.addi132 x = x + 12133 !CHECK: omp.terminator134 !$omp end task135 !CHECK: omp.task depend(taskdependinout -> %{{.+}} : !fir.ref<i32>)136 !$omp task depend(inout : x)137 !CHECK: arith.addi138 x = x + 12139 !CHECK: omp.terminator140 !$omp end task141 !CHECK: omp.task depend(taskdependin -> %{{.+}} : !fir.ref<i32>)142 !$omp task depend(in : x)143 !CHECK: arith.addi144 x = x + 12145 !CHECK: omp.terminator146 !$omp end task147 !CHECK: omp.task depend(taskdependmutexinoutset -> %{{.+}} : !fir.ref<i32>)148 !$omp task depend(mutexinoutset : x)149 !CHECK: arith.subi150 x = x - 12151 !CHECK: omp.terminator152 !$omp end task153 !CHECK: omp.task depend(taskdependinoutset -> %{{.+}} : !fir.ref<i32>)154 !$omp task depend(inoutset : x)155 !CHECK: arith.subi156 x = x - 12157 !CHECK: omp.terminator158 !$omp end task159end subroutine task_depend_multi_task160 161subroutine task_depend_box(array)162 integer :: array(:)163 !CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %{{.*}} : (!fir.box<!fir.array<?xi32>>) -> !fir.ref<!fir.array<?xi32>>164 !CHECK: omp.task depend(taskdependin -> %[[BOX_ADDR]] : !fir.ref<!fir.array<?xi32>>)165 !$omp task depend(in: array)166 !$omp end task167end subroutine168 169subroutine task_depend_mutable_box(alloc)170 integer, allocatable :: alloc171 !CHECK: %[[LOAD:.*]] = fir.load %{{.*}} : !fir.ref<!fir.box<!fir.heap<i32>>>172 !CHECK: %[[BOX_ADDR:.*]] = fir.box_addr %[[LOAD]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>173 !CHECK: omp.task depend(taskdependin -> %[[BOX_ADDR]] : !fir.heap<i32>)174 !$omp task depend(in: alloc)175 !$omp end task176end subroutine177 178!===============================================================================179! `private` clause180!===============================================================================181!CHECK-LABEL: func @_QPtask_private182subroutine task_private183 type mytype184 integer :: x185 end type mytype186 187!CHECK: %[[INT_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "int_var", uniq_name = "_QFtask_privateEint_var"}188!CHECK: %[[INT_VAR:.+]]:2 = hlfir.declare %[[INT_ALLOCA]] {uniq_name = "_QFtask_privateEint_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)189!CHECK: %[[MYTYPE_ALLOCA:.*]] = fir.alloca !fir.type<_QFtask_privateTmytype{x:i32}> {bindc_name = "mytype_var", uniq_name = "_QFtask_privateEmytype_var"}190!CHECK: %[[MYTYPE_VAR:.+]]:2 = hlfir.declare %[[MYTYPE_ALLOCA]] {uniq_name = "_QFtask_privateEmytype_var"} : (!fir.ref<!fir.type<_QFtask_privateTmytype{x:i32}>>) -> (!fir.ref<!fir.type<_QFtask_privateTmytype{x:i32}>>, !fir.ref<!fir.type<_QFtask_privateTmytype{x:i32}>>)191 integer :: int_var192 type(mytype) :: mytype_var193 194 !CHECK: fir.call @_QPbar(%[[INT_VAR]]#0, %[[MYTYPE_VAR]]#0) {{.*}}: (!fir.ref<i32>, !fir.ref<!fir.type<_QFtask_privateTmytype{x:i32}>>) -> ()195 call bar(int_var, mytype_var)196 197 !CHECK: omp.task private(@{{.*int_var_private.*}} %[[INT_VAR]]#0 -> %[[INT_VAR_ARG:.*]], @{{.*mytype_var_private.*}} %[[MYTYPE_VAR]]#0 -> %[[MYTYPE_VAR_ARG:.*]] : !fir.ref<i32>, !fir.ref<!fir.type<{{.*}}>) {198 !$omp task private(int_var, mytype_var)199!CHECK: %[[INT_VAR_PRIVATE:.+]]:2 = hlfir.declare %[[INT_VAR_ARG]] {uniq_name = "_QFtask_privateEint_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)200!CHECK: %[[MYTYPE_VAR_PRIVATE:.+]]:2 = hlfir.declare %[[MYTYPE_VAR_ARG]] {uniq_name = "_QFtask_privateEmytype_var"} : (!fir.ref<!fir.type<_QFtask_privateTmytype{x:i32}>>) -> (!fir.ref<!fir.type<_QFtask_privateTmytype{x:i32}>>, !fir.ref<!fir.type<_QFtask_privateTmytype{x:i32}>>)201!CHECK: fir.call @_QPbar(%[[INT_VAR_PRIVATE]]#0, %[[MYTYPE_VAR_PRIVATE]]#0) fastmath<contract> : (!fir.ref<i32>, !fir.ref<!fir.type<_QFtask_privateTmytype{x:i32}>>) -> ()202 call bar(int_var, mytype_var)203 !CHECK: omp.terminator204 !$omp end task205end subroutine task_private206 207!===============================================================================208! `firstprivate` clause209!===============================================================================210!CHECK-LABEL: func @_QPtask_firstprivate211subroutine task_firstprivate212 type mytype213 integer :: x214 end type mytype215 216 !CHECK: %[[INT_ALLOCA:.+]] = fir.alloca i32 {bindc_name = "int_var", uniq_name = "_QFtask_firstprivateEint_var"}217 !CHECK: %[[INT_VAR:.+]]:2 = hlfir.declare %[[INT_ALLOCA]] {uniq_name = "_QFtask_firstprivateEint_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)218 !CHECK: %[[MYTYPE_ALLOCA:.+]] = fir.alloca !fir.type<_QFtask_firstprivateTmytype{x:i32}> {bindc_name = "mytype_var", uniq_name = "_QFtask_firstprivateEmytype_var"}219 !CHECK: %[[MYTYPE_VAR:.+]]:2 = hlfir.declare %[[MYTYPE_ALLOCA]] {uniq_name = "_QFtask_firstprivateEmytype_var"} : (!fir.ref<!fir.type<_QFtask_firstprivateTmytype{x:i32}>>) -> (!fir.ref<!fir.type<_QFtask_firstprivateTmytype{x:i32}>>, !fir.ref<!fir.type<_QFtask_firstprivateTmytype{x:i32}>>)220 integer :: int_var221 type(mytype) :: mytype_var222 223!CHECK: fir.call @_QPbaz(%[[INT_VAR]]#0, %[[MYTYPE_VAR]]#0) fastmath<contract> : (!fir.ref<i32>, !fir.ref<!fir.type<_QFtask_firstprivateTmytype{x:i32}>>) -> ()224 call baz(int_var, mytype_var)225 226 !CHECK: omp.task private(@{{.*int_var_firstprivate.*}} %[[INT_VAR]]#0 -> %[[INT_VAR_ARG:.*]], @{{.*mytype_var_firstprivate.*}} %[[MYTYPE_VAR]]#0 -> %[[MYTYPE_VAR_ARG:.*]] : !fir.ref<i32>, !fir.ref<{{.*}}) {227 !$omp task firstprivate(int_var, mytype_var)228!CHECK: %[[INT_VAR_FIRSTPRIVATE:.+]]:2 = hlfir.declare %[[INT_VAR_ARG]] {uniq_name = "_QFtask_firstprivateEint_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)229!CHECK: %[[MYTYPE_VAR_FIRSTPRIVATE:.+]]:2 = hlfir.declare %[[MYTYPE_VAR_ARG]] {uniq_name = "_QFtask_firstprivateEmytype_var"} : (!fir.ref<!fir.type<_QFtask_firstprivateTmytype{x:i32}>>) -> (!fir.ref<!fir.type<_QFtask_firstprivateTmytype{x:i32}>>, !fir.ref<!fir.type<_QFtask_firstprivateTmytype{x:i32}>>)230 call baz(int_var, mytype_var)231 !CHECK: omp.terminator232 !$omp end task233end subroutine task_firstprivate234 235!===============================================================================236! Multiple clauses237!===============================================================================238 239!CHECK-LABEL: func @_QPtask_multiple_clauses240subroutine task_multiple_clauses()241 use omp_lib242 243!CHECK: %[[X_ALLOCA:.+]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFtask_multiple_clausesEx"}244!CHECK: %[[X:.+]]:2 = hlfir.declare %[[X_ALLOCA]] {uniq_name = "_QFtask_multiple_clausesEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)245!CHECK: %[[Y_ALLOCA:.+]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFtask_multiple_clausesEy"}246!CHECK: %[[Y:.+]]:2 = hlfir.declare %[[Y_ALLOCA]] {uniq_name = "_QFtask_multiple_clausesEy"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)247!CHECK: %[[Z_ALLOCA:.+]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFtask_multiple_clausesEz"}248!CHECK: %[[Z:.+]]:2 = hlfir.declare %[[Z_ALLOCA]] {uniq_name = "_QFtask_multiple_clausesEz"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)249 integer :: x, y, z250 logical :: buzz251 252 !CHECK: omp.task allocate(%{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>) final(%{{.+}}) if(%{{.+}}) priority(%{{.+}}) private({{.*}}) {253 !$omp task if(buzz) final(buzz) priority(z) allocate(omp_high_bw_mem_alloc: x) private(x) firstprivate(y)254 255!CHECK: %[[X_PRIV:.+]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtask_multiple_clausesEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)256!CHECK: %[[Y_PRIV:.+]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtask_multiple_clausesEy"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)257 258 !CHECK: arith.addi259 x = x + 12260 !CHECK: arith.subi261 y = y - 12262 263 !CHECK: omp.terminator264 !$omp end task265end subroutine task_multiple_clauses266 267!===============================================================================268! `mergeable` clause269!===============================================================================270 271subroutine task_mergeable()272!CHECK: omp.task mergeable {273!CHECK: omp.terminator274!CHECK: }275 !$omp task mergeable276 !$omp end task277end subroutine278 279!===============================================================================280! `untied` clause281!===============================================================================282 283!CHECK-LABEL: func.func @_QPomp_task_untied() {284subroutine omp_task_untied()285 !CHECK: omp.task untied {286 !$omp task untied287 call foo()288 !CHECK: omp.terminator289 !$omp end task290end subroutine omp_task_untied291