Skip to content

Commit 3385b3e

Browse files
committed
Fix omp target maps for privatized symbols
1 parent 4b3c1dc commit 3385b3e

File tree

2 files changed

+47
-63
lines changed

2 files changed

+47
-63
lines changed

flang/lib/Optimizer/OpenMP/MapsForPrivatizedSymbols.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,19 @@ class MapsForPrivatizedSymbolsPass
5555
std::underlying_type_t<llvm::omp::OpenMPOffloadMappingFlags>>(
5656
llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO);
5757
Operation *definingOp = var.getDefiningOp();
58-
auto declOp = llvm::dyn_cast_or_null<hlfir::DeclareOp>(definingOp);
59-
assert(declOp &&
60-
"Expected defining Op of privatized var to be hlfir.declare");
58+
assert(definingOp &&
59+
"Privatizing a block argument without any hlfir.declare");
6160

61+
Value varPtr = var;
6262
// We want the first result of the hlfir.declare op because our goal
6363
// is to map the descriptor (fir.box or fir.boxchar) and the first
6464
// result for hlfir.declare is the descriptor if a the symbol being
6565
// decalred needs a descriptor.
66-
Value varPtr = declOp.getBase();
66+
// Some types are boxed immediately before privatization. These have other
67+
// operations in between the privatization and the declaration. It is safe
68+
// to use var directly here because they will be boxed anyay.
69+
if (auto declOp = llvm::dyn_cast<hlfir::DeclareOp>(definingOp))
70+
varPtr = declOp.getBase();
6771

6872
// If we do not have a reference to descritor, but the descriptor itself
6973
// then we need to store that on the stack so that we can map the

flang/test/Lower/OpenMP/DelayedPrivatization/target-private-multiple-variables.f90

