-
Notifications
You must be signed in to change notification settings - Fork 10.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Flang][OpenMP] NFC: Port a few parallel tests to HLFIR flow
- Loading branch information
1 parent
d88d983
commit 3bfc5eb
Showing
4 changed files
with
320 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,92 @@ | ||
! This test checks a few bug fixes in the PRIVATE clause lowering | ||
|
||
! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s | ||
|
||
! CHECK-LABEL: multiple_private_fix | ||
! CHECK-SAME: %[[GAMA:.*]]: !fir.ref<i32> {fir.bindc_name = "gama"} | ||
! CHECK: %[[GAMA_DECL:.*]]:2 = hlfir.declare %[[GAMA]] {uniq_name = "_QFmultiple_private_fixEgama"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: %[[VAL_0:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFmultiple_private_fixEi"} | ||
! CHECK: %[[I_DECL:.*]]:2 = hlfir.declare %[[VAL_0]] {uniq_name = "_QFmultiple_private_fixEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: %[[VAL_1:.*]] = fir.alloca i32 {bindc_name = "j", uniq_name = "_QFmultiple_private_fixEj"} | ||
! CHECK: %[[J_DECL:.*]]:2 = hlfir.declare %[[VAL_1]] {uniq_name = "_QFmultiple_private_fixEj"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: %[[VAL_2:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFmultiple_private_fixEx"} | ||
! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[VAL_2]] {uniq_name = "_QFmultiple_private_fixEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: omp.parallel { | ||
! CHECK: %[[PRIV_J:.*]] = fir.alloca i32 {bindc_name = "j", pinned | ||
! CHECK: %[[PRIV_J_DECL:.*]]:2 = hlfir.declare %[[PRIV_J]] {uniq_name = "_QFmultiple_private_fixEj"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: %[[PRIV_I:.*]] = fir.alloca i32 {adapt.valuebyref, pinned | ||
! CHECK: %[[PRIV_I_DECL:.*]]:2 = hlfir.declare %[[PRIV_I]] {uniq_name = "_QFmultiple_private_fixEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: %[[PRIV_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned | ||
! CHECK: %[[PRIV_X_DECL:.*]]:2 = hlfir.declare %[[PRIV_X]] {uniq_name = "_QFmultiple_private_fixEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: %[[ONE:.*]] = arith.constant 1 : i32 | ||
! CHECK: %[[VAL_3:.*]] = fir.load %[[GAMA_DECL]]#0 : !fir.ref<i32> | ||
! CHECK: %[[VAL_5:.*]] = arith.constant 1 : i32 | ||
! CHECK: omp.wsloop for (%[[VAL_6:.*]]) : i32 = (%[[ONE]]) to (%[[VAL_3]]) inclusive step (%[[VAL_5]]) { | ||
! CHECK: fir.store %[[VAL_6]] to %[[PRIV_I_DECL]]#1 : !fir.ref<i32> | ||
! CHECK: %[[VAL_7:.*]] = arith.constant 1 : i32 | ||
! CHECK: %[[VAL_8:.*]] = fir.convert %[[VAL_7]] : (i32) -> index | ||
! CHECK: %[[VAL_9:.*]] = fir.load %[[GAMA_DECL]]#0 : !fir.ref<i32> | ||
! CHECK: %[[VAL_10:.*]] = fir.convert %[[VAL_9]] : (i32) -> index | ||
! CHECK: %[[VAL_11:.*]] = arith.constant 1 : index | ||
! CHECK: %[[LB:.*]] = fir.convert %[[VAL_8]] : (index) -> i32 | ||
! CHECK: %[[VAL_12:.*]]:2 = fir.do_loop %[[VAL_13:[^ ]*]] = | ||
! CHECK-SAME: %[[VAL_8]] to %[[VAL_10]] step %[[VAL_11]] | ||
! CHECK-SAME: iter_args(%[[IV:.*]] = %[[LB]]) -> (index, i32) { | ||
! CHECK: fir.store %[[IV]] to %[[PRIV_J_DECL]]#1 : !fir.ref<i32> | ||
! CHECK: %[[LOAD:.*]] = fir.load %[[PRIV_I_DECL]]#0 : !fir.ref<i32> | ||
! CHECK: %[[VAL_15:.*]] = fir.load %[[PRIV_J_DECL]]#0 : !fir.ref<i32> | ||
! CHECK: %[[VAL_16:.*]] = arith.addi %[[LOAD]], %[[VAL_15]] : i32 | ||
! CHECK: hlfir.assign %[[VAL_16]] to %[[PRIV_X_DECL]]#0 : i32, !fir.ref<i32> | ||
! CHECK: %[[VAL_17:.*]] = arith.addi %[[VAL_13]], %[[VAL_11]] : index | ||
! CHECK: %[[STEPCAST:.*]] = fir.convert %[[VAL_11]] : (index) -> i32 | ||
! CHECK: %[[IVLOAD:.*]] = fir.load %[[PRIV_J_DECL]]#1 : !fir.ref<i32> | ||
! CHECK: %[[IVINC:.*]] = arith.addi %[[IVLOAD]], %[[STEPCAST]] | ||
! CHECK: fir.result %[[VAL_17]], %[[IVINC]] : index, i32 | ||
! CHECK: } | ||
! CHECK: fir.store %[[VAL_12]]#1 to %[[PRIV_J_DECL]]#1 : !fir.ref<i32> | ||
! CHECK: omp.yield | ||
! CHECK: } | ||
! CHECK: omp.terminator | ||
! CHECK: } | ||
! CHECK: return | ||
subroutine multiple_private_fix(gama) | ||
integer :: i, j, x, gama | ||
!$OMP PARALLEL DO PRIVATE(j,x) | ||
do i = 1, gama | ||
do j = 1, gama | ||
x = i + j | ||
end do | ||
end do | ||
!$OMP END PARALLEL DO | ||
end subroutine | ||
|
||
! CHECK-LABEL: multiple_private_fix2 | ||
! CHECK: %[[X1:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFmultiple_private_fix2Ex"} | ||
! CHECK: %[[X1_DECL:.*]]:2 = hlfir.declare %[[X1]] {uniq_name = "_QFmultiple_private_fix2Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: omp.parallel { | ||
! CHECK: %[[X2:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFmultiple_private_fix2Ex"} | ||
! CHECK: %[[X2_DECL:.*]]:2 = hlfir.declare %[[X2]] {uniq_name = "_QFmultiple_private_fix2Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: omp.parallel { | ||
! CHECK: %[[X3:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFmultiple_private_fix2Ex"} | ||
! CHECK: %[[X3_DECL:.*]]:2 = hlfir.declare %[[X3]] {uniq_name = "_QFmultiple_private_fix2Ex"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: %[[C3:.*]] = arith.constant 1 : i32 | ||
! CHECK: hlfir.assign %[[C3]] to %[[X3_DECL]]#0 : i32, !fir.ref<i32> | ||
! CHECK: omp.terminator | ||
! CHECK: } | ||
! CHECK: %[[C2:.*]] = arith.constant 1 : i32 | ||
! CHECK: hlfir.assign %[[C2]] to %[[X2_DECL]]#0 : i32, !fir.ref<i32> | ||
! CHECK: omp.terminator | ||
! CHECK: } | ||
! CHECK: %[[C1:.*]] = arith.constant 1 : i32 | ||
! CHECK: hlfir.assign %[[C1]] to %[[X1_DECL]]#0 : i32, !fir.ref<i32> | ||
! CHECK: return | ||
subroutine multiple_private_fix2() | ||
integer :: x | ||
!$omp parallel private(x) | ||
!$omp parallel private(x) | ||
x = 1 | ||
!$omp end parallel | ||
x = 1 | ||
!$omp end parallel | ||
x = 1 | ||
end subroutine |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,101 @@ | ||
! RUN: bbc -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s | ||
! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s | ||
|
||
!CHECK-LABEL: omp.reduction.declare | ||
!CHECK-SAME: @[[RED_F32_NAME:.*]] : f32 init { | ||
!CHECK: ^bb0(%{{.*}}: f32): | ||
!CHECK: %[[C0_1:.*]] = arith.constant 0.000000e+00 : f32 | ||
!CHECK: omp.yield(%[[C0_1]] : f32) | ||
!CHECK: } combiner { | ||
!CHECK: ^bb0(%[[ARG0:.*]]: f32, %[[ARG1:.*]]: f32): | ||
!CHECK: %[[RES:.*]] = arith.addf %[[ARG0]], %[[ARG1]] {{.*}}: f32 | ||
!CHECK: omp.yield(%[[RES]] : f32) | ||
!CHECK: } | ||
|
||
!CHECK-LABEL: omp.reduction.declare | ||
!CHECK-SAME: @[[RED_I32_NAME:.*]] : i32 init { | ||
!CHECK: ^bb0(%{{.*}}: i32): | ||
!CHECK: %[[C0_1:.*]] = arith.constant 0 : i32 | ||
!CHECK: omp.yield(%[[C0_1]] : i32) | ||
!CHECK: } combiner { | ||
!CHECK: ^bb0(%[[ARG0:.*]]: i32, %[[ARG1:.*]]: i32): | ||
!CHECK: %[[RES:.*]] = arith.addi %[[ARG0]], %[[ARG1]] : i32 | ||
!CHECK: omp.yield(%[[RES]] : i32) | ||
!CHECK: } | ||
|
||
!CHECK-LABEL: func.func @_QPsimple_int_add | ||
!CHECK: %[[IREF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsimple_int_addEi"} | ||
!CHECK: %[[I_DECL:.*]]:2 = hlfir.declare %[[IREF]] {uniq_name = "_QFsimple_int_addEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
!CHECK: %[[I_START:.*]] = arith.constant 0 : i32 | ||
!CHECK: hlfir.assign %[[I_START]] to %[[I_DECL]]#0 : i32, !fir.ref<i32> | ||
!CHECK: omp.parallel reduction(@[[RED_I32_NAME]] -> %[[I_DECL]]#0 : !fir.ref<i32>) { | ||
!CHECK: %[[I_INCR:.*]] = arith.constant 1 : i32 | ||
!CHECK: omp.reduction %[[I_INCR]], %[[I_DECL]]#0 : i32, !fir.ref<i32> | ||
!CHECK: omp.terminator | ||
!CHECK: } | ||
!CHECK: return | ||
subroutine simple_int_add | ||
integer :: i | ||
i = 0 | ||
|
||
!$omp parallel reduction(+:i) | ||
i = i + 1 | ||
!$omp end parallel | ||
|
||
print *, i | ||
end subroutine | ||
|
||
!CHECK-LABEL: func.func @_QPsimple_real_add | ||
!CHECK: %[[RREF:.*]] = fir.alloca f32 {bindc_name = "r", uniq_name = "_QFsimple_real_addEr"} | ||
!CHECK: %[[R_DECL:.*]]:2 = hlfir.declare %[[RREF]] {uniq_name = "_QFsimple_real_addEr"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>) | ||
!CHECK: %[[R_START:.*]] = arith.constant 0.000000e+00 : f32 | ||
!CHECK: hlfir.assign %[[R_START]] to %[[R_DECL]]#0 : f32, !fir.ref<f32> | ||
!CHECK: omp.parallel reduction(@[[RED_F32_NAME]] -> %[[R_DECL]]#0 : !fir.ref<f32>) { | ||
!CHECK: %[[R_INCR:.*]] = arith.constant 1.500000e+00 : f32 | ||
!CHECK: omp.reduction %[[R_INCR]], %[[R_DECL]]#0 : f32, !fir.ref<f32> | ||
!CHECK: omp.terminator | ||
!CHECK: } | ||
!CHECK: return | ||
subroutine simple_real_add | ||
real :: r | ||
r = 0.0 | ||
|
||
!$omp parallel reduction(+:r) | ||
r = r + 1.5 | ||
!$omp end parallel | ||
|
||
print *, r | ||
end subroutine | ||
|
||
!CHECK-LABEL: func.func @_QPint_real_add | ||
!CHECK: %[[IREF:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFint_real_addEi"} | ||
!CHECK: %[[I_DECL:.*]]:2 = hlfir.declare %[[IREF]] {uniq_name = "_QFint_real_addEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
!CHECK: %[[RREF:.*]] = fir.alloca f32 {bindc_name = "r", uniq_name = "_QFint_real_addEr"} | ||
!CHECK: %[[R_DECL:.*]]:2 = hlfir.declare %[[RREF]] {uniq_name = "_QFint_real_addEr"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>) | ||
!CHECK: %[[R_START:.*]] = arith.constant 0.000000e+00 : f32 | ||
!CHECK: hlfir.assign %[[R_START]] to %[[R_DECL]]#0 : f32, !fir.ref<f32> | ||
!CHECK: %[[I_START:.*]] = arith.constant 0 : i32 | ||
!CHECK: hlfir.assign %[[I_START]] to %[[I_DECL]]#0 : i32, !fir.ref<i32> | ||
!CHECK: omp.parallel reduction(@[[RED_I32_NAME]] -> %[[I_DECL]]#0 : !fir.ref<i32>, @[[RED_F32_NAME]] -> %[[R_DECL]]#0 : !fir.ref<f32>) { | ||
!CHECK: %[[R_INCR:.*]] = arith.constant 1.500000e+00 : f32 | ||
!CHECK: omp.reduction %[[R_INCR]], %[[R_DECL]]#0 : f32, !fir.ref<f32> | ||
!CHECK: %[[I_INCR:.*]] = arith.constant 3 : i32 | ||
!CHECK: omp.reduction %[[I_INCR]], %[[I_DECL]]#0 : i32, !fir.ref<i32> | ||
!CHECK: omp.terminator | ||
!CHECK: } | ||
!CHECK: return | ||
subroutine int_real_add | ||
real :: r | ||
integer :: i | ||
|
||
r = 0.0 | ||
i = 0 | ||
|
||
!$omp parallel reduction(+:i,r) | ||
r = 1.5 + r | ||
i = i + 3 | ||
!$omp end parallel | ||
|
||
print *, r | ||
print *, i | ||
end subroutine |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s | ||
|
||
!=============================================================================== | ||
! Parallel sections construct | ||
!=============================================================================== | ||
|
||
!CHECK: func @_QPomp_parallel_sections | ||
subroutine omp_parallel_sections(x, y) | ||
integer, intent(inout) :: x, y | ||
!CHECK: omp.parallel { | ||
!CHECK: omp.sections { | ||
!$omp parallel sections | ||
!CHECK: omp.section { | ||
!$omp section | ||
!CHECK: fir.load | ||
!CHECK: arith.addi | ||
!CHECK: hlfir.assign | ||
x = x + 12 | ||
!CHECK: omp.terminator | ||
!CHECK: omp.section { | ||
!$omp section | ||
!CHECK: fir.load | ||
!CHECK: arith.subi | ||
!CHECK: hlfir.assign | ||
y = y - 5 | ||
!CHECK: omp.terminator | ||
!CHECK: omp.terminator | ||
!CHECK: omp.terminator | ||
!$omp end parallel sections | ||
end subroutine omp_parallel_sections | ||
|
||
!=============================================================================== | ||
! Parallel sections construct with allocate clause | ||
!=============================================================================== | ||
|
||
!CHECK: func @_QPomp_parallel_sections | ||
subroutine omp_parallel_sections_allocate(x, y) | ||
use omp_lib | ||
integer, intent(inout) :: x, y | ||
!CHECK: %[[allocator_1:.*]] = arith.constant 1 : i32 | ||
!CHECK: %[[allocator_2:.*]] = arith.constant 1 : i32 | ||
!CHECK: omp.parallel allocate( | ||
!CHECK: %[[allocator_2]] : i32 -> %{{.*}} : !fir.ref<i32>) { | ||
!CHECK: omp.sections allocate( | ||
!CHECK: %[[allocator_1]] : i32 -> %{{.*}} : !fir.ref<i32>) { | ||
!$omp parallel sections allocate(omp_high_bw_mem_alloc: x) | ||
!CHECK: omp.section { | ||
!$omp section | ||
x = x + 12 | ||
!CHECK: omp.terminator | ||
!CHECK: omp.section { | ||
!$omp section | ||
y = y + 5 | ||
!CHECK: omp.terminator | ||
!CHECK: omp.terminator | ||
!CHECK: omp.terminator | ||
!$omp end parallel sections | ||
end subroutine omp_parallel_sections_allocate |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
! This test checks lowering of OpenMP parallel DO, with the loop bound being | ||
! a firstprivate variable | ||
|
||
! RUN: bbc -fopenmp -emit-hlfir %s -o - | FileCheck %s | ||
|
||
! CHECK: func @_QPomp_do_firstprivate(%[[ARG0:.*]]: !fir.ref<i32> {fir.bindc_name = "a"}) | ||
subroutine omp_do_firstprivate(a) | ||
! CHECK: %[[ARG0_DECL:.*]]:2 = hlfir.declare %[[ARG0]] {uniq_name = "_QFomp_do_firstprivateEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
integer::a | ||
integer::n | ||
n = a+1 | ||
!$omp parallel do firstprivate(a) | ||
! CHECK: omp.parallel { | ||
! CHECK: %[[I_PVT_REF:.*]] = fir.alloca i32 {adapt.valuebyref, pinned} | ||
! CHECK: %[[I_PVT_DECL:.*]]:2 = hlfir.declare %[[I_PVT_REF]] {uniq_name = "_QFomp_do_firstprivateEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: %[[A_PVT_REF:.*]] = fir.alloca i32 {bindc_name = "a", pinned, uniq_name = "_QFomp_do_firstprivateEa"} | ||
! CHECK: %[[A_PVT_DECL:.*]]:2 = hlfir.declare %[[A_PVT_REF]] {uniq_name = "_QFomp_do_firstprivateEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK-NEXT: %[[LD:.*]] = fir.load %[[ARG0_DECL]]#1 : !fir.ref<i32> | ||
! CHECK-NEXT: fir.store %[[LD]] to %[[A_PVT_DECL]]#1 : !fir.ref<i32> | ||
! CHECK: %[[LB:.*]] = arith.constant 1 : i32 | ||
! CHECK-NEXT: %[[UB:.*]] = fir.load %[[A_PVT_DECL]]#0 : !fir.ref<i32> | ||
! CHECK-NEXT: %[[STEP:.*]] = arith.constant 1 : i32 | ||
! CHECK-NEXT: omp.wsloop for (%[[ARG1:.*]]) : i32 = (%[[LB]]) to (%[[UB]]) inclusive step (%[[STEP]]) | ||
! CHECK-NEXT: fir.store %[[ARG1]] to %[[I_PVT_DECL]]#1 : !fir.ref<i32> | ||
! CHECK-NEXT: fir.call @_QPfoo(%[[I_PVT_DECL]]#1, %[[A_PVT_DECL]]#1) {{.*}}: (!fir.ref<i32>, !fir.ref<i32>) -> () | ||
! CHECK-NEXT: omp.yield | ||
do i=1, a | ||
call foo(i, a) | ||
end do | ||
!$omp end parallel do | ||
!CHECK: fir.call @_QPbar(%[[ARG0_DECL]]#1) {{.*}}: (!fir.ref<i32>) -> () | ||
call bar(a) | ||
end subroutine omp_do_firstprivate | ||
|
||
! CHECK: func @_QPomp_do_firstprivate2(%[[ARG0:.*]]: !fir.ref<i32> {fir.bindc_name = "a"}, %[[ARG1:.*]]: !fir.ref<i32> {fir.bindc_name = "n"}) | ||
subroutine omp_do_firstprivate2(a, n) | ||
! CHECK: %[[ARG0_DECL:.*]]:2 = hlfir.declare %[[ARG0]] {uniq_name = "_QFomp_do_firstprivate2Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: %[[ARG1_DECL:.*]]:2 = hlfir.declare %[[ARG1]] {uniq_name = "_QFomp_do_firstprivate2En"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
integer::a | ||
integer::n | ||
n = a+1 | ||
!$omp parallel do firstprivate(a, n) | ||
! CHECK: omp.parallel { | ||
! CHECK: %[[I_PVT_REF:.*]] = fir.alloca i32 {adapt.valuebyref, pinned} | ||
! CHECK: %[[I_PVT_DECL:.*]]:2 = hlfir.declare %[[I_PVT_REF]] {uniq_name = "_QFomp_do_firstprivate2Ei"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: %[[A_PVT_REF:.*]] = fir.alloca i32 {bindc_name = "a", pinned | ||
! CHECK: %[[A_PVT_DECL:.*]]:2 = hlfir.declare %[[A_PVT_REF]] {uniq_name = "_QFomp_do_firstprivate2Ea"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: %[[LD:.*]] = fir.load %[[ARG0_DECL]]#1 : !fir.ref<i32> | ||
! CHECK: fir.store %[[LD]] to %[[A_PVT_DECL]]#1 : !fir.ref<i32> | ||
! CHECK: %[[N_PVT_REF:.*]] = fir.alloca i32 {bindc_name = "n", pinned, uniq_name = "_QFomp_do_firstprivate2En"} | ||
! CHECK: %[[N_PVT_DECL:.*]]:2 = hlfir.declare %[[N_PVT_REF]] {uniq_name = "_QFomp_do_firstprivate2En"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
! CHECK: %[[LD1:.*]] = fir.load %[[ARG1_DECL]]#1 : !fir.ref<i32> | ||
! CHECK: fir.store %[[LD1]] to %[[N_PVT_DECL]]#1 : !fir.ref<i32> | ||
|
||
|
||
! CHECK: %[[LB:.*]] = fir.load %[[A_PVT_DECL]]#0 : !fir.ref<i32> | ||
! CHECK: %[[UB:.*]] = fir.load %[[N_PVT_DECL]]#0 : !fir.ref<i32> | ||
! CHECK: %[[STEP:.*]] = arith.constant 1 : i32 | ||
! CHECK: omp.wsloop for (%[[ARG2:.*]]) : i32 = (%[[LB]]) to (%[[UB]]) inclusive step (%[[STEP]]) | ||
! CHECK: fir.store %[[ARG2]] to %[[I_PVT_DECL]]#1 : !fir.ref<i32> | ||
! CHECK: fir.call @_QPfoo(%[[I_PVT_DECL]]#1, %[[A_PVT_DECL]]#1) {{.*}}: (!fir.ref<i32>, !fir.ref<i32>) -> () | ||
! CHECK: omp.yield | ||
do i= a, n | ||
call foo(i, a) | ||
end do | ||
!$omp end parallel do | ||
!CHECK: fir.call @_QPbar(%[[ARG1_DECL]]#1) {{.*}}: (!fir.ref<i32>) -> () | ||
call bar(n) | ||
end subroutine omp_do_firstprivate2 |