Skip to content

Commit cadcc7b

Browse files
harishch4harishc4
andauthored
[Flang][OpenMP] Port OpenMP single tests to hlfir flow (llvm#69877)
Co-authored-by: Harish Chambeti <[email protected]>
1 parent 1066481 commit cadcc7b

File tree

1 file changed

+131
-0
lines changed

1 file changed

+131
-0
lines changed

flang/test/Lower/OpenMP/single.f90

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
2+
!RUN: bbc -emit-hlfir -fopenmp %s -o - | FileCheck %s
3+
4+
!===============================================================================
5+
! Single construct
6+
!===============================================================================
7+
8+
!CHECK-LABEL: func @_QPomp_single
9+
!CHECK-SAME: (%[[X:.*]]: !fir.ref<i32> {fir.bindc_name = "x"})
10+
subroutine omp_single(x)
11+
integer, intent(inout) :: x
12+
!CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {fortran_attrs = #fir.var_attrs<intent_inout>, uniq_name = "_QFomp_singleEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
13+
!CHECK: omp.parallel
14+
!$omp parallel
15+
!CHECK: omp.single
16+
!$omp single
17+
!CHECK: %[[xval:.*]] = fir.load %[[X_DECL]]#0 : !fir.ref<i32>
18+
!CHECK: %[[res:.*]] = arith.addi %[[xval]], %{{.*}} : i32
19+
!CHECK: hlfir.assign %[[res]] to %[[X_DECL]]#0 : i32, !fir.ref<i32>
20+
x = x + 12
21+
!CHECK: omp.terminator
22+
!$omp end single
23+
!CHECK: omp.terminator
24+
!$omp end parallel
25+
end subroutine omp_single
26+
27+
!===============================================================================
28+
! Single construct with nowait
29+
!===============================================================================
30+
31+
!CHECK-LABEL: func @_QPomp_single_nowait
32+
!CHECK-SAME: (%[[X:.*]]: !fir.ref<i32> {fir.bindc_name = "x"})
33+
subroutine omp_single_nowait(x)
34+
integer, intent(inout) :: x
35+
!CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {fortran_attrs = #fir.var_attrs<intent_inout>, uniq_name = "_QFomp_single_nowaitEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
36+
!CHECK: omp.parallel
37+
!$omp parallel
38+
!CHECK: omp.single nowait
39+
!$omp single
40+
!CHECK: %[[xval:.*]] = fir.load %[[X_DECL]]#0 : !fir.ref<i32>
41+
!CHECK: %[[res:.*]] = arith.addi %[[xval]], %{{.*}} : i32
42+
!CHECK: hlfir.assign %[[res]] to %[[X_DECL]]#0 : i32, !fir.ref<i32>
43+
x = x + 12
44+
!CHECK: omp.terminator
45+
!$omp end single nowait
46+
!CHECK: omp.terminator
47+
!$omp end parallel
48+
end subroutine omp_single_nowait
49+
50+
!===============================================================================
51+
! Single construct with allocate
52+
!===============================================================================
53+
54+
!CHECK-LABEL: func @_QPsingle_allocate
55+
subroutine single_allocate()
56+
use omp_lib
57+
integer :: x
58+
!CHECK: omp.parallel {
59+
!$omp parallel
60+
!CHECK: omp.single allocate(%{{.+}} : i32 -> %{{.+}} : !fir.ref<i32>) {
61+
!$omp single allocate(omp_high_bw_mem_alloc: x) private(x)
62+
!CHECK: arith.addi
63+
x = x + 12
64+
!CHECK: omp.terminator
65+
!$omp end single
66+
!CHECK: omp.terminator
67+
!$omp end parallel
68+
end subroutine single_allocate
69+
70+
!===============================================================================
71+
! Single construct with private/firstprivate
72+
!===============================================================================
73+
74+
! CHECK-LABEL: func.func @_QPsingle_privatization(
75+
! CHECK-SAME: %[[X:.*]]: !fir.ref<f32> {fir.bindc_name = "x"},
76+
! CHECK-SAME: %[[Y:.*]]: !fir.ref<f64> {fir.bindc_name = "y"}) {
77+
! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFsingle_privatizationEx"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
78+
! CHECK: %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y]] {uniq_name = "_QFsingle_privatizationEy"} : (!fir.ref<f64>) -> (!fir.ref<f64>, !fir.ref<f64>)
79+
! CHECK: omp.single {
80+
! CHECK: %[[X_PVT:.*]] = fir.alloca f32 {bindc_name = "x", pinned, uniq_name = "_QFsingle_privatizationEx"}
81+
! CHECK: %[[X_PVT_DECL:.*]]:2 = hlfir.declare %[[X_PVT]] {uniq_name = "_QFsingle_privatizationEx"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
82+
! CHECK: %[[Y_PVT:.*]] = fir.alloca f64 {bindc_name = "y", pinned, uniq_name = "_QFsingle_privatizationEy"}
83+
! CHECK: %[[Y_PVT_DECL:.*]]:2 = hlfir.declare %[[Y_PVT]] {uniq_name = "_QFsingle_privatizationEy"} : (!fir.ref<f64>) -> (!fir.ref<f64>, !fir.ref<f64>)
84+
! CHECK: %[[Y_LOAD:.*]] = fir.load %[[Y_DECL]]#1 : !fir.ref<f64>
85+
! CHECK: fir.store %[[Y_LOAD]] to %[[Y_PVT_DECL]]#1 : !fir.ref<f64>
86+
! CHECK: fir.call @_QPbar(%[[X_PVT_DECL]]#1, %[[Y_PVT_DECL]]#1) fastmath<contract> : (!fir.ref<f32>, !fir.ref<f64>) -> ()
87+
! CHECK: omp.terminator
88+
! CHECK: }
89+
! CHECK: return
90+
! CHECK: }
91+
92+
subroutine single_privatization(x, y)
93+
real :: x
94+
real(8) :: y
95+
96+
!$omp single private(x) firstprivate(y)
97+
call bar(x, y)
98+
!$omp end single
99+
end subroutine
100+
101+
! CHECK-LABEL: func.func @_QPsingle_privatization2(
102+
! CHECK-SAME: %[[X:.*]]: !fir.ref<f32> {fir.bindc_name = "x"},
103+
! CHECK-SAME: %[[Y:.*]]: !fir.ref<f64> {fir.bindc_name = "y"}) {
104+
! CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFsingle_privatization2Ex"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
105+
! CHECK: %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y]] {uniq_name = "_QFsingle_privatization2Ey"} : (!fir.ref<f64>) -> (!fir.ref<f64>, !fir.ref<f64>)
106+
! CHECK: omp.parallel {
107+
! CHECK: omp.single {
108+
! CHECK: %[[X_PVT:.*]] = fir.alloca f32 {bindc_name = "x", pinned, uniq_name = "_QFsingle_privatization2Ex"}
109+
! CHECK: %[[X_PVT_DECL:.*]]:2 = hlfir.declare %[[X_PVT]] {uniq_name = "_QFsingle_privatization2Ex"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
110+
! CHECK: %[[Y_PVT:.*]] = fir.alloca f64 {bindc_name = "y", pinned, uniq_name = "_QFsingle_privatization2Ey"}
111+
! CHECK: %[[Y_PVT_DECL:.*]]:2 = hlfir.declare %[[Y_PVT]] {uniq_name = "_QFsingle_privatization2Ey"} : (!fir.ref<f64>) -> (!fir.ref<f64>, !fir.ref<f64>)
112+
! CHECK: %[[Y_LOAD:.*]] = fir.load %[[Y_DECL]]#1 : !fir.ref<f64>
113+
! CHECK: fir.store %[[Y_LOAD]] to %[[Y_PVT_DECL]]#1 : !fir.ref<f64>
114+
! CHECK: fir.call @_QPbar(%[[X_PVT_DECL]]#1, %[[Y_PVT_DECL]]#1) fastmath<contract> : (!fir.ref<f32>, !fir.ref<f64>) -> ()
115+
! CHECK: omp.terminator
116+
! CHECK: }
117+
! CHECK: omp.terminator
118+
! CHECK: }
119+
! CHECK: return
120+
! CHECK: }
121+
122+
subroutine single_privatization2(x, y)
123+
real :: x
124+
real(8) :: y
125+
126+
!$omp parallel
127+
!$omp single private(x) firstprivate(y)
128+
call bar(x, y)
129+
!$omp end single
130+
!$omp end parallel
131+
end subroutine

0 commit comments

Comments
 (0)