Lines changed: 39 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -38,95 +38,81 @@ end subroutine target_allocatable
3838
!
3939
! CHECK: omp.private {type = private}
4040
! CHECK-SAME: @[[CHAR_PRIVATIZER_SYM:[^[:space:]]+char_var[^[:space:]]+]]
41-
! CHECK-SAME: : [[CHAR_TYPE:!fir.boxchar<1>]] alloc {
41+
! CHECK-SAME: : [[CHAR_TYPE:!fir.boxchar<1>]] init {
4242
!
43-
! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[CHAR_TYPE]]):
43+
! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[CHAR_TYPE]], %[[UNUSED:.*]]: [[CHAR_TYPE]]):
4444
! CHECK-NEXT: %[[UNBOX:.*]]:2 = fir.unboxchar %[[PRIV_ARG]]
45-
! CHECK: %[[PRIV_ALLOC:.*]] = fir.alloca !fir.char<1,?>(%[[UNBOX]]#1 : index)
46-
! CHECK-NEXT: %[[PRIV_DECL:.*]]:2 = hlfir.declare %[[PRIV_ALLOC]] typeparams %[[UNBOX]]#1
47-
! CHECK-NEXT: omp.yield(%[[PRIV_DECL]]#0 : [[CHAR_TYPE]])
48-
! CHECK-NEXT: }
45+
! CHECK: %[[PRIV_ALLOC:.*]] = fir.allocmem !fir.char<1,?>(%[[UNBOX]]#1 : index)
46+
! CHECK: %[[BOXCHAR:.*]] = fir.emboxchar %[[PRIV_ALLOC]], %[[UNBOX]]#1
47+
! CHECK-NEXT: omp.yield(%[[BOXCHAR]] : [[CHAR_TYPE]])
48+
! CHECK-NEXT: } dealloc {
4949

5050
! Test the privatizer for `complex`
5151
!
5252
! CHECK: omp.private {type = private}
5353
! CHECK-SAME: @[[COMP_PRIVATIZER_SYM:[^[:space:]]+comp_var[^[:space:]]+]]
54-
! CHECK-SAME: : [[COMP_TYPE:!fir.ref<complex<f32>>]] alloc {
55-
!
56-
! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[COMP_TYPE]]):
57-
! CHECK-NEXT: %[[PRIV_ALLOC:.*]] = fir.alloca complex<f32>
58-
! CHECK-NEXT: %[[PRIV_DECL:.*]]:2 = hlfir.declare %[[PRIV_ALLOC]]
59-
! CHECK-NEXT: omp.yield(%[[PRIV_DECL]]#0 : [[COMP_TYPE]])
60-
! CHECK-NEXT: }
54+
! CHECK-SAME: : [[COMP_TYPE:complex<f32>]]{{$}}
6155

6256
! Test the privatizer for `real(:)`
6357
!
6458
! CHECK: omp.private {type = private}
6559
! CHECK-SAME: @[[ARR_PRIVATIZER_SYM:[^[:space:]]+real_arr[^[:space:]]+]]
66-
! CHECK-SAME: : [[ARR_TYPE:!fir.box<!fir.array<\?xf32>>]] alloc {
67-
!
68-
! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[ARR_TYPE]]):
69-
! CHECK: %[[C0:.*]] = arith.constant 0 : index
70-
! CHECK-NEXT: %[[DIMS:.*]]:3 = fir.box_dims %[[PRIV_ARG]], %[[C0]] : ([[ARR_TYPE]], index)
71-
! CHECK: %[[PRIV_ALLOCA:.*]] = fir.alloca !fir.array<{{\?}}xf32>
72-
! CHECK-NEXT: %[[SHAPE_SHIFT:.*]] = fir.shape_shift %[[DIMS]]#0, %[[DIMS]]#1
73-
! CHECK-NEXT: %[[PRIV_DECL:.*]]:2 = hlfir.declare %[[PRIV_ALLOCA]](%[[SHAPE_SHIFT]])
74-
! CHECK-NEXT: omp.yield(%[[PRIV_DECL]]#0 : [[ARR_TYPE]])
60+
! CHECK-SAME: : [[ARR_TYPE:!fir.box<!fir.array<\?xf32>>]] init {
61+
!
62+
! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: !fir.ref<[[ARR_TYPE]]>, %[[PRIV_ALLOC:.*]]: !fir.ref<[[ARR_TYPE]]>):
63+
! CHECK-NEXT: %[[MOLD:.*]] = fir.load %[[PRIV_ARG]]
64+
! CHECK-NEXT: %[[C0:.*]] = arith.constant 0 : index
65+
! CHECK-NEXT: %[[BOX_DIMS:.*]]:3 = fir.box_dims %[[MOLD]], %[[C0]]
66+
! CHECK-NEXT: %[[SHAPE:.*]] = fir.shape %[[BOX_DIMS]]#1
67+
! CHECK-NEXT: %[[DATA_ALLOC:.*]] = fir.allocmem !fir.array<?xf32>, %[[BOX_DIMS]]#1
68+
! CHECK-NEXT: %[[TRUE:.*]] = arith.constant true
69+
! CHECK-NEXT: %[[DECL:.*]]:2 = hlfir.declare %[[DATA_ALLOC:.*]](%[[SHAPE]])
70+
! CHECK-NEXT: %[[C0_2:.*]] = arith.constant 0 : index
71+
! CHECK-NEXT: %[[BOX_DIMS_2:.*]]:3 = fir.box_dims %[[MOLD]], %[[C0_2]]
72+
! CHECK-NEXT: %[[SHAPE_SHIFT:.*]] = fir.shape_shift %[[BOX_DIMS_2]]#0, %[[BOX_DIMS_2]]#1
73+
! CHECK-NEXT: %[[BOX:.*]] = fir.rebox %[[DECL]]#0(%[[SHAPE_SHIFT]])
74+
! CHECK-NEXT: fir.store %[[BOX]] to %[[PRIV_ALLOC]]
75+
! CHECK-NEXT: omp.yield(%[[PRIV_ALLOC]] : !fir.ref<[[ARR_TYPE]]>)
7576
! CHECK-NEXT: }
7677

