1fb5fd2d8SMichael Klemm! REQUIRES: openmp_runtime 2fb5fd2d8SMichael Klemm 3bfeebda3SMichael Klemm!RUN: %flang_fc1 -emit-hlfir %openmp_flags %s -o - | FileCheck %s 46d013959Sharishch4 56d013959Sharishch4!CHECK-LABEL: func @_QPomp_task_simple() { 66d013959Sharishch4subroutine omp_task_simple 76d013959Sharishch4 !CHECK: omp.task { 86d013959Sharishch4 !$omp task 96d013959Sharishch4 !CHECK: fir.call @_QPfoo() {{.*}}: () -> () 106d013959Sharishch4 call foo() 116d013959Sharishch4 !CHECK: omp.terminator 126d013959Sharishch4 !$omp end task 136d013959Sharishch4end subroutine omp_task_simple 146d013959Sharishch4 156d013959Sharishch4!=============================================================================== 166d013959Sharishch4! `if` clause 176d013959Sharishch4!=============================================================================== 186d013959Sharishch4 196d013959Sharishch4!CHECK-LABEL: func @_QPomp_task_if(%{{.+}}) { 206d013959Sharishch4subroutine omp_task_if(bar) 216d013959Sharishch4 logical, intent(inout) :: bar 226d013959Sharishch4 !CHECK: omp.task if(%{{.+}}) { 236d013959Sharishch4 !$omp task if(bar) 246d013959Sharishch4 !CHECK: fir.call @_QPfoo() {{.*}}: () -> () 256d013959Sharishch4 call foo() 266d013959Sharishch4 !CHECK: omp.terminator 276d013959Sharishch4 !$omp end task 286d013959Sharishch4end subroutine omp_task_if 296d013959Sharishch4 306d013959Sharishch4!=============================================================================== 316d013959Sharishch4! `final` clause 326d013959Sharishch4!=============================================================================== 336d013959Sharishch4 346d013959Sharishch4!CHECK-LABEL: func @_QPomp_task_final(%{{.+}}) { 356d013959Sharishch4subroutine omp_task_final(bar) 366d013959Sharishch4 logical, intent(inout) :: bar 376d013959Sharishch4 !CHECK: omp.task final(%{{.+}}) { 386d013959Sharishch4 !$omp task final(bar) 396d013959Sharishch4 !CHECK: fir.call @_QPfoo() {{.*}}: () -> () 406d013959Sharishch4 call foo() 416d013959Sharishch4 !CHECK: omp.terminator 426d013959Sharishch4 !$omp end task 436d013959Sharishch4end subroutine omp_task_final 446d013959Sharishch4 456d013959Sharishch4!=============================================================================== 466d013959Sharishch4! `priority` clause 476d013959Sharishch4!=============================================================================== 486d013959Sharishch4 496d013959Sharishch4!CHECK-LABEL: func @_QPomp_task_priority(%{{.+}}) { 506d013959Sharishch4subroutine omp_task_priority(bar) 516d013959Sharishch4 integer, intent(inout) :: bar 526d013959Sharishch4 !CHECK: omp.task priority(%{{.+}}) { 536d013959Sharishch4 !$omp task priority(bar) 546d013959Sharishch4 !CHECK: fir.call @_QPfoo() {{.*}}: () -> () 556d013959Sharishch4 call foo() 566d013959Sharishch4 !CHECK: omp.terminator 576d013959Sharishch4 !$omp end task 586d013959Sharishch4end subroutine omp_task_priority 596d013959Sharishch4 606d013959Sharishch4!=============================================================================== 616d013959Sharishch4! `allocate` clause 626d013959Sharishch4!=============================================================================== 636d013959Sharishch4 646d013959Sharishch4!CHECK-LABEL: func @_QPtask_allocate 656d013959Sharishch4subroutine task_allocate() 666d013959Sharishch4 use omp_lib 676d013959Sharishch4 integer :: x 68fb5fd2d8SMichael Klemm !CHECK: omp.task allocate(%{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>) { 696d013959Sharishch4 !$omp task allocate(omp_high_bw_mem_alloc: x) private(x) 706d013959Sharishch4 !CHECK: arith.addi 716d013959Sharishch4 x = x + 12 726d013959Sharishch4 !CHECK: omp.terminator 736d013959Sharishch4 !$omp end task 746d013959Sharishch4end subroutine task_allocate 756d013959Sharishch4 766d013959Sharishch4!=============================================================================== 776d013959Sharishch4! `depend` clause 786d013959Sharishch4!=============================================================================== 796d013959Sharishch4 806d013959Sharishch4!CHECK-LABEL: func @_QPtask_depend 816d013959Sharishch4subroutine task_depend() 826d013959Sharishch4 integer :: x 836d013959Sharishch4 !CHECK: omp.task depend(taskdependin -> %{{.+}} : !fir.ref<i32>) { 846d013959Sharishch4 !$omp task depend(in : x) 856d013959Sharishch4 !CHECK: arith.addi 866d013959Sharishch4 x = x + 12 876d013959Sharishch4 !CHECK: omp.terminator 886d013959Sharishch4 !$omp end task 896d013959Sharishch4end subroutine task_depend 906d013959Sharishch4 916d013959Sharishch4!CHECK-LABEL: func @_QPtask_depend_non_int 926d013959Sharishch4subroutine task_depend_non_int() 936d013959Sharishch4 character(len = 15) :: x 946d013959Sharishch4 integer, allocatable :: y 956d013959Sharishch4 complex :: z 96c4204c0bSjeanPerier !CHECK: omp.task depend(taskdependin -> %{{.+}} : !fir.ref<!fir.char<1,15>>, taskdependin -> %{{.+}} : !fir.ref<!fir.box<!fir.heap<i32>>>, taskdependin -> %{{.+}} : !fir.ref<complex<f32>>) { 976d013959Sharishch4 !$omp task depend(in : x, y, z) 986d013959Sharishch4 !CHECK: omp.terminator 996d013959Sharishch4 !$omp end task 1006d013959Sharishch4end subroutine task_depend_non_int 1016d013959Sharishch4 1026d013959Sharishch4!CHECK-LABEL: func @_QPtask_depend_all_kinds_one_task 1036d013959Sharishch4subroutine task_depend_all_kinds_one_task() 1046d013959Sharishch4 integer :: x 1056d013959Sharishch4 !CHECK: omp.task depend(taskdependin -> %{{.+}} : !fir.ref<i32>, taskdependout -> %{{.+}} : !fir.ref<i32>, taskdependinout -> %{{.+}} : !fir.ref<i32>) { 1066d013959Sharishch4 !$omp task depend(in : x) depend(out : x) depend(inout : x) 1076d013959Sharishch4 !CHECK: arith.addi 1086d013959Sharishch4 x = x + 12 1096d013959Sharishch4 !CHECK: omp.terminator 1106d013959Sharishch4 !$omp end task 1116d013959Sharishch4end subroutine task_depend_all_kinds_one_task 1126d013959Sharishch4 1136d013959Sharishch4!CHECK-LABEL: func @_QPtask_depend_multi_var 1146d013959Sharishch4subroutine task_depend_multi_var() 1156d013959Sharishch4 integer :: x 1166d013959Sharishch4 integer :: y 1178f9dbb0aSTom Eccles !CHECK: omp.task depend(taskdependin -> %{{.*}} : !fir.ref<i32>, taskdependin -> %{{.+}} : !fir.ref<i32>) private({{.*x_firstprivate.*}}, {{.*y_firstprivate.*}}) { 1186d013959Sharishch4 !$omp task depend(in :x,y) 1196d013959Sharishch4 !CHECK: arith.addi 1206d013959Sharishch4 x = x + 12 1216d013959Sharishch4 y = y + 12 1226d013959Sharishch4 !CHECK: omp.terminator 1236d013959Sharishch4 !$omp end task 1246d013959Sharishch4end subroutine task_depend_multi_var 1256d013959Sharishch4 1266d013959Sharishch4!CHECK-LABEL: func @_QPtask_depend_multi_task 1276d013959Sharishch4subroutine task_depend_multi_task() 1286d013959Sharishch4 integer :: x 1296d013959Sharishch4 !CHECK: omp.task depend(taskdependout -> %{{.+}} : !fir.ref<i32>) 1306d013959Sharishch4 !$omp task depend(out : x) 1316d013959Sharishch4 !CHECK: arith.addi 1326d013959Sharishch4 x = x + 12 1336d013959Sharishch4 !CHECK: omp.terminator 1346d013959Sharishch4 !$omp end task 1356d013959Sharishch4 !CHECK: omp.task depend(taskdependinout -> %{{.+}} : !fir.ref<i32>) 1366d013959Sharishch4 !$omp task depend(inout : x) 1376d013959Sharishch4 !CHECK: arith.addi 1386d013959Sharishch4 x = x + 12 1396d013959Sharishch4 !CHECK: omp.terminator 1406d013959Sharishch4 !$omp end task 1416d013959Sharishch4 !CHECK: omp.task depend(taskdependin -> %{{.+}} : !fir.ref<i32>) 1426d013959Sharishch4 !$omp task depend(in : x) 1436d013959Sharishch4 !CHECK: arith.addi 1446d013959Sharishch4 x = x + 12 1456d013959Sharishch4 !CHECK: omp.terminator 1466d013959Sharishch4 !$omp end task 147cbe583b0SThirumalai Shaktivel !CHECK: omp.task depend(taskdependmutexinoutset -> %{{.+}} : !fir.ref<i32>) 148cbe583b0SThirumalai Shaktivel !$omp task depend(mutexinoutset : x) 149cbe583b0SThirumalai Shaktivel !CHECK: arith.subi 150cbe583b0SThirumalai Shaktivel x = x - 12 151cbe583b0SThirumalai Shaktivel !CHECK: omp.terminator 152cbe583b0SThirumalai Shaktivel !$omp end task 153cbe583b0SThirumalai Shaktivel !CHECK: omp.task depend(taskdependinoutset -> %{{.+}} : !fir.ref<i32>) 154cbe583b0SThirumalai Shaktivel !$omp task depend(inoutset : x) 155cbe583b0SThirumalai Shaktivel !CHECK: arith.subi 156cbe583b0SThirumalai Shaktivel x = x - 12 157cbe583b0SThirumalai Shaktivel !CHECK: omp.terminator 158cbe583b0SThirumalai Shaktivel !$omp end task 1596d013959Sharishch4end subroutine task_depend_multi_task 1606d013959Sharishch4 1616d013959Sharishch4!=============================================================================== 1626d013959Sharishch4! `private` clause 1636d013959Sharishch4!=============================================================================== 1646d013959Sharishch4!CHECK-LABEL: func @_QPtask_private 1656d013959Sharishch4subroutine task_private 1666d013959Sharishch4 type mytype 1676d013959Sharishch4 integer :: x 1686d013959Sharishch4 end type mytype 1696d013959Sharishch4 1706d013959Sharishch4!CHECK: %[[INT_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "int_var", uniq_name = "_QFtask_privateEint_var"} 1716d013959Sharishch4!CHECK: %[[INT_VAR:.+]]:2 = hlfir.declare %[[INT_ALLOCA]] {uniq_name = "_QFtask_privateEint_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 1726d013959Sharishch4!CHECK: %[[MYTYPE_ALLOCA:.*]] = fir.alloca !fir.type<_QFtask_privateTmytype{x:i32}> {bindc_name = "mytype_var", uniq_name = "_QFtask_privateEmytype_var"} 1736d013959Sharishch4!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}>>) 1746d013959Sharishch4 integer :: int_var 1756d013959Sharishch4 type(mytype) :: mytype_var 1766d013959Sharishch4 1776d013959Sharishch4 !CHECK: fir.call @_QPbar(%[[INT_VAR]]#1, %[[MYTYPE_VAR]]#1) {{.*}}: (!fir.ref<i32>, !fir.ref<!fir.type<_QFtask_privateTmytype{x:i32}>>) -> () 1786d013959Sharishch4 call bar(int_var, mytype_var) 1796d013959Sharishch4 1808f9dbb0aSTom Eccles !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<{{.*}}>) { 1816d013959Sharishch4 !$omp task private(int_var, mytype_var) 1828f9dbb0aSTom Eccles!CHECK: %[[INT_VAR_PRIVATE:.+]]:2 = hlfir.declare %[[INT_VAR_ARG]] {uniq_name = "_QFtask_privateEint_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 1838f9dbb0aSTom Eccles!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}>>) 1846d013959Sharishch4!CHECK: fir.call @_QPbar(%[[INT_VAR_PRIVATE]]#1, %[[MYTYPE_VAR_PRIVATE]]#1) fastmath<contract> : (!fir.ref<i32>, !fir.ref<!fir.type<_QFtask_privateTmytype{x:i32}>>) -> () 1856d013959Sharishch4 call bar(int_var, mytype_var) 1866d013959Sharishch4 !CHECK: omp.terminator 1876d013959Sharishch4 !$omp end task 1886d013959Sharishch4end subroutine task_private 1896d013959Sharishch4 1906d013959Sharishch4!=============================================================================== 1916d013959Sharishch4! `firstprivate` clause 1926d013959Sharishch4!=============================================================================== 1936d013959Sharishch4!CHECK-LABEL: func @_QPtask_firstprivate 1946d013959Sharishch4subroutine task_firstprivate 1956d013959Sharishch4 type mytype 1966d013959Sharishch4 integer :: x 1976d013959Sharishch4 end type mytype 1986d013959Sharishch4 1996d013959Sharishch4 !CHECK: %[[INT_ALLOCA:.+]] = fir.alloca i32 {bindc_name = "int_var", uniq_name = "_QFtask_firstprivateEint_var"} 2006d013959Sharishch4 !CHECK: %[[INT_VAR:.+]]:2 = hlfir.declare %[[INT_ALLOCA]] {uniq_name = "_QFtask_firstprivateEint_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 2016d013959Sharishch4 !CHECK: %[[MYTYPE_ALLOCA:.+]] = fir.alloca !fir.type<_QFtask_firstprivateTmytype{x:i32}> {bindc_name = "mytype_var", uniq_name = "_QFtask_firstprivateEmytype_var"} 2026d013959Sharishch4 !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}>>) 2036d013959Sharishch4 integer :: int_var 2046d013959Sharishch4 type(mytype) :: mytype_var 2056d013959Sharishch4 2066d013959Sharishch4!CHECK: fir.call @_QPbaz(%[[INT_VAR]]#1, %[[MYTYPE_VAR]]#1) fastmath<contract> : (!fir.ref<i32>, !fir.ref<!fir.type<_QFtask_firstprivateTmytype{x:i32}>>) -> () 2076d013959Sharishch4 call baz(int_var, mytype_var) 2086d013959Sharishch4 2098f9dbb0aSTom Eccles !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<{{.*}}) { 2106d013959Sharishch4 !$omp task firstprivate(int_var, mytype_var) 2118f9dbb0aSTom Eccles!CHECK: %[[INT_VAR_FIRSTPRIVATE:.+]]:2 = hlfir.declare %[[INT_VAR_ARG]] {uniq_name = "_QFtask_firstprivateEint_var"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 2128f9dbb0aSTom Eccles!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}>>) 2136d013959Sharishch4 call baz(int_var, mytype_var) 2146d013959Sharishch4 !CHECK: omp.terminator 2156d013959Sharishch4 !$omp end task 2166d013959Sharishch4end subroutine task_firstprivate 2176d013959Sharishch4 2186d013959Sharishch4!=============================================================================== 2196d013959Sharishch4! Multiple clauses 2206d013959Sharishch4!=============================================================================== 2216d013959Sharishch4 2226d013959Sharishch4!CHECK-LABEL: func @_QPtask_multiple_clauses 2236d013959Sharishch4subroutine task_multiple_clauses() 2246d013959Sharishch4 use omp_lib 2256d013959Sharishch4 2266d013959Sharishch4!CHECK: %[[X_ALLOCA:.+]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFtask_multiple_clausesEx"} 2276d013959Sharishch4!CHECK: %[[X:.+]]:2 = hlfir.declare %[[X_ALLOCA]] {uniq_name = "_QFtask_multiple_clausesEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 2286d013959Sharishch4!CHECK: %[[Y_ALLOCA:.+]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFtask_multiple_clausesEy"} 2296d013959Sharishch4!CHECK: %[[Y:.+]]:2 = hlfir.declare %[[Y_ALLOCA]] {uniq_name = "_QFtask_multiple_clausesEy"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 2306d013959Sharishch4!CHECK: %[[Z_ALLOCA:.+]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFtask_multiple_clausesEz"} 2316d013959Sharishch4!CHECK: %[[Z:.+]]:2 = hlfir.declare %[[Z_ALLOCA]] {uniq_name = "_QFtask_multiple_clausesEz"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 2326d013959Sharishch4 integer :: x, y, z 2336d013959Sharishch4 logical :: buzz 2346d013959Sharishch4 2358f9dbb0aSTom Eccles !CHECK: omp.task allocate(%{{.+}} : i64 -> %{{.+}} : !fir.ref<i32>) final(%{{.+}}) if(%{{.+}}) priority(%{{.+}}) private({{.*}}) { 23612756831SKiran Chandramohan !$omp task if(buzz) final(buzz) priority(z) allocate(omp_high_bw_mem_alloc: x) private(x) firstprivate(y) 2376d013959Sharishch4 2388f9dbb0aSTom Eccles!CHECK: %[[X_PRIV:.+]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtask_multiple_clausesEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 2398f9dbb0aSTom Eccles!CHECK: %[[Y_PRIV:.+]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtask_multiple_clausesEy"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) 2406d013959Sharishch4 2416d013959Sharishch4 !CHECK: arith.addi 2426d013959Sharishch4 x = x + 12 2436d013959Sharishch4 !CHECK: arith.subi 2446d013959Sharishch4 y = y - 12 2456d013959Sharishch4 2466d013959Sharishch4 !CHECK: omp.terminator 2476d013959Sharishch4 !$omp end task 2486d013959Sharishch4end subroutine task_multiple_clauses 249b9e3a769SNimishMishra 250*c2aa11d1SThirumalai Shaktivel!=============================================================================== 251*c2aa11d1SThirumalai Shaktivel! `mergeable` clause 252*c2aa11d1SThirumalai Shaktivel!=============================================================================== 253*c2aa11d1SThirumalai Shaktivel 254b9e3a769SNimishMishrasubroutine task_mergeable() 255b9e3a769SNimishMishra!CHECK: omp.task mergeable { 256b9e3a769SNimishMishra!CHECK: omp.terminator 257b9e3a769SNimishMishra!CHECK: } 258b9e3a769SNimishMishra !$omp task mergeable 259b9e3a769SNimishMishra !$omp end task 260b9e3a769SNimishMishraend subroutine 261*c2aa11d1SThirumalai Shaktivel 262*c2aa11d1SThirumalai Shaktivel!=============================================================================== 263*c2aa11d1SThirumalai Shaktivel! `untied` clause 264*c2aa11d1SThirumalai Shaktivel!=============================================================================== 265*c2aa11d1SThirumalai Shaktivel 266*c2aa11d1SThirumalai Shaktivel!CHECK-LABEL: func.func @_QPomp_task_untied() { 267*c2aa11d1SThirumalai Shaktivelsubroutine omp_task_untied() 268*c2aa11d1SThirumalai Shaktivel !CHECK: omp.task untied { 269*c2aa11d1SThirumalai Shaktivel !$omp task untied 270*c2aa11d1SThirumalai Shaktivel call foo() 271*c2aa11d1SThirumalai Shaktivel !CHECK: omp.terminator 272*c2aa11d1SThirumalai Shaktivel !$omp end task 273*c2aa11d1SThirumalai Shaktivelend subroutine omp_task_untied 274