xref: /llvm-project/flang/test/Lower/OpenMP/implicit-dsa.f90 (revision 8f9dbb0a780feed60416ebc6ef8e89f4b0c2dca7)
110df3207SKareem Ergawy! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s 2>&1 \
210df3207SKareem Ergawy! RUN: | FileCheck %s
31e9625e5SLeandro Lupori
41e9625e5SLeandro Lupori! Checks lowering of OpenMP variables with implicitly determined DSAs.
51e9625e5SLeandro Lupori
6*8f9dbb0aSTom Eccles! Privatizers
7*8f9dbb0aSTom Eccles
8*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
9*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = private} @[[TEST6_Y_PRIV:.*]] : !fir.ref<i32>
10*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "y"
11*8f9dbb0aSTom Eccles! CHECK-NOT:   } copy {
12*8f9dbb0aSTom Eccles
13*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
14*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = private} @[[TEST6_X_PRIV:.*]] : !fir.ref<i32>
15*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "x"
16*8f9dbb0aSTom Eccles! CHECK-NOT:   } copy {
17*8f9dbb0aSTom Eccles
18*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
19*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = firstprivate} @[[TEST6_Z_FIRSTPRIV:.*]] : !fir.ref<i32>
20*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "z"
21*8f9dbb0aSTom Eccles! CHECK:       } copy {
22*8f9dbb0aSTom Eccles! CHECK:         hlfir.assign
23*8f9dbb0aSTom Eccles
24*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
25*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = firstprivate} @[[TEST6_Y_FIRSTPRIV:.*]] : !fir.ref<i32>
26*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "y"
27*8f9dbb0aSTom Eccles! CHECK:       } copy {
28*8f9dbb0aSTom Eccles! CHECK:         hlfir.assign
29*8f9dbb0aSTom Eccles
30*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
31*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = firstprivate} @[[TEST6_X_FIRSTPRIV:.*]] : !fir.ref<i32>
32*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "x"
33*8f9dbb0aSTom Eccles! CHECK:       } copy {
34*8f9dbb0aSTom Eccles! CHECK:         hlfir.assign
35*8f9dbb0aSTom Eccles
36*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
37*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = firstprivate} @[[TEST5_X_FIRSTPRIV:.*]] : !fir.ref<i32>
38*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "x"
39*8f9dbb0aSTom Eccles! CHECK:       } copy {
40*8f9dbb0aSTom Eccles! CHECK:         hlfir.assign
41*8f9dbb0aSTom Eccles
42*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
43*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = private} @[[TEST5_X_PRIV:.*]] : !fir.ref<i32>
44*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "x"
45*8f9dbb0aSTom Eccles! CHECK-NOT:   } copy {
46*8f9dbb0aSTom Eccles
47*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
48*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = firstprivate} @[[TEST4_Y_FIRSTPRIV:.*]] : !fir.ref<i32>
49*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "y"
50*8f9dbb0aSTom Eccles! CHECK:       } copy {
51*8f9dbb0aSTom Eccles! CHECK:         hlfir.assign
52*8f9dbb0aSTom Eccles
53*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
54*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = firstprivate} @[[TEST4_Z_FIRSTPRIV:.*]] : !fir.ref<i32>
55*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "z"
56*8f9dbb0aSTom Eccles! CHECK:       } copy {
57*8f9dbb0aSTom Eccles! CHECK:         hlfir.assign
58*8f9dbb0aSTom Eccles
59*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
60*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = firstprivate} @[[TEST4_X_FIRSTPRIV:.*]] : !fir.ref<i32>
61*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "x"
62*8f9dbb0aSTom Eccles! CHECK:       } copy {
63*8f9dbb0aSTom Eccles! CHECK:         hlfir.assign
64*8f9dbb0aSTom Eccles
65*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
66*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = private} @[[TEST4_Y_PRIV:.*]] : !fir.ref<i32>
67*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "y"
68*8f9dbb0aSTom Eccles! CHECK-NOT:   } copy {
69*8f9dbb0aSTom Eccles
70*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
71*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = private} @[[TEST4_Z_PRIV:.*]] : !fir.ref<i32>
72*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "z"
73*8f9dbb0aSTom Eccles! CHECK-NOT:   } copy {
74*8f9dbb0aSTom Eccles
75*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
76*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = private} @[[TEST4_X_PRIV:.*]] : !fir.ref<i32>
77*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "x"
78*8f9dbb0aSTom Eccles! CHECK-NOT:   } copy {
79*8f9dbb0aSTom Eccles
80*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
81*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = firstprivate} @[[TEST3_X_FIRSTPRIV:.*]] : !fir.ref<i32>
82*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "x"
83*8f9dbb0aSTom Eccles! CHECK:       } copy {
84*8f9dbb0aSTom Eccles! CHECK:         hlfir.assign
85*8f9dbb0aSTom Eccles
86*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
87*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = firstprivate} @[[TEST2_X_FIRSTPRIV:.*]] : !fir.ref<i32>
88*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "x"
89*8f9dbb0aSTom Eccles! CHECK:       } copy {
90*8f9dbb0aSTom Eccles! CHECK:         hlfir.assign
91*8f9dbb0aSTom Eccles
92*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
93*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = firstprivate} @[[TEST1_X_FIRSTPRIV:.*]] : !fir.ref<i32>
94*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "x"
95*8f9dbb0aSTom Eccles! CHECK:       } copy {
96*8f9dbb0aSTom Eccles! CHECK:         hlfir.assign
97*8f9dbb0aSTom Eccles
98*8f9dbb0aSTom Eccles! CHECK-LABEL: omp.private
99*8f9dbb0aSTom Eccles! CHECK-SAME:      {type = private} @[[TEST1_Y_PRIV:.*]] : !fir.ref<i32>
100*8f9dbb0aSTom Eccles! CHECK:         fir.alloca i32 {bindc_name = "y"
101*8f9dbb0aSTom Eccles! CHECK-NOT:   } copy {
102*8f9dbb0aSTom Eccles
1031e9625e5SLeandro Lupori! Basic cases.
1041e9625e5SLeandro Lupori!CHECK-LABEL: func @_QPimplicit_dsa_test1
1051e9625e5SLeandro Lupori!CHECK:       %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFimplicit_dsa_test1Ex"}
1061e9625e5SLeandro Lupori!CHECK:       %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFimplicit_dsa_test1Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1071e9625e5SLeandro Lupori!CHECK:       %[[Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFimplicit_dsa_test1Ey"}
1081e9625e5SLeandro Lupori!CHECK:       %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y]] {uniq_name = "_QFimplicit_dsa_test1Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1091e9625e5SLeandro Lupori!CHECK:       %[[Z:.*]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFimplicit_dsa_test1Ez"}
1101e9625e5SLeandro Lupori!CHECK:       %[[Z_DECL:.*]]:2 = hlfir.declare %[[Z]] {uniq_name = "_QFimplicit_dsa_test1Ez"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
111*8f9dbb0aSTom Eccles!CHECK:       omp.task private(@[[TEST1_Y_PRIV]] %[[Y_DECL]]#0 -> %[[PRIV_Y:.*]], @[[TEST1_X_FIRSTPRIV]] %[[X_DECL]]#0 -> %[[PRIV_X:.*]] : !fir.ref<i32>, !fir.ref<i32>) {
1121e9625e5SLeandro Lupori!CHECK-NEXT:    %[[PRIV_Y_DECL:.*]]:2 = hlfir.declare %[[PRIV_Y]] {uniq_name = "_QFimplicit_dsa_test1Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1131e9625e5SLeandro Lupori!CHECK-NEXT:    %[[PRIV_X_DECL:.*]]:2 = hlfir.declare %[[PRIV_X]] {uniq_name = "_QFimplicit_dsa_test1Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1141e9625e5SLeandro Lupori!CHECK:       }
1151e9625e5SLeandro Lupori!CHECK:       omp.task {
1161e9625e5SLeandro Lupori!CHECK:       }
1171e9625e5SLeandro Luporisubroutine implicit_dsa_test1
1181e9625e5SLeandro Lupori  integer :: x, y, z
1191e9625e5SLeandro Lupori
1201e9625e5SLeandro Lupori  !$omp task private(y) shared(z)
1211e9625e5SLeandro Lupori    x = y + z
1221e9625e5SLeandro Lupori  !$omp end task
1231e9625e5SLeandro Lupori
1241e9625e5SLeandro Lupori  !$omp task default(shared)
1251e9625e5SLeandro Lupori    x = y + z
1261e9625e5SLeandro Lupori  !$omp end task
1271e9625e5SLeandro Luporiend subroutine
1281e9625e5SLeandro Lupori
1291e9625e5SLeandro Lupori! Nested task with implicit firstprivate DSA variable.
1301e9625e5SLeandro Lupori!CHECK-LABEL: func @_QPimplicit_dsa_test2
1311e9625e5SLeandro Lupori!CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFimplicit_dsa_test2Ex"}
1321e9625e5SLeandro Lupori!CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFimplicit_dsa_test2Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1331e9625e5SLeandro Lupori!CHECK: omp.task {
134*8f9dbb0aSTom Eccles!CHECK:   omp.task private(@[[TEST2_X_FIRSTPRIV]] %[[X_DECL]]#0 -> %[[PRIV_X:.*]] : !fir.ref<i32>) {
1351e9625e5SLeandro Lupori!CHECK:     %[[PRIV_X_DECL:.*]]:2 = hlfir.declare %[[PRIV_X]] {uniq_name = "_QFimplicit_dsa_test2Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1361e9625e5SLeandro Lupori!CHECK:   }
1371e9625e5SLeandro Lupori!CHECK: }
1381e9625e5SLeandro Luporisubroutine implicit_dsa_test2
1391e9625e5SLeandro Lupori  integer :: x
1401e9625e5SLeandro Lupori
1411e9625e5SLeandro Lupori  !$omp task
1421e9625e5SLeandro Lupori    !$omp task
1431e9625e5SLeandro Lupori      x = 1
1441e9625e5SLeandro Lupori    !$omp end task
1451e9625e5SLeandro Lupori  !$omp end task
1461e9625e5SLeandro Luporiend subroutine
1471e9625e5SLeandro Lupori
1481e9625e5SLeandro Lupori! Nested tasks with implicit shared DSA variables.
1491e9625e5SLeandro Lupori!CHECK-LABEL: func @_QPimplicit_dsa_test3
1501e9625e5SLeandro Lupori!CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFimplicit_dsa_test3Ex"}
1511e9625e5SLeandro Lupori!CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFimplicit_dsa_test3Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1521e9625e5SLeandro Lupori!CHECK: %[[Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFimplicit_dsa_test3Ey"}
1531e9625e5SLeandro Lupori!CHECK: %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y]] {uniq_name = "_QFimplicit_dsa_test3Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1541e9625e5SLeandro Lupori!CHECK: %[[Z:.*]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFimplicit_dsa_test3Ez"}
1551e9625e5SLeandro Lupori!CHECK: %[[Z_DECL:.*]]:2 = hlfir.declare %[[Z]] {uniq_name = "_QFimplicit_dsa_test3Ez"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1561e9625e5SLeandro Lupori!CHECK: omp.parallel {
1571e9625e5SLeandro Lupori!CHECK:   omp.task {
1581e9625e5SLeandro Lupori!CHECK:     %[[ONE:.*]] = arith.constant 1 : i32
1591e9625e5SLeandro Lupori!CHECK:     hlfir.assign %[[ONE]] to %[[X_DECL]]#0 : i32, !fir.ref<i32>
1601e9625e5SLeandro Lupori!CHECK:     %[[ONE:.*]] = arith.constant 1 : i32
1611e9625e5SLeandro Lupori!CHECK:     hlfir.assign %[[ONE]] to %[[Y_DECL]]#0 : i32, !fir.ref<i32>
1621e9625e5SLeandro Lupori!CHECK:   }
163*8f9dbb0aSTom Eccles!CHECK:   omp.task private(@[[TEST3_X_FIRSTPRIV]] %[[X_DECL]]#0 -> %[[PRIV_X]] : !fir.ref<i32>) {
1641e9625e5SLeandro Lupori!CHECK:     %[[PRIV_X_DECL:.*]]:2 = hlfir.declare %[[PRIV_X]] {uniq_name = "_QFimplicit_dsa_test3Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1651e9625e5SLeandro Lupori!CHECK:     %[[ONE:.*]] = arith.constant 1 : i32
1661e9625e5SLeandro Lupori!CHECK:     hlfir.assign %[[ONE]] to %[[PRIV_X_DECL]]#0 : i32, !fir.ref<i32>
1671e9625e5SLeandro Lupori!CHECK:     %[[ONE:.*]] = arith.constant 1 : i32
1681e9625e5SLeandro Lupori!CHECK:     hlfir.assign %[[ONE]] to %[[Z_DECL]]#0 : i32, !fir.ref<i32>
1691e9625e5SLeandro Lupori!CHECK:   }
1701e9625e5SLeandro Lupori!CHECK: }
1711e9625e5SLeandro Luporisubroutine implicit_dsa_test3
1721e9625e5SLeandro Lupori  integer :: x, y, z
1731e9625e5SLeandro Lupori
1741e9625e5SLeandro Lupori  !$omp parallel
1751e9625e5SLeandro Lupori    !$omp task
1761e9625e5SLeandro Lupori      x = 1
1771e9625e5SLeandro Lupori      y = 1
1781e9625e5SLeandro Lupori    !$omp end task
1791e9625e5SLeandro Lupori
1801e9625e5SLeandro Lupori    !$omp task firstprivate(x)
1811e9625e5SLeandro Lupori      x = 1
1821e9625e5SLeandro Lupori      z = 1
1831e9625e5SLeandro Lupori    !$omp end task
1841e9625e5SLeandro Lupori  !$omp end parallel
1851e9625e5SLeandro Luporiend subroutine
1861e9625e5SLeandro Lupori
1871e9625e5SLeandro Lupori! Task with implicit firstprivate DSA variables, enclosed in private context.
1881e9625e5SLeandro Lupori!CHECK-LABEL: func @_QPimplicit_dsa_test4
1891e9625e5SLeandro Lupori!CHECK:       %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFimplicit_dsa_test4Ex"}
1901e9625e5SLeandro Lupori!CHECK:       %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFimplicit_dsa_test4Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1911e9625e5SLeandro Lupori!CHECK:       %[[Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFimplicit_dsa_test4Ey"}
1921e9625e5SLeandro Lupori!CHECK:       %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y]] {uniq_name = "_QFimplicit_dsa_test4Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1931e9625e5SLeandro Lupori!CHECK:       %[[Z:.*]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFimplicit_dsa_test4Ez"}
1941e9625e5SLeandro Lupori!CHECK:       %[[Z_DECL:.*]]:2 = hlfir.declare %[[Z]] {uniq_name = "_QFimplicit_dsa_test4Ez"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
195cdb3ebf1SSergio Afonso!CHECK:       omp.parallel private({{.*}} %{{.*}}#0 -> %[[PRIV_X:.*]], {{.*}} %{{.*}}#0 -> %[[PRIV_Z:.*]], {{.*}} %{{.*}}#0 -> %[[PRIV_Y:.*]] : {{.*}}) {
1961e9625e5SLeandro Lupori!CHECK:         %[[PRIV_X_DECL:.*]]:2 = hlfir.declare %[[PRIV_X]] {uniq_name = "_QFimplicit_dsa_test4Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1971e9625e5SLeandro Lupori!CHECK:         %[[PRIV_Z_DECL:.*]]:2 = hlfir.declare %[[PRIV_Z]] {uniq_name = "_QFimplicit_dsa_test4Ez"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
1981e9625e5SLeandro Lupori!CHECK:         %[[PRIV_Y_DECL:.*]]:2 = hlfir.declare %[[PRIV_Y]] {uniq_name = "_QFimplicit_dsa_test4Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
199*8f9dbb0aSTom Eccles!CHECK:         omp.task private(@[[TEST4_X_FIRSTPRIV]] %[[PRIV_X_DECL]]#0 -> %[[PRIV2_X:.*]], @[[TEST4_Z_FIRSTPRIV]] %[[PRIV_Z_DECL]]#0 -> %[[PRIV2_Z:.*]] : !fir.ref<i32>, !fir.ref<i32>) {
2001e9625e5SLeandro Lupori!CHECK-NEXT:      %[[PRIV2_X_DECL:.*]]:2 = hlfir.declare %[[PRIV2_X]] {uniq_name = "_QFimplicit_dsa_test4Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
2011e9625e5SLeandro Lupori!CHECK-NEXT:      %[[PRIV2_Z_DECL:.*]]:2 = hlfir.declare %[[PRIV2_Z]] {uniq_name = "_QFimplicit_dsa_test4Ez"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
2021e9625e5SLeandro Lupori!CHECK:           %[[ZERO:.*]] = arith.constant 0 : i32
2031e9625e5SLeandro Lupori!CHECK-NEXT:      hlfir.assign %[[ZERO]] to %[[PRIV2_X_DECL]]#0 : i32, !fir.ref<i32>
2041e9625e5SLeandro Lupori!CHECK:           %[[ONE:.*]] = arith.constant 1 : i32
2051e9625e5SLeandro Lupori!CHECK-NEXT:      hlfir.assign %[[ONE]] to %[[PRIV2_Z_DECL]]#0 : i32, !fir.ref<i32>
2061e9625e5SLeandro Lupori!CHECK:         }
207*8f9dbb0aSTom Eccles!CHECK:         omp.task private(@[[TEST4_X_FIRSTPRIV]] %[[PRIV_X_DECL]]#0 -> %[[PRIV2_X:.*]], @[[TEST4_Y_FIRSTPRIV]] %[[PRIV_Y_DECL]]#0 -> %[[PRIV2_Y:.*]] : !fir.ref<i32>, !fir.ref<i32>) {
2081e9625e5SLeandro Lupori!CHECK-NEXT:      %[[PRIV2_X_DECL:.*]]:2 = hlfir.declare %[[PRIV2_X]] {uniq_name = "_QFimplicit_dsa_test4Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
2091e9625e5SLeandro Lupori!CHECK-NEXT:      %[[PRIV2_Y_DECL:.*]]:2 = hlfir.declare %[[PRIV2_Y]] {uniq_name = "_QFimplicit_dsa_test4Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
2101e9625e5SLeandro Lupori!CHECK:           %[[ONE:.*]] = arith.constant 1 : i32
2111e9625e5SLeandro Lupori!CHECK-NEXT:      hlfir.assign %[[ONE]] to %[[PRIV2_X_DECL]]#0 : i32, !fir.ref<i32>
2121e9625e5SLeandro Lupori!CHECK:           %[[ZERO:.*]] = arith.constant 0 : i32
2131e9625e5SLeandro Lupori!CHECK-NEXT:      hlfir.assign %[[ZERO]] to %[[PRIV2_Z_DECL]]#0 : i32, !fir.ref<i32>
2141e9625e5SLeandro Lupori!CHECK:         }
2151e9625e5SLeandro Lupori!CHECK:       }
2161e9625e5SLeandro Luporisubroutine implicit_dsa_test4
2171e9625e5SLeandro Lupori  integer :: x, y, z
2181e9625e5SLeandro Lupori
2191e9625e5SLeandro Lupori  !$omp parallel default(private)
2201e9625e5SLeandro Lupori    !$omp task
2211e9625e5SLeandro Lupori      x = 0
2221e9625e5SLeandro Lupori      z = 1
2231e9625e5SLeandro Lupori    !$omp end task
2241e9625e5SLeandro Lupori
2251e9625e5SLeandro Lupori    !$omp task
2261e9625e5SLeandro Lupori      x = 1
2271e9625e5SLeandro Lupori      y = 0
2281e9625e5SLeandro Lupori    !$omp end task
2291e9625e5SLeandro Lupori  !$omp end parallel
2301e9625e5SLeandro Luporiend subroutine
2311e9625e5SLeandro Lupori
2321e9625e5SLeandro Lupori! Inner parallel using implicit firstprivate symbol.
2331e9625e5SLeandro Lupori!CHECK-LABEL: func @_QPimplicit_dsa_test5
2341e9625e5SLeandro Lupori!CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFimplicit_dsa_test5Ex"}
2351e9625e5SLeandro Lupori!CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFimplicit_dsa_test5Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
23610df3207SKareem Ergawy!CHECK: omp.parallel private({{.*}} %{{.*}}#0 -> %[[PRIV_X:.*]] : {{.*}}) {
2371e9625e5SLeandro Lupori!CHECK:     %[[PRIV_X_DECL:.*]]:2 = hlfir.declare %[[PRIV_X]] {uniq_name = "_QFimplicit_dsa_test5Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
238*8f9dbb0aSTom Eccles!CHECK:   omp.task private(@[[TEST5_X_FIRSTPRIV]] %[[PRIV_X_DECL]]#0 -> %[[PRIV2_X:.*]] : !fir.ref<i32>) {
2391e9625e5SLeandro Lupori!CHECK:     %[[PRIV2_X_DECL:.*]]:2 = hlfir.declare %[[PRIV2_X]] {uniq_name = "_QFimplicit_dsa_test5Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
2401e9625e5SLeandro Lupori!CHECK:     omp.parallel {
2411e9625e5SLeandro Lupori!CHECK:       %[[ONE:.*]] = arith.constant 1 : i32
2421e9625e5SLeandro Lupori!CHECK:       hlfir.assign %[[ONE]] to %[[PRIV2_X_DECL]]#0 : i32, !fir.ref<i32>
2431e9625e5SLeandro Lupori!CHECK:     }
2441e9625e5SLeandro Lupori!CHECK:   }
2451e9625e5SLeandro Lupori!CHECK: }
2461e9625e5SLeandro Luporisubroutine implicit_dsa_test5
2471e9625e5SLeandro Lupori  integer :: x
2481e9625e5SLeandro Lupori
2491e9625e5SLeandro Lupori  !$omp parallel default(private)
2501e9625e5SLeandro Lupori    !$omp task
2511e9625e5SLeandro Lupori      !$omp parallel
2521e9625e5SLeandro Lupori        x = 1
2531e9625e5SLeandro Lupori      !$omp end parallel
2541e9625e5SLeandro Lupori    !$omp end task
2551e9625e5SLeandro Lupori  !$omp end parallel
2561e9625e5SLeandro Luporiend subroutine
2571e9625e5SLeandro Lupori
2581e9625e5SLeandro Lupori! Constructs nested inside a task with implicit DSA variables.
2591e9625e5SLeandro Lupori!CHECK-LABEL: func @_QPimplicit_dsa_test6
2601e9625e5SLeandro Lupori!CHECK:       %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFimplicit_dsa_test6Ex"}
2611e9625e5SLeandro Lupori!CHECK:       %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFimplicit_dsa_test6Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
2621e9625e5SLeandro Lupori!CHECK:       %[[Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFimplicit_dsa_test6Ey"}
2631e9625e5SLeandro Lupori!CHECK:       %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y]] {uniq_name = "_QFimplicit_dsa_test6Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
2641e9625e5SLeandro Lupori!CHECK:       %[[Z:.*]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFimplicit_dsa_test6Ez"}
2651e9625e5SLeandro Lupori!CHECK:       %[[Z_DECL:.*]]:2 = hlfir.declare %[[Z]] {uniq_name = "_QFimplicit_dsa_test6Ez"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
266*8f9dbb0aSTom Eccles!CHECK:       omp.task private(@[[TEST6_X_FIRSTPRIV]] %[[X_DECL]]#0 -> %[[PRIV_X:.*]], @[[TEST6_Y_FIRSTPRIV]] %[[Y_DECL]]#0 -> %[[PRIV_Y:.*]], @[[TEST6_Z_FIRSTPRIV]] %[[Z_DECL]]#0 -> %[[PRIV_Z:.*]] : !fir.ref<i32>, !fir.ref<i32>, !fir.ref<i32>) {
2671e9625e5SLeandro Lupori!CHECK-NEXT:    %[[PRIV_X_DECL:.*]]:2 = hlfir.declare %[[PRIV_X]] {uniq_name = "_QFimplicit_dsa_test6Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
2681e9625e5SLeandro Lupori!CHECK-NEXT:    %[[PRIV_Y_DECL:.*]]:2 = hlfir.declare %[[PRIV_Y]] {uniq_name = "_QFimplicit_dsa_test6Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
2691e9625e5SLeandro Lupori!CHECK-NEXT:    %[[PRIV_Z_DECL:.*]]:2 = hlfir.declare %[[PRIV_Z]] {uniq_name = "_QFimplicit_dsa_test6Ez"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
270cdb3ebf1SSergio Afonso!CHECK:         omp.parallel private({{.*}} %{{.*}}#0 -> %[[PRIV2_X:.*]], {{.*}} %{{.*}}#0 -> %[[PRIV2_Y:.*]] : {{.*}}) {
2711e9625e5SLeandro Lupori!CHECK:           %[[PRIV2_X_DECL:.*]]:2 = hlfir.declare %[[PRIV2_X]] {uniq_name = "_QFimplicit_dsa_test6Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
2721e9625e5SLeandro Lupori!CHECK-NOT:       hlfir.assign
2731e9625e5SLeandro Lupori!CHECK:           %[[PRIV2_Y_DECL:.*]]:2 = hlfir.declare %[[PRIV2_Y]] {uniq_name = "_QFimplicit_dsa_test6Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
2741e9625e5SLeandro Lupori!CHECK-NOT:       hlfir.assign
2751e9625e5SLeandro Lupori!CHECK:           hlfir.assign %{{.*}} to %[[PRIV2_X_DECL]]
2761e9625e5SLeandro Lupori!CHECK:         }
277cdb3ebf1SSergio Afonso!CHECK:         omp.parallel private({{.*firstprivate.*}} %{{.*}}#0 -> %[[PRIV3_X:.*]], {{.*firstprivate.*}} %{{.*}}#0 -> %[[PRIV3_Z:.*]] : {{.*}}) {
2781e9625e5SLeandro Lupori!CHECK-NEXT:      %[[PRIV3_X_DECL:.*]]:2 = hlfir.declare %[[PRIV3_X]] {uniq_name = "_QFimplicit_dsa_test6Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
2791e9625e5SLeandro Lupori!CHECK-NEXT:      %[[PRIV3_Z_DECL:.*]]:2 = hlfir.declare %[[PRIV3_Z]] {uniq_name = "_QFimplicit_dsa_test6Ez"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
2801e9625e5SLeandro Lupori!CHECK:           hlfir.assign %{{.*}} to %[[PRIV_Y_DECL]]#0 : i32, !fir.ref<i32>
2811e9625e5SLeandro Lupori!CHECK:         }
2821e9625e5SLeandro Lupori!CHECK:       }
2831e9625e5SLeandro Luporisubroutine implicit_dsa_test6
2841e9625e5SLeandro Lupori  integer :: x, y, z
2851e9625e5SLeandro Lupori
2861e9625e5SLeandro Lupori  !$omp task
2871e9625e5SLeandro Lupori    !$omp parallel default(private)
2881e9625e5SLeandro Lupori      x = y
2891e9625e5SLeandro Lupori    !$omp end parallel
2901e9625e5SLeandro Lupori
2911e9625e5SLeandro Lupori    !$omp parallel default(firstprivate) shared(y)
2921e9625e5SLeandro Lupori      y = x + z
2931e9625e5SLeandro Lupori    !$omp end parallel
2941e9625e5SLeandro Lupori  !$omp end task
2951e9625e5SLeandro Luporiend subroutine
2961e9625e5SLeandro Lupori
2971e9625e5SLeandro Lupori! Test taskgroup - it uses the same scope as task.
2981e9625e5SLeandro Lupori!CHECK-LABEL: func @_QPimplicit_dsa_test7
2991e9625e5SLeandro Lupori!CHECK:       %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFimplicit_dsa_test7Ex"}
3001e9625e5SLeandro Lupori!CHECK:       %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFimplicit_dsa_test7Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
3011e9625e5SLeandro Lupori!CHECK:       %[[Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFimplicit_dsa_test7Ey"}
3021e9625e5SLeandro Lupori!CHECK:       %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y]] {uniq_name = "_QFimplicit_dsa_test7Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
3031e9625e5SLeandro Lupori!CHECK:       omp.task {
3041e9625e5SLeandro Lupori!CHECK:         omp.taskgroup {
3051e9625e5SLeandro Lupori!CHECK-NEXT:      %[[PRIV_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFimplicit_dsa_test7Ex"}
3061e9625e5SLeandro Lupori!CHECK-NEXT:      %[[PRIV_X_DECL:.*]]:2 = hlfir.declare %[[PRIV_X]] {uniq_name = "_QFimplicit_dsa_test7Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
3071e9625e5SLeandro Lupori!CHECK-NEXT:      %[[TEMP:.*]] = fir.load %[[X_DECL]]#0 : !fir.ref<i32>
308797f0119SLeandro Lupori!CHECK-NEXT:      hlfir.assign %[[TEMP]] to %[[PRIV_X_DECL]]#0 : i32, !fir.ref<i32>
3091e9625e5SLeandro Lupori!CHECK-NEXT:      %[[PRIV_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFimplicit_dsa_test7Ey"}
3101e9625e5SLeandro Lupori!CHECK-NEXT:      %[[PRIV_Y_DECL:.*]]:2 = hlfir.declare %[[PRIV_Y]] {uniq_name = "_QFimplicit_dsa_test7Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
3111e9625e5SLeandro Lupori!CHECK-NEXT:      %[[TEMP2:.*]] = fir.load %[[Y_DECL]]#0 : !fir.ref<i32>
312797f0119SLeandro Lupori!CHECK-NEXT:      hlfir.assign %[[TEMP2]] to %[[PRIV_Y_DECL]]#0 : i32, !fir.ref<i32>
3131e9625e5SLeandro Lupori!CHECK:         }
3141e9625e5SLeandro Lupori!CHECK:       }
3151e9625e5SLeandro Luporisubroutine implicit_dsa_test7
3161e9625e5SLeandro Lupori  integer :: x, y
3171e9625e5SLeandro Lupori
3181e9625e5SLeandro Lupori  !$omp task
3191e9625e5SLeandro Lupori    !$omp taskgroup
3201e9625e5SLeandro Lupori      x = y
3211e9625e5SLeandro Lupori    !$omp end taskgroup
3221e9625e5SLeandro Lupori  !$omp end task
3231e9625e5SLeandro Luporiend subroutine
3241e9625e5SLeandro Lupori
3251e9625e5SLeandro Lupori! TODO Test taskloop
326