xref: /llvm-project/flang/test/Lower/OpenMP/private-commonblock.f90 (revision c4204c0b29a6721267b1bcbaeedd7b1118e42396)
168a0d0c7SKareem Ergawy! RUN: %flang_fc1 -emit-hlfir -fopenmp \
268a0d0c7SKareem Ergawy! RUN:   -mmlir --openmp-enable-delayed-privatization=true -o - %s 2>&1 \
368a0d0c7SKareem Ergawy! RUN: | FileCheck %s
4140e5d52SKiran Chandramohan
5140e5d52SKiran Chandramohan!CHECK: func.func @_QPprivate_common() {
6cdb3ebf1SSergio Afonso!CHECK: omp.parallel private(@{{.*}} %{{.*}}#0 -> %[[X:.*]], @{{.*}} %{{.*}}#0 -> %[[Y:.*]] : {{.*}}) {
7140e5d52SKiran Chandramohan!CHECK: %[[X_DECL:.*]]:2 = hlfir.declare %[[X]] {uniq_name = "_QFprivate_commonEx"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
8140e5d52SKiran Chandramohan!CHECK: %[[Y_DECL:.*]]:2 = hlfir.declare %[[Y]] {uniq_name = "_QFprivate_commonEy"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
9140e5d52SKiran Chandramohan!CHECK: omp.terminator
10140e5d52SKiran Chandramohan!CHECK: }
11140e5d52SKiran Chandramohan!CHECK: return
12140e5d52SKiran Chandramohan!CHECK: }
13140e5d52SKiran Chandramohansubroutine private_common
14140e5d52SKiran Chandramohan  common /c/ x, y
15140e5d52SKiran Chandramohan  real x, y
16140e5d52SKiran Chandramohan  !$omp parallel private(/c/)
17140e5d52SKiran Chandramohan  !$omp end parallel
18140e5d52SKiran Chandramohanend subroutine
19140e5d52SKiran Chandramohan
20140e5d52SKiran Chandramohan!CHECK:    %[[BLK_ADDR:.*]] = fir.address_of(@blk_) : !fir.ref<!fir.array<74xi8>>
21140e5d52SKiran Chandramohan!CHECK:    %[[I8_ARR:.*]] = fir.convert %[[BLK_ADDR]] : (!fir.ref<!fir.array<74xi8>>) -> !fir.ref<!fir.array<?xi8>>
22140e5d52SKiran Chandramohan!CHECK:    %[[C0:.*]] = arith.constant 0 : index
23140e5d52SKiran Chandramohan!CHECK:    %[[A_I8_REF:.*]] = fir.coordinate_of %[[I8_ARR]], %[[C0]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
24140e5d52SKiran Chandramohan!CHECK:    %[[A_REF:.*]] = fir.convert %[[A_I8_REF]] : (!fir.ref<i8>) -> !fir.ref<i32>
25140e5d52SKiran Chandramohan!CHECK:    %[[A_DECL:.*]]:2 = hlfir.declare %[[A_REF]] {uniq_name = "_QFprivate_clause_commonblockEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
26140e5d52SKiran Chandramohan!CHECK:    %[[I8_ARR:.*]] = fir.convert %[[BLK_ADDR]] : (!fir.ref<!fir.array<74xi8>>) -> !fir.ref<!fir.array<?xi8>>
27140e5d52SKiran Chandramohan!CHECK:    %[[C4:.*]] = arith.constant 4 : index
28140e5d52SKiran Chandramohan!CHECK:    %[[B_I8_REF:.*]] = fir.coordinate_of %[[I8_ARR]], %[[C4]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
29140e5d52SKiran Chandramohan!CHECK:    %[[B_REF:.*]] = fir.convert %[[B_I8_REF:.*]] : (!fir.ref<i8>) -> !fir.ref<!fir.array<10xf32>>
30140e5d52SKiran Chandramohan!CHECK:    %[[C10:.*]] = arith.constant 10 : index
31140e5d52SKiran Chandramohan!CHECK:    %[[SH10:.*]] = fir.shape %[[C10]] : (index) -> !fir.shape<1>
32140e5d52SKiran Chandramohan!CHECK:    %[[B_DECL:.*]]:2 = hlfir.declare %[[B_REF]](%[[SH10]]) {uniq_name = "_QFprivate_clause_commonblockEb"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>)
33140e5d52SKiran Chandramohan!CHECK:    %[[I8_ARR:.*]] = fir.convert %[[BLK_ADDR]] : (!fir.ref<!fir.array<74xi8>>) -> !fir.ref<!fir.array<?xi8>>
34140e5d52SKiran Chandramohan!CHECK:    %[[C44:.*]] = arith.constant 44 : index
35140e5d52SKiran Chandramohan!CHECK:    %[[C_I8_REF:.*]] = fir.coordinate_of %[[I8_ARR]], %[[C44]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
36140e5d52SKiran Chandramohan!CHECK:    %[[C_REF:.*]] = fir.convert %[[C_I8_REF]] : (!fir.ref<i8>) -> !fir.ref<!fir.char<1,5>>
37140e5d52SKiran Chandramohan!CHECK:    %[[C5:.*]] = arith.constant 5 : index
38140e5d52SKiran Chandramohan!CHECK:    %[[C_DECL:.*]]:2 = hlfir.declare %[[C_REF]] typeparams %[[C5]] {uniq_name = "_QFprivate_clause_commonblockEc"} : (!fir.ref<!fir.char<1,5>>, index) -> (!fir.ref<!fir.char<1,5>>, !fir.ref<!fir.char<1,5>>)
39140e5d52SKiran Chandramohan!CHECK:    %[[I8_ARR:.*]] = fir.convert %[[BLK_ADDR]] : (!fir.ref<!fir.array<74xi8>>) -> !fir.ref<!fir.array<?xi8>>
40140e5d52SKiran Chandramohan!CHECK:    %[[C49:.*]] = arith.constant 49 : index
41140e5d52SKiran Chandramohan!CHECK:    %[[D_I8_REF:.*]] = fir.coordinate_of %[[I8_ARR]], %[[C49]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
42140e5d52SKiran Chandramohan!CHECK:    %[[D_REF:.*]] = fir.convert %[[D_I8_REF]] : (!fir.ref<i8>) -> !fir.ref<!fir.array<5x!fir.char<1,5>>>
43140e5d52SKiran Chandramohan!CHECK:    %[[TP5:.*]] = arith.constant 5 : index
44140e5d52SKiran Chandramohan!CHECK:    %[[C5:.*]] = arith.constant 5 : index
45140e5d52SKiran Chandramohan!CHECK:    %[[SH5:.*]] = fir.shape %[[C5]] : (index) -> !fir.shape<1>
46140e5d52SKiran Chandramohan!CHECK:    %[[D_DECL:.*]]:2 = hlfir.declare %[[D_REF]](%[[SH5:.*]]) typeparams %[[TP5]] {uniq_name = "_QFprivate_clause_commonblockEd"} : (!fir.ref<!fir.array<5x!fir.char<1,5>>>, !fir.shape<1>, index) -> (!fir.ref<!fir.array<5x!fir.char<1,5>>>, !fir.ref<!fir.array<5x!fir.char<1,5>>>)
47140e5d52SKiran Chandramohan!CHECK:    %[[C_BOX:.*]] = fir.emboxchar %[[C_DECL]]#1, %c5 : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
48140e5d52SKiran Chandramohan!CHECK:    %[[D_REF:.*]] = fir.convert %[[D_DECL]]#1 : (!fir.ref<!fir.array<5x!fir.char<1,5>>>) -> !fir.ref<!fir.char<1,5>>
49140e5d52SKiran Chandramohan!CHECK:    %[[D_BOX:.*]] = fir.emboxchar %[[D_REF]], %[[TP5]] : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
50140e5d52SKiran Chandramohan!CHECK:    fir.call @_QPsub1(%[[A_DECL]]#1, %[[B_DECL]]#1, %[[C_BOX]], %[[D_BOX]]) fastmath<contract> : (!fir.ref<i32>, !fir.ref<!fir.array<10xf32>>, !fir.boxchar<1>, !fir.boxchar<1>) -> ()
51cdb3ebf1SSergio Afonso!CHECK:    omp.parallel private(@{{.*}} %{{.*}}#0 -> %[[A_PVT_REF:.*]], @{{.*}} %{{.*}}#0 -> %[[B_PVT_REF:.*]], @{{.*}} %{{.*}}#0 -> %[[C_PVT_REF:.*]], @{{.*}} %{{.*}}#0 -> %[[D_PVT_REF:.*]] : {{.*}}) {
52140e5d52SKiran Chandramohan!CHECK:      %[[A_PVT_DECL:.*]]:2 = hlfir.declare %[[A_PVT_REF]] {uniq_name = "_QFprivate_clause_commonblockEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
5368a0d0c7SKareem Ergawy!CHECK:      %[[SH10:.*]] = fir.shape %c10{{.*}} : (index) -> !fir.shape<1>
54140e5d52SKiran Chandramohan!CHECK:      %[[B_PVT_DECL:.*]]:2 = hlfir.declare %[[B_PVT_REF]](%[[SH10]]) {uniq_name = "_QFprivate_clause_commonblockEb"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>)
55140e5d52SKiran Chandramohan!CHECK:      %[[C_PVT_DECL:.*]]:2 = hlfir.declare %[[C_PVT_REF]] typeparams %{{.*}} {uniq_name = "_QFprivate_clause_commonblockEc"} : (!fir.ref<!fir.char<1,5>>, index) -> (!fir.ref<!fir.char<1,5>>, !fir.ref<!fir.char<1,5>>)
5668a0d0c7SKareem Ergawy!CHECK:      %[[SH5:.*]] = fir.shape %c5{{.*}} : (index) -> !fir.shape<1>
5768a0d0c7SKareem Ergawy!CHECK:      %[[D_PVT_DECL:.*]]:2 = hlfir.declare %[[D_PVT_REF]](%[[SH5]]) typeparams %c5{{.*}} {uniq_name = "_QFprivate_clause_commonblockEd"} : (!fir.ref<!fir.array<5x!fir.char<1,5>>>, !fir.shape<1>, index) -> (!fir.ref<!fir.array<5x!fir.char<1,5>>>, !fir.ref<!fir.array<5x!fir.char<1,5>>>)
58140e5d52SKiran Chandramohan!CHECK:      %[[C_PVT_BOX:.*]] = fir.emboxchar %[[C_PVT_DECL]]#1, %{{.*}} : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
59140e5d52SKiran Chandramohan!CHECK:      %[[D_PVT_REF:.*]] = fir.convert %[[D_PVT_DECL]]#1 : (!fir.ref<!fir.array<5x!fir.char<1,5>>>) -> !fir.ref<!fir.char<1,5>>
60140e5d52SKiran Chandramohan!CHECK:      %[[D_PVT_BOX:.*]] = fir.emboxchar %[[D_PVT_REF]], %{{.*}} : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
61140e5d52SKiran Chandramohan!CHECK:      fir.call @_QPsub2(%[[A_PVT_DECL]]#1, %[[B_PVT_DECL]]#1, %[[C_PVT_BOX]], %[[D_PVT_BOX]]) fastmath<contract> : (!fir.ref<i32>, !fir.ref<!fir.array<10xf32>>, !fir.boxchar<1>, !fir.boxchar<1>) -> ()
62140e5d52SKiran Chandramohan!CHECK:      omp.terminator
63140e5d52SKiran Chandramohan!CHECK:    }
64140e5d52SKiran Chandramohan!CHECK:    %[[C_BOX:.*]] = fir.emboxchar %[[C_DECL]]#1, %{{.*}} : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
65140e5d52SKiran Chandramohan!CHECK:    %[[D_REF:.*]] = fir.convert %[[D_DECL]]#1 : (!fir.ref<!fir.array<5x!fir.char<1,5>>>) -> !fir.ref<!fir.char<1,5>>
66140e5d52SKiran Chandramohan!CHECK:    %[[D_BOX:.*]] = fir.emboxchar %[[D_REF]], %{{.*}} : (!fir.ref<!fir.char<1,5>>, index) -> !fir.boxchar<1>
67140e5d52SKiran Chandramohan!CHECK:    fir.call @_QPsub3(%[[A_DECL]]#1, %[[B_DECL]]#1, %[[C_BOX]], %[[D_BOX]]) fastmath<contract> : (!fir.ref<i32>, !fir.ref<!fir.array<10xf32>>, !fir.boxchar<1>, !fir.boxchar<1>) -> ()
68140e5d52SKiran Chandramohansubroutine private_clause_commonblock()
69140e5d52SKiran Chandramohan  integer::a
70140e5d52SKiran Chandramohan  real::b(10)
71140e5d52SKiran Chandramohan  character(5):: c, d(5)
72140e5d52SKiran Chandramohan  common /blk/ a, b, c, d
73140e5d52SKiran Chandramohan
74140e5d52SKiran Chandramohan  call sub1(a, b, c, d)
75140e5d52SKiran Chandramohan  !$omp parallel private(/blk/)
76140e5d52SKiran Chandramohan        call sub2(a, b, c, d)
77140e5d52SKiran Chandramohan  !$omp end parallel
78140e5d52SKiran Chandramohan  call sub3(a, b, c, d)
79140e5d52SKiran Chandramohanend subroutine
80140e5d52SKiran Chandramohan
81140e5d52SKiran Chandramohan!CHECK: func.func @_QPprivate_clause_commonblock_pointer() {
82140e5d52SKiran Chandramohan!CHECK:    %[[BLK_ADDR:.*]] = fir.address_of(@blk_) : !fir.ref<!fir.array<74xi8>>
83140e5d52SKiran Chandramohan!CHECK:    %[[BLK_I8_REF:.*]] = fir.convert %[[BLK_ADDR]] : (!fir.ref<!fir.array<74xi8>>) -> !fir.ref<!fir.array<?xi8>>
84140e5d52SKiran Chandramohan!CHECK:    %[[C24:.*]] = arith.constant 24 : index
85140e5d52SKiran Chandramohan!CHECK:    %[[A_I8_REF:.*]] = fir.coordinate_of %[[BLK_I8_REF]], %[[C24]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
86140e5d52SKiran Chandramohan!CHECK:    %[[A_REF:.*]] = fir.convert %[[A_I8_REF]] : (!fir.ref<i8>) -> !fir.ref<i32>
87140e5d52SKiran Chandramohan!CHECK:    %[[A_DECL:.*]]:2 = hlfir.declare %[[A_REF]] {uniq_name = "_QFprivate_clause_commonblock_pointerEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
88140e5d52SKiran Chandramohan!CHECK:    %[[BLK_I8_REF:.*]] = fir.convert %[[BLK_ADDR]] : (!fir.ref<!fir.array<74xi8>>) -> !fir.ref<!fir.array<?xi8>>
89140e5d52SKiran Chandramohan!CHECK:    %[[C0:.*]] = arith.constant 0 : index
90140e5d52SKiran Chandramohan!CHECK:    %[[C_I8_REF:.*]] = fir.coordinate_of %[[BLK_I8_REF]], %[[C0]] : (!fir.ref<!fir.array<?xi8>>, index) -> !fir.ref<i8>
91*c4204c0bSjeanPerier!CHECK:    %[[C_REF:.*]] = fir.convert %[[C_I8_REF]] : (!fir.ref<i8>) -> !fir.ref<!fir.box<!fir.ptr<complex<f32>>>>
92*c4204c0bSjeanPerier!CHECK:    %[[C_DECL:.*]]:2 = hlfir.declare %[[C_REF]] {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFprivate_clause_commonblock_pointerEc"} : (!fir.ref<!fir.box<!fir.ptr<complex<f32>>>>) -> (!fir.ref<!fir.box<!fir.ptr<complex<f32>>>>, !fir.ref<!fir.box<!fir.ptr<complex<f32>>>>)
93*c4204c0bSjeanPerier!CHECK:    %[[C_BOX:.*]] = fir.load %[[C_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<complex<f32>>>>
94*c4204c0bSjeanPerier!CHECK:    %[[C_ADDR:.*]] = fir.box_addr %[[C_BOX]] : (!fir.box<!fir.ptr<complex<f32>>>) -> !fir.ptr<complex<f32>>
95*c4204c0bSjeanPerier!CHECK:    %[[C_REF:.*]] = fir.convert %[[C_ADDR]] : (!fir.ptr<complex<f32>>) -> !fir.ref<complex<f32>>
96*c4204c0bSjeanPerier!CHECK:    fir.call @_QPsub4(%[[C_REF]], %[[A_DECL]]#1) fastmath<contract> : (!fir.ref<complex<f32>>, !fir.ref<i32>) -> ()
97cdb3ebf1SSergio Afonso!CHECK: omp.parallel private(@{{.*}} %{{.*}}#0 -> %[[C_PVT_REF:.*]], @{{.*}} %{{.*}}#0 -> %[[A_PVT_REF:.*]] : {{.*}}) {
98*c4204c0bSjeanPerier!CHECK:      %[[C_PVT_DECL:.*]]:2 = hlfir.declare %[[C_PVT_REF]] {fortran_attrs = #fir.var_attrs<pointer>, uniq_name = "_QFprivate_clause_commonblock_pointerEc"} : (!fir.ref<!fir.box<!fir.ptr<complex<f32>>>>) -> (!fir.ref<!fir.box<!fir.ptr<complex<f32>>>>, !fir.ref<!fir.box<!fir.ptr<complex<f32>>>>)
99140e5d52SKiran Chandramohan!CHECK:      %[[A_PVT_DECL:.*]]:2 = hlfir.declare %[[A_PVT_REF]] {uniq_name = "_QFprivate_clause_commonblock_pointerEa"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
100*c4204c0bSjeanPerier!CHECK:      %[[C_PVT_BOX:.*]] = fir.load %[[C_PVT_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<complex<f32>>>>
101*c4204c0bSjeanPerier!CHECK:      %[[C_PVT_ADDR:.*]] = fir.box_addr %[[C_PVT_BOX]] : (!fir.box<!fir.ptr<complex<f32>>>) -> !fir.ptr<complex<f32>>
102*c4204c0bSjeanPerier!CHECK:      %[[C_PVT_REF:.*]] = fir.convert %[[C_PVT_ADDR]] : (!fir.ptr<complex<f32>>) -> !fir.ref<complex<f32>>
103*c4204c0bSjeanPerier!CHECK:      fir.call @_QPsub5(%[[C_PVT_REF]], %[[A_PVT_DECL]]#1) fastmath<contract> : (!fir.ref<complex<f32>>, !fir.ref<i32>) -> ()
104140e5d52SKiran Chandramohan!CHECK:      omp.terminator
105140e5d52SKiran Chandramohan!CHECK:    }
106*c4204c0bSjeanPerier!CHECK:    %[[C_BOX:.*]] = fir.load %[[C_DECL]]#0 : !fir.ref<!fir.box<!fir.ptr<complex<f32>>>>
107*c4204c0bSjeanPerier!CHECK:    %[[C_ADDR:.*]] = fir.box_addr %[[C_BOX]] : (!fir.box<!fir.ptr<complex<f32>>>) -> !fir.ptr<complex<f32>>
108*c4204c0bSjeanPerier!CHECK:    %[[C_REF:.*]] = fir.convert %[[C_ADDR]] : (!fir.ptr<complex<f32>>) -> !fir.ref<complex<f32>>
109*c4204c0bSjeanPerier!CHECK:    fir.call @_QPsub6(%[[C_REF]], %[[A_DECL]]#1) fastmath<contract> : (!fir.ref<complex<f32>>, !fir.ref<i32>) -> ()
110140e5d52SKiran Chandramohan!CHECK: return
111140e5d52SKiran Chandramohan!CHECK: }
112140e5d52SKiran Chandramohansubroutine private_clause_commonblock_pointer()
113140e5d52SKiran Chandramohan  complex, pointer :: c
114140e5d52SKiran Chandramohan  integer:: a
115140e5d52SKiran Chandramohan  common /blk/ c, a
116140e5d52SKiran Chandramohan  call sub4(c, a)
117140e5d52SKiran Chandramohan  !$omp parallel private(/blk/)
118140e5d52SKiran Chandramohan        call sub5(c, a)
119140e5d52SKiran Chandramohan  !$omp end parallel
120140e5d52SKiran Chandramohan  call sub6(c, a)
121140e5d52SKiran Chandramohanend subroutine
122