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