brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.3 KiB · 67194fa Raw
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