xref: /llvm-project/flang/test/Lower/OpenMP/task.f90 (revision c2aa11d148679b7d49cdff3819d5c8bdbd807777)
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