7778
! Test the privatizer for `real(:)`'s lower bound
7879
!
7980
! CHECK: omp.private {type = private}
8081
! CHECK-SAME: @[[LB_PRIVATIZER_SYM:[^[:space:]]+lb[^[:space:]]+]]
81-
! CHECK-SAME: : [[LB_TYPE:!fir.ref<i64>]] alloc {
82-
83-
! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[LB_TYPE]]):
84-
! CHECK-NEXT: %[[PRIV_ALLOCA:.*]] = fir.alloca i64
85-
! CHECK-NEXT: %[[PRIV_DECL:.*]]:2 = hlfir.declare %[[PRIV_ALLOCA]]
86-
! CHECK-NEXT: omp.yield(%[[PRIV_DECL]]#0 : [[LB_TYPE]])
87-
! CHECK-NEXT: }
82+
! CHECK-SAME: : [[LB_TYPE:i64]]{{$}}
8883

8984
! Test the privatizer for `real`
9085
!
9186
! CHECK: omp.private {type = private}
9287
! CHECK-SAME: @[[REAL_PRIVATIZER_SYM:[^[:space:]]+real_var[^[:space:]]+]]
93-
! CHECK-SAME: : [[REAL_TYPE:!fir.ref<f32>]] alloc {
94-
95-
! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[REAL_TYPE]]):
96-
! CHECK-NEXT: %[[PRIV_ALLOCA:.*]] = fir.alloca f32
97-
! CHECK-NEXT: %[[PRIV_DECL:.*]]:2 = hlfir.declare %[[PRIV_ALLOCA]]
98-
! CHECK-NEXT: omp.yield(%[[PRIV_DECL]]#0 : [[REAL_TYPE]])
99-
! CHECK-NEXT: }
88+
! CHECK-SAME: : [[REAL_TYPE:f32]]{{$}}
10089

