|
5 | 5 |
|
6 | 6 | ! Privatizers |
7 | 7 |
|
| 8 | +! CHECK-LABEL: omp.private |
| 9 | +! CHECK-SAME: {type = private} @[[TASKLOOP_TEST3_I_PRIVATE:.*]] : i32 |
| 10 | +! CHECK-NOT: copy { |
| 11 | + |
| 12 | +! CHECK-LABEL: omp.private |
| 13 | +! CHECK-SAME: {type = firstprivate} @[[TASKLOOP_TEST3_X_FIRSTPRIVATE:.*]] : i32 |
| 14 | +! CHECK-SAME: copy { |
| 15 | +! CHECK: hlfir.assign |
| 16 | + |
| 17 | +! CHECK-LABEL: omp.private |
| 18 | +! CHECK-SAME: {type = private} @[[TASKLOOP_TEST2_X_PRIVATE:.*]] : i32 |
| 19 | +! CHECK-NOT: copy { |
| 20 | + |
| 21 | +! CHECK-LABEL: omp.private |
| 22 | +! CHECK-SAME: {type = private} @[[TASKLOOP_TEST2_I_PRIVATE:.*]] : i32 |
| 23 | +! CHECK-NOT: copy { |
| 24 | + |
| 25 | +! CHECK-LABEL: omp.private |
| 26 | +! CHECK-SAME: {type = private} @[[TASKLOOP_TEST1_I_PRIVATE:.*]] : i32 |
| 27 | +! CHECK-NOT: copy { |
| 28 | + |
| 29 | +! CHECK-LABEL: omp.private |
| 30 | +! CHECK-SAME: {type = firstprivate} @[[TASKLOOP_TEST1_X_FIRSTPRIVATE:.*]] : i32 |
| 31 | +! CHECK-SAME: copy { |
| 32 | +! CHECK: hlfir.assign |
| 33 | + |
| 34 | +! CHECK-LABEL: omp.private |
| 35 | +! CHECK-SAME: {type = private} @[[TASKLOOP_TEST1_Y_PRIVATE:.*]] : i32 |
| 36 | +! CHECK-NOT: copy { |
| 37 | + |
8 | 38 | ! CHECK-LABEL: omp.private |
9 | 39 | ! CHECK-SAME: {type = firstprivate} @[[TEST7_Y_FIRSTPRIV:.*]] : i32 |
10 | 40 | ! CHECK-SAME: copy { |
@@ -310,4 +340,100 @@ subroutine implicit_dsa_test7 |
310 | 340 | !$omp end task |
311 | 341 | end subroutine |
312 | 342 |
|
313 | | -! TODO Test taskloop |
| 343 | +! Test taskloop |
| 344 | +! CHECK-LABEL: func.func @_QPimplicit_dsa_taskloop_test1 |
| 345 | +! CHECK: %[[ALLOCA_I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFimplicit_dsa_taskloop_test1Ei"} |
| 346 | +! CHECK: %[[DECL_I:.*]]:2 = hlfir.declare %[[ALLOCA_I]] {uniq_name = "_QFimplicit_dsa_taskloop_test1Ei"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 347 | +! CHECK: %[[ALLOCA_X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFimplicit_dsa_taskloop_test1Ex"} |
| 348 | +! CHECK: %[[DECL_X:.*]]:2 = hlfir.declare %[[ALLOCA_X]] {uniq_name = "_QFimplicit_dsa_taskloop_test1Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 349 | +! CHECK: %[[ALLOCA_Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFimplicit_dsa_taskloop_test1Ey"} |
| 350 | +! CHECK: %[[DECL_Y:.*]]:2 = hlfir.declare %[[ALLOCA_Y]] {uniq_name = "_QFimplicit_dsa_taskloop_test1Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 351 | +! CHECK: %[[ALLOCA_Z:.*]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFimplicit_dsa_taskloop_test1Ez"} |
| 352 | +! CHECK: %[[DECL_Z:.*]]:2 = hlfir.declare %[[ALLOCA_Z]] {uniq_name = "_QFimplicit_dsa_taskloop_test1Ez"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 353 | +subroutine implicit_dsa_taskloop_test1 |
| 354 | + integer :: x, y, z |
| 355 | + ! CHECK: omp.taskloop private( |
| 356 | + ! CHECK-SAME: @[[TASKLOOP_TEST1_Y_PRIVATE]] %[[DECL_Y]]#0 -> %[[ARG0:.*]], @[[TASKLOOP_TEST1_X_FIRSTPRIVATE]] %[[DECL_X]]#0 -> %[[ARG1:.*]], @[[TASKLOOP_TEST1_I_PRIVATE]] %[[DECL_I]]#0 -> %[[ARG2:.*]] : !fir.ref<i32>, !fir.ref<i32>, !fir.ref<i32>) { |
| 357 | + ! CHECK: omp.loop_nest (%{{.*}}) : i32 = (%{{.*}}) to (%{{.*}}) inclusive step (%{{.*}}) { |
| 358 | + !$omp taskloop private(y) shared(z) |
| 359 | + do i = 1, 100 |
| 360 | + ! CHECK: %[[Y_VAL:.*]]:2 = hlfir.declare %[[ARG0]] {uniq_name = "_QFimplicit_dsa_taskloop_test1Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 361 | + ! CHECK: %[[X_VAL:.*]]:2 = hlfir.declare %[[ARG1]] {uniq_name = "_QFimplicit_dsa_taskloop_test1Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 362 | + ! CHECK: %[[LOAD_Z:.*]] = fir.load %[[DECL_Z]]#0 : !fir.ref<i32> |
| 363 | + x = y + z |
| 364 | + ! CHECK: hlfir.assign %{{.*}} to %[[X_VAL]]#0 : i32, !fir.ref<i32> |
| 365 | + end do |
| 366 | + !$omp end taskloop |
| 367 | + |
| 368 | + ! CHECK: omp.taskloop private(@[[TASKLOOP_TEST1_I_PRIVATE]] %[[DECL_I]]#0 -> %[[ARG0:.*]] : !fir.ref<i32>) { |
| 369 | + !$omp taskloop default(shared) |
| 370 | + do i = 1, 100 |
| 371 | + ! CHECK: %[[LOAD_Y:.*]] = fir.load %[[DECL_Y]]#0 : !fir.ref<i32> |
| 372 | + ! CHECK: %[[LOAD_Z:.*]] = fir.load %[[DECL_Z]]#0 : !fir.ref<i32> |
| 373 | + ! CHECK: %[[ADD_VAL:.*]] = arith.addi %[[LOAD_Y]], %[[LOAD_Z]] : i32 |
| 374 | + x = y + z |
| 375 | + ! CHECK: hlfir.assign %[[ADD_VAL]] to %[[DECL_X]]#0 : i32, !fir.ref<i32> |
| 376 | + end do |
| 377 | + !$omp end taskloop |
| 378 | +end subroutine |
| 379 | + |
| 380 | +! Nested taskloop with implicit shared DSA variables. |
| 381 | +! CHECK-LABEL: func @_QPimplicit_dsa_taskloop_test2 |
| 382 | +! CHECK: %[[I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFimplicit_dsa_taskloop_test2Ei"} |
| 383 | +! CHECK: %[[I_DECL:.*]]:2 = hlfir.declare %[[I]] {uniq_name = "_QFimplicit_dsa_taskloop_test2Ei"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 384 | +! CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFimplicit_dsa_taskloop_test2Ex"} |
| 385 | +! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFimplicit_dsa_taskloop_test2Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 386 | +subroutine implicit_dsa_taskloop_test2 |
| 387 | + integer :: x |
| 388 | + ! CHECK: omp.parallel { |
| 389 | + !$omp parallel |
| 390 | + ! CHECK: omp.taskloop private(@[[TASKLOOP_TEST2_I_PRIVATE]] %[[I_DECL]]#0 -> %[[ARG0:.*]] : !fir.ref<i32>) { |
| 391 | + !$omp taskloop |
| 392 | + do i = 1, 100 |
| 393 | + ! CHECK: hlfir.assign %{{.*}} to %[[X_DECL]]#0 : i32, !fir.ref<i32> |
| 394 | + x = 2 |
| 395 | + end do |
| 396 | + !$omp end taskloop |
| 397 | + |
| 398 | + ! CHECK: omp.taskloop private(@[[TASKLOOP_TEST2_X_PRIVATE]] %[[X_DECL]]#0 -> %[[ARG0]], @[[TASKLOOP_TEST2_I_PRIVATE]] %[[I_DECL]]#0 -> %[[ARG1:.*]] : !fir.ref<i32>, !fir.ref<i32>) { |
| 399 | + !$omp taskloop private(x) |
| 400 | + do i = 1, 10 |
| 401 | + ! CHECK: %[[DECL_PRIV_X:.*]]:2 = hlfir.declare %[[ARG0]] {uniq_name = "_QFimplicit_dsa_taskloop_test2Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 402 | + ! CHECK: %[[LOAD_X:.*]] = fir.load %[[DECL_PRIV_X]]#0 : !fir.ref<i32> |
| 403 | + x = x + 1 |
| 404 | + ! CHECK: hlfir.assign %{{.*}} to %[[DECL_PRIV_X]]#0 : i32, !fir.ref<i32> |
| 405 | + end do |
| 406 | + !$omp end parallel |
| 407 | + |
| 408 | +end subroutine |
| 409 | + |
| 410 | +! Taskloop with implicit firstprivate DSA variables, enclosed in private context. |
| 411 | + |
| 412 | +! CHECK-LABEL: func @_QPimplicit_dsa_taskloop_test3 |
| 413 | +! CHECK: %[[I:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFimplicit_dsa_taskloop_test3Ei"} |
| 414 | +! CHECK: %[[I_DECL:.*]]:2 = hlfir.declare %[[I]] {uniq_name = "_QFimplicit_dsa_taskloop_test3Ei"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 415 | +! CHECK: %[[X:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFimplicit_dsa_taskloop_test3Ex"} |
| 416 | +! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFimplicit_dsa_taskloop_test3Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 417 | +! CHECK: %[[Y:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFimplicit_dsa_taskloop_test3Ey"} |
| 418 | +! CHECK: %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y]] {uniq_name = "_QFimplicit_dsa_taskloop_test3Ey"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 419 | +! CHECK: %[[Z:.*]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFimplicit_dsa_taskloop_test3Ez"} |
| 420 | +! CHECK: %[[Z_DECL:.*]]:2 = hlfir.declare %[[Z]] {uniq_name = "_QFimplicit_dsa_taskloop_test3Ez"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 421 | + |
| 422 | +subroutine implicit_dsa_taskloop_test3 |
| 423 | + integer :: x, y, z |
| 424 | + ! CHECK: omp.parallel private(@[[TASKLOOP_TEST3_X_FIRSTPRIVATE]] %[[X_DECL]]#0 -> %[[ARG0:.*]] : !fir.ref<i32>) { |
| 425 | + ! CHECK: %[[X_PRIV_VAL:.*]]:2 = hlfir.declare %[[ARG0]] {uniq_name = "_QFimplicit_dsa_taskloop_test3Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 426 | + !$omp parallel firstprivate(x) |
| 427 | + ! CHECK: omp.taskloop private(@[[TASKLOOP_TEST3_X_FIRSTPRIVATE]] %[[X_PRIV_VAL]]#0 -> %[[ARG1:.*]], @[[TASKLOOP_TEST3_I_PRIVATE]] %[[I_DECL]]#0 -> %[[ARG2:.*]] : !fir.ref<i32>, !fir.ref<i32>) { |
| 428 | + !$omp taskloop |
| 429 | + ! CHECK: %[[X_VAL:.*]]:2 = hlfir.declare %[[ARG1]] {uniq_name = "_QFimplicit_dsa_taskloop_test3Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) |
| 430 | + do i = 1, 100 |
| 431 | + ! CHECK: %[[LOAD_Y:.*]] = fir.load %[[Y_DECL]]#0 : !fir.ref<i32> |
| 432 | + ! CHECK: %[[LOAD_Z:.*]] = fir.load %[[Z_DECL]]#0 : !fir.ref<i32> |
| 433 | + x = y + z |
| 434 | + ! CHECK: hlfir.assign %{{.*}} to %[[X_VAL]]#0 : i32, !fir.ref<i32> |
| 435 | + end do |
| 436 | + !$omp end taskloop |
| 437 | + !$omp end parallel |
| 438 | +end subroutine |
| 439 | + |
0 commit comments