10190
! Test the privatizer for `allocatable`
10291
!
10392
! CHECK: omp.private {type = private}
10493
! CHECK-SAME: @[[ALLOC_PRIVATIZER_SYM:[^[:space:]]+alloc_var[^[:space:]]+]]
105-
! CHECK-SAME: : [[ALLOC_TYPE:!fir.ref<!fir.box<!fir.heap<i32>>>]] alloc {
94+
! CHECK-SAME: : [[ALLOC_TYPE:!fir.box<!fir.heap<i32>>]] init {
10695
!
107-
! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[ALLOC_TYPE]]):
108-
! CHECK: %[[PRIV_ALLOC:.*]] = fir.alloca !fir.box<!fir.heap<i32>>
96+
! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: !fir.ref<[[ALLOC_TYPE]]>, %[[PRIV_ALLOC:.*]]: !fir.ref<[[ALLOC_TYPE]]>):
10997
! CHECK-NEXT: %[[PRIV_ARG_VAL:.*]] = fir.load %[[PRIV_ARG]] : !fir.ref<!fir.box<!fir.heap<i32>>>
11098
! CHECK-NEXT: %[[PRIV_ARG_BOX:.*]] = fir.box_addr %[[PRIV_ARG_VAL]] : (!fir.box<!fir.heap<i32>>) -> !fir.heap<i32>
11199
! CHECK-NEXT: %[[PRIV_ARG_ADDR:.*]] = fir.convert %[[PRIV_ARG_BOX]] : (!fir.heap<i32>) -> i64
112100
! CHECK-NEXT: %[[C0:.*]] = arith.constant 0 : i64
113-
! CHECK-NEXT: %[[ALLOC_COND:.*]] = arith.cmpi ne, %[[PRIV_ARG_ADDR]], %[[C0]] : i64
101+
! CHECK-NEXT: %[[ALLOC_COND:.*]] = arith.cmpi eq, %[[PRIV_ARG_ADDR]], %[[C0]] : i64
114102
!
115103
! CHECK-NEXT: fir.if %[[ALLOC_COND]] {
116-
! CHECK: %[[PRIV_ALLOCMEM:.*]] = fir.allocmem i32 {fir.must_be_heap = true, {{.*}}}
104+
! CHECK-NEXT: %[[ZERO_BOX:.*]] = fir.embox %[[PRIV_ARG_BOX]] : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
105+
! CHECK-NEXT: fir.store %[[ZERO_BOX]] to %[[PRIV_ALLOC]] : !fir.ref<!fir.box<!fir.heap<i32>>>
106+
! CHECK-NEXT: } else {
107+
! CHECK: %[[PRIV_ALLOCMEM:.*]] = fir.allocmem i32
117108
! CHECK-NEXT: %[[PRIV_ALLOCMEM_BOX:.*]] = fir.embox %[[PRIV_ALLOCMEM]] : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
118109
! CHECK-NEXT: fir.store %[[PRIV_ALLOCMEM_BOX]] to %[[PRIV_ALLOC]] : !fir.ref<!fir.box<!fir.heap<i32>>>
119-
! CHECK-NEXT: } else {
120-
! CHECK-NEXT: %[[ZERO_BITS:.*]] = fir.zero_bits !fir.heap<i32>
121-
! CHECK-NEXT: %[[ZERO_BOX:.*]] = fir.embox %[[ZERO_BITS]] : (!fir.heap<i32>) -> !fir.box<!fir.heap<i32>>
122-
! CHECK-NEXT: fir.store %[[ZERO_BOX]] to %[[PRIV_ALLOC]] : !fir.ref<!fir.box<!fir.heap<i32>>>
123110
! CHECK-NEXT: }
124111
!
125-
! CHECK-NEXT: %[[PRIV_DECL:.*]]:2 = hlfir.declare %[[PRIV_ALLOC]]
126-
! CHECK-NEXT: omp.yield(%[[PRIV_DECL]]#0 : [[ALLOC_TYPE]])
112+
! CHECK-NEXT: omp.yield(%[[PRIV_ALLOC]] : !fir.ref<[[ALLOC_TYPE]]>)
127113
!
128114
! CHECK-NEXT: } dealloc {
129-
! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: [[ALLOC_TYPE]]):
115+
! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: !fir.ref<[[ALLOC_TYPE]]>):
130116
!
131117
! CHECK-NEXT: %[[PRIV_VAL:.*]] = fir.load %[[PRIV_ARG]]
132118
! CHECK-NEXT: %[[PRIV_ADDR:.*]] = fir.box_addr %[[PRIV_VAL]]
@@ -135,12 +121,7 @@ end subroutine target_allocatable
135121
! CHECK-NEXT: %[[PRIV_NULL_COND:.*]] = arith.cmpi ne, %[[PRIV_ADDR_I64]], %[[C0]] : i64
136122
!
137123
! CHECK-NEXT: fir.if %[[PRIV_NULL_COND]] {
138-
! CHECK: %[[PRIV_VAL_2:.*]] = fir.load %[[PRIV_ARG]]
139-
! CHECK-NEXT: %[[PRIV_ADDR_2:.*]] = fir.box_addr %[[PRIV_VAL_2]]
140-
! CHECK-NEXT: fir.freemem %[[PRIV_ADDR_2]]
141-
! CHECK-NEXT: %[[ZEROS:.*]] = fir.zero_bits
142-
! CHECK-NEXT: %[[ZEROS_BOX:.*]] = fir.embox %[[ZEROS]]
143-
! CHECK-NEXT: fir.store %[[ZEROS_BOX]] to %[[PRIV_ARG]]
124+
! CHECK-NEXT: fir.freemem %[[PRIV_ADDR]]
144125
! CHECK-NEXT: }
145126
!
146127
! CHECK-NEXT: omp.yield
@@ -157,9 +138,9 @@ end subroutine target_allocatable
157138
! CHECK: %[[CHAR_VAR_DECL:.*]]:2 = hlfir.declare %[[CHAR_VAR_ALLOC]] typeparams
158139
! CHECK: %[[REAL_ARR_ALLOC:.*]] = fir.alloca !fir.array<?xf32>, {{.*}} {bindc_name = "real_arr", {{.*}}}
159140
! CHECK: %[[REAL_ARR_DECL:.*]]:2 = hlfir.declare %[[REAL_ARR_ALLOC]]({{.*}})
141+
! CHECK: fir.store %[[REAL_ARR_DECL]]#0 to %[[REAL_ARR_DESC_ALLOCA]] : !fir.ref<!fir.box<!fir.array<?xf32>>>
160142
! CHECK: %[[MAPPED_MI0:.*]] = omp.map.info var_ptr(%[[MAPPED_DECL]]#1 : !fir.ref<i32>, i32) {{.*}}
161143
! CHECK: %[[ALLOC_VAR_MAP:.*]] = omp.map.info var_ptr(%[[ALLOC_VAR_DECL]]#0 : !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.box<!fir.heap<i32>>)
162-
! CHECK: fir.store %[[REAL_ARR_DECL]]#0 to %[[REAL_ARR_DESC_ALLOCA]] : !fir.ref<!fir.box<!fir.array<?xf32>>>
163144
! CHECK: %[[REAL_ARR_DESC_MAP:.*]] = omp.map.info var_ptr(%[[REAL_ARR_DESC_ALLOCA]] : !fir.ref<!fir.box<!fir.array<?xf32>>>, !fir.box<!fir.array<?xf32>>)
164145
! CHECK: fir.store %[[CHAR_VAR_DECL]]#0 to %[[CHAR_VAR_DESC_ALLOCA]] : !fir.ref<!fir.boxchar<1>>
165146
! CHECK: %[[CHAR_VAR_DESC_MAP:.*]] = omp.map.info var_ptr(%[[CHAR_VAR_DESC_ALLOCA]] : !fir.ref<!fir.boxchar<1>>, !fir.boxchar<1>)
@@ -174,16 +155,15 @@ end subroutine target_allocatable
174155
! CHECK-SAME: @[[ALLOC_PRIVATIZER_SYM]] %{{[^[:space:]]+}}#0 -> %[[ALLOC_ARG:[^,]+]] [map_idx=1],
175156
! CHECK-SAME: @[[REAL_PRIVATIZER_SYM]] %{{[^[:space:]]+}}#0 -> %[[REAL_ARG:[^,]+]],
176157
! CHECK-SAME: @[[LB_PRIVATIZER_SYM]] %{{[^[:space:]]+}}#0 -> %[[LB_ARG:[^,]+]],
177-
! CHECK-SAME: @[[ARR_PRIVATIZER_SYM]] %{{[^[:space:]]+}}#0 -> %[[ARR_ARG:[^,]+]] [map_idx=2],
158+
! CHECK-SAME: @[[ARR_PRIVATIZER_SYM]] %{{[^[:space:]]+}} -> %[[ARR_ARG:[^,]+]] [map_idx=2],
178159
! CHECK-SAME: @[[COMP_PRIVATIZER_SYM]] %{{[^[:space:]]+}}#0 -> %[[COMP_ARG:[^,]+]],
179160
! CHECK-SAME: @[[CHAR_PRIVATIZER_SYM]] %{{[^[:space:]]+}}#0 -> %[[CHAR_ARG:[^,]+]] [map_idx=3] :
180-
! CHECK-SAME: !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<f32>, !fir.ref<i64>, !fir.box<!fir.array<?xf32>>, !fir.ref<complex<f32>>, !fir.boxchar<1>) {
161+
! CHECK-SAME: !fir.ref<!fir.box<!fir.heap<i32>>>, !fir.ref<f32>, !fir.ref<i64>, !fir.ref<!fir.box<!fir.array<?xf32>>>, !fir.ref<complex<f32>>, !fir.boxchar<1>) {
181162
! CHECK-NOT: fir.alloca
182163
! CHECK: hlfir.declare %[[ALLOC_ARG]]
183164
! CHECK: hlfir.declare %[[REAL_ARG]]
184165
! CHECK: hlfir.declare %[[LB_ARG]]
185-
! CHECK: %[[ARR_ARG_ADDR:.*]] = fir.box_addr %[[ARR_ARG]]
186-
! CHECK: hlfir.declare %[[ARR_ARG_ADDR]]
166+
! CHECK: hlfir.declare %[[ARR_ARG]]
187167
! CHECK: hlfir.declare %[[COMP_ARG]]
188168
! CHECK: %[[CHAR_ARG_UNBOX:.*]]:2 = fir.unboxchar %[[CHAR_ARG]]
189169
! CHECK: hlfir.declare %[[CHAR_ARG_UNBOX]]

0 commit comments

Comments
 (0)