Skip to content

Commit 8fffade

Browse files
committed
[flang][OpenMP] Fix construct privatization in default clause
1 parent 74cdb8e commit 8fffade

File tree

5 files changed

+109
-21
lines changed

5 files changed

+109
-21
lines changed

flang/include/flang/Lower/AbstractConverter.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,12 @@ class AbstractConverter {
123123
virtual bool isPresentShallowLookup(Fortran::semantics::Symbol &sym) = 0;
124124

125125
/// Collect the set of symbols with \p flag in \p eval
126-
/// region if \p collectSymbols is true. Likewise, collect the
126+
/// region if \p collectSymbols is true. Otherwise, collect the
127127
/// set of the host symbols with \p flag of the associated symbols in \p eval
128-
/// region if collectHostAssociatedSymbols is true.
128+
/// region if collectHostAssociatedSymbols is true. This allows gathering
129+
/// host association details of symbols particularly in nested directives
130+
/// irrespective of \p flag \p, and can be useful where host
131+
/// association details are needed in a flag-agnostic manner.
129132
virtual void collectSymbolSet(
130133
pft::Evaluation &eval,
131134
llvm::SetVector<const Fortran::semantics::Symbol *> &symbolSet,

flang/lib/Lower/Bridge.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,7 @@ class FirConverter : public Fortran::lower::AbstractConverter {
855855
bool collectSymbol) {
856856
if (collectSymbol && oriSymbol.test(flag))
857857
symbolSet.insert(&oriSymbol);
858-
if (checkHostAssociatedSymbols)
858+
else if (checkHostAssociatedSymbols)
859859
if (const auto *details{
860860
oriSymbol
861861
.detailsIf<Fortran::semantics::HostAssocDetails>()})

flang/lib/Lower/OpenMP.cpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ class DataSharingProcessor {
120120
llvm::SetVector<const Fortran::semantics::Symbol *> privatizedSymbols;
121121
llvm::SetVector<const Fortran::semantics::Symbol *> defaultSymbols;
122122
llvm::SetVector<const Fortran::semantics::Symbol *> symbolsInNestedRegions;
123-
llvm::SetVector<const Fortran::semantics::Symbol *> symbolsInParentRegions;
124123
Fortran::lower::AbstractConverter &converter;
125124
fir::FirOpBuilder &firOpBuilder;
126125
const Fortran::parser::OmpClauseList &opClauseList;
@@ -426,14 +425,10 @@ void DataSharingProcessor::collectSymbols(
426425
/*collectSymbols=*/true,
427426
/*collectHostAssociatedSymbols=*/true);
428427
for (Fortran::lower::pft::Evaluation &e : eval.getNestedEvaluations()) {
429-
if (e.hasNestedEvaluations())
428+
if (e.hasNestedEvaluations() && !e.isConstruct())
430429
converter.collectSymbolSet(e, symbolsInNestedRegions, flag,
431430
/*collectSymbols=*/true,
432431
/*collectHostAssociatedSymbols=*/false);
433-
else
434-
converter.collectSymbolSet(e, symbolsInParentRegions, flag,
435-
/*collectSymbols=*/false,
436-
/*collectHostAssociatedSymbols=*/true);
437432
}
438433
}
439434

@@ -485,7 +480,6 @@ void DataSharingProcessor::defaultPrivatize() {
485480
!sym->GetUltimate().has<Fortran::semantics::DerivedTypeDetails>() &&
486481
!sym->GetUltimate().has<Fortran::semantics::NamelistDetails>() &&
487482
!symbolsInNestedRegions.contains(sym) &&
488-
!symbolsInParentRegions.contains(sym) &&
489483
!privatizedSymbols.contains(sym)) {
490484
cloneSymbol(sym);
491485
copyFirstPrivateSymbol(sym);

flang/test/Lower/OpenMP/FIR/default-clause.f90

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -192,31 +192,40 @@ subroutine nested_default_clause_tests
192192
!CHECK: omp.parallel {
193193
!CHECK: %[[PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
194194
!CHECK: %[[PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFnested_default_clause_testsEy"}
195-
!CHECK: %[[PRIVATE_Z:.*]] = fir.alloca i32 {bindc_name = "z", pinned, uniq_name = "_QFnested_default_clause_testsEz"}
196195
!CHECK: %[[PRIVATE_W:.*]] = fir.alloca i32 {bindc_name = "w", pinned, uniq_name = "_QFnested_default_clause_testsEw"}
196+
!CHECK: %[[PRIVATE_Z:.*]] = fir.alloca i32 {bindc_name = "z", pinned, uniq_name = "_QFnested_default_clause_testsEz"}
197197
!CHECK: omp.parallel {
198198
!CHECK: %[[PRIVATE_INNER_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
199199
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_X]] : !fir.ref<i32>
200200
!CHECK: fir.store %[[temp]] to %[[PRIVATE_INNER_X]] : !fir.ref<i32>
201-
!CHECK: %[[INNER_PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFnested_default_clause_testsEy"}
201+
!CHECK: %[[PRIVATE_INNER_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFnested_default_clause_testsEy"}
202202
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_Y]] : !fir.ref<i32>
203-
!CHECK: fir.store %[[temp]] to %[[INNER_PRIVATE_Y]] : !fir.ref<i32>
204-
!CHECK: %[[temp:.*]] = fir.load %[[INNER_PRIVATE_Y]] : !fir.ref<i32>
203+
!CHECK: fir.store %[[temp]] to %[[PRIVATE_INNER_Y]] : !fir.ref<i32>
204+
!CHECK: %[[PRIVATE_INNER_W:.*]] = fir.alloca i32 {bindc_name = "w", pinned, uniq_name = "_QFnested_default_clause_testsEw"}
205+
!CHECK: %[[TEMP:.*]] = fir.load %[[PRIVATE_W]] : !fir.ref<i32>
206+
!CHECK: fir.store %[[TEMP]] to %[[PRIVATE_INNER_W]]
207+
!CHECK: %[[temp:.*]] = fir.load %[[PRIVATE_INNER_Y]] : !fir.ref<i32>
205208
!CHECK: fir.store %[[temp]] to %[[PRIVATE_INNER_X]] : !fir.ref<i32>
209+
!CHECK: %[[LOADED_W:.*]] = fir.load %[[PRIVATE_INNER_W]] : !fir.ref<i32>
210+
!CHECK: %[[CONST:.*]] = arith.constant 1 : i32
211+
!CHECK: %[[RESULT:.*]] = arith.addi %[[LOADED_W]], %[[CONST]] : i32
212+
!CHECK: fir.store %[[RESULT]] to %[[PRIVATE_INNER_W]] : !fir.ref<i32>
206213
!CHECK: omp.terminator
207214
!CHECK: }
208215
!CHECK: omp.parallel {
216+
!CHECK: %[[PRIVATE_INNER_Z:.*]] = fir.alloca i32 {bindc_name = "z", pinned, uniq_name = "_QFnested_default_clause_testsEz"}
209217
!CHECK: %[[PRIVATE_INNER_W:.*]] = fir.alloca i32 {bindc_name = "w", pinned, uniq_name = "_QFnested_default_clause_testsEw"}
210218
!CHECK: %[[PRIVATE_INNER_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
211219
!CHECK: %[[temp_1:.*]] = fir.load %[[PRIVATE_INNER_X]] : !fir.ref<i32>
212-
!CHECK: %[[temp_2:.*]] = fir.load %[[PRIVATE_Z]] : !fir.ref<i32>
213-
!CHECK: %[[result:.*]] = arith.addi %{{.*}}, %{{.*}} : i32
220+
!CHECK: %[[temp_2:.*]] = fir.load %[[PRIVATE_INNER_Z]] : !fir.ref<i32>
221+
!CHECK: %[[result:.*]] = arith.addi %[[temp_1]], %[[temp_2]] : i32
214222
!CHECK: fir.store %[[result]] to %[[PRIVATE_INNER_W]] : !fir.ref<i32>
215223
!CHECK: omp.terminator
216224
!CHECK: }
217225
!$omp parallel default(private)
218226
!$omp parallel default(firstprivate)
219227
x = y
228+
w = w + 1
220229
!$omp end parallel
221230

222231
!$omp parallel default(private) shared(z)

flang/test/Lower/OpenMP/default-clause.f90

Lines changed: 87 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -221,13 +221,14 @@ subroutine nested_default_clause_tests
221221

222222

223223
!CHECK: omp.parallel {
224+
!CHECK: %[[PRIVATE_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
224225
!CHECK: %[[PRIVATE_X_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_X]] {uniq_name = "_QFnested_default_clause_testsEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
225226
!CHECK: %[[PRIVATE_Y:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFnested_default_clause_testsEy"}
226227
!CHECK: %[[PRIVATE_Y_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_Y]] {uniq_name = "_QFnested_default_clause_testsEy"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
227-
!CHECK: %[[PRIVATE_Z:.*]] = fir.alloca i32 {bindc_name = "z", pinned, uniq_name = "_QFnested_default_clause_testsEz"}
228-
!CHECK: %[[PRIVATE_Z_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_Z]] {uniq_name = "_QFnested_default_clause_testsEz"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
229228
!CHECK: %[[PRIVATE_W:.*]] = fir.alloca i32 {bindc_name = "w", pinned, uniq_name = "_QFnested_default_clause_testsEw"}
230229
!CHECK: %[[PRIVATE_W_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_W]] {uniq_name = "_QFnested_default_clause_testsEw"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
230+
!CHECK: %[[PRIVATE_Z:.*]] = fir.alloca i32 {bindc_name = "z", pinned, uniq_name = "_QFnested_default_clause_testsEz"}
231+
!CHECK: %[[PRIVATE_Z_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_Z]] {uniq_name = "_QFnested_default_clause_testsEz"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
231232
!CHECK: omp.parallel {
232233
!CHECK: %[[PRIVATE_INNER_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
233234
!CHECK: %[[PRIVATE_INNER_X_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_INNER_X]] {uniq_name = "_QFnested_default_clause_testsEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
@@ -237,24 +238,35 @@ subroutine nested_default_clause_tests
237238
!CHECK: %[[INNER_PRIVATE_Y_DECL:.*]]:2 = hlfir.declare %[[INNER_PRIVATE_Y]] {uniq_name = "_QFnested_default_clause_testsEy"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
238239
!CHECK: %[[TEMP:.*]] = fir.load %[[PRIVATE_Y_DECL]]#0 : !fir.ref<i32>
239240
!CHECK: hlfir.assign %[[TEMP]] to %[[INNER_PRIVATE_Y_DECL]]#0 temporary_lhs : i32, !fir.ref<i32>
241+
!CHECK: %[[INNER_PRIVATE_W:.*]] = fir.alloca i32 {bindc_name = "w", pinned, uniq_name = "_QFnested_default_clause_testsEw"}
242+
!CHECK: %[[INNER_PRIVATE_W_DECL:.*]]:2 = hlfir.declare %[[INNER_PRIVATE_W]] {{.*}}
243+
!CHECK: %[[TEMP:.*]] = fir.load %[[PRIVATE_W_DECL]]#0 : !fir.ref<i32>
244+
!CHECK: hlfir.assign %[[TEMP]] to %[[INNER_PRIVATE_W_DECL]]#0 temporary_lhs : i32, !fir.ref<i32>
240245
!CHECK: %[[TEMP:.*]] = fir.load %[[INNER_PRIVATE_Y_DECL]]#0 : !fir.ref<i32>
241246
!CHECK: hlfir.assign %[[TEMP]] to %[[PRIVATE_INNER_X_DECL]]#0 : i32, !fir.ref<i32>
247+
!CHECK: %[[TEMP:.*]] = fir.load %[[INNER_PRIVATE_W_DECL]]#0 : !fir.ref<i32>
248+
!CHECK: %[[CONSTANT:.*]] = arith.constant 1 : i32
249+
!CHECK: %[[RESULT:.*]] = arith.addi %[[TEMP]], %[[CONSTANT]] : i32
250+
!CHECK: hlfir.assign %[[RESULT]] to %[[INNER_PRIVATE_W_DECL]]#0 : i32, !fir.ref<i32>
242251
!CHECK: omp.terminator
243252
!CHECK: }
244253
!CHECK: omp.parallel {
254+
!CHECK: %[[PRIVATE_INNER_Z:.*]] = fir.alloca i32 {bindc_name = "z", pinned, uniq_name = "_QFnested_default_clause_testsEz"}
255+
!CHECK: %[[PRIVATE_INNER_Z_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_INNER_Z]] {{.*}}
245256
!CHECK: %[[PRIVATE_INNER_W:.*]] = fir.alloca i32 {bindc_name = "w", pinned, uniq_name = "_QFnested_default_clause_testsEw"}
246257
!CHECK: %[[PRIVATE_INNER_W_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_INNER_W]] {uniq_name = "_QFnested_default_clause_testsEw"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
247258
!CHECK: %[[PRIVATE_INNER_X:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
248259
!CHECK: %[[PRIVATE_INNER_X_DECL:.*]]:2 = hlfir.declare %[[PRIVATE_INNER_X]] {uniq_name = "_QFnested_default_clause_testsEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
249260
!CHECK: %[[TEMP_1:.*]] = fir.load %[[PRIVATE_INNER_X_DECL]]#0 : !fir.ref<i32>
250-
!CHECK: %[[TEMP_2:.*]] = fir.load %[[PRIVATE_Z_DECL]]#0 : !fir.ref<i32>
261+
!CHECK: %[[TEMP_2:.*]] = fir.load %[[PRIVATE_INNER_Z_DECL]]#0 : !fir.ref<i32>
251262
!CHECK: %[[RESULT:.*]] = arith.addi %{{.*}}, %{{.*}} : i32
252263
!CHECK: hlfir.assign %[[RESULT]] to %[[PRIVATE_INNER_W_DECL]]#0 : i32, !fir.ref<i32>
253264
!CHECK: omp.terminator
254265
!CHECK: }
255266
!$omp parallel default(private)
256267
!$omp parallel default(firstprivate)
257268
x = y
269+
w = w + 1
258270
!$omp end parallel
259271

260272
!$omp parallel default(private) shared(z)
@@ -317,14 +329,84 @@ subroutine nested_default_clause_tests
317329
!CHECK: omp.terminator
318330
!CHECK: }
319331
!CHECK: omp.terminator
320-
!CHECK: }
321-
!CHECK: return
322332
!CHECK: }
323333
!$omp parallel default(firstprivate)
324334
!$omp single
325335
x = y
326336
!$omp end single
327337
!$omp end parallel
338+
339+
!CHECK: omp.parallel {
340+
!CHECK: %[[LOOP_VAR_ALLOCA:.*]] = fir.alloca i32 {adapt.valuebyref, pinned}
341+
!CHECK: %[[LOOP_VAR_DECLARE:.*]]:2 = hlfir.declare %[[LOOP_VAR_ALLOCA]] {{.*}}
342+
!CHECK: %[[X_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
343+
!CHECK: %[[X_DECLARE:.*]]:2 = hlfir.declare %[[X_ALLOCA]] {{.*}}
344+
!CHECK: %[[CONST_LB:.*]] = arith.constant 1 : i32
345+
!CHECK: %[[CONST_UB:.*]] = arith.constant 50 : i32
346+
!CHECK: %[[CONST_STEP:.*]] = arith.constant 1 : i32
347+
!CHECK: omp.wsloop for (%[[ARG:.*]]) : i32 = (%[[CONST_LB]]) to (%[[CONST_UB]]) inclusive step (%[[CONST_STEP]]) {
348+
!CHECK: fir.store %[[ARG]] to %[[LOOP_VAR_DECLARE]]#1 : !fir.ref<i32>
349+
!CHECK: %[[LOADED_X:.*]] = fir.load %[[X_DECLARE]]#0 : !fir.ref<i32>
350+
!CHECK: %[[CONST:.*]] = arith.constant 1 : i32
351+
!CHECK: %[[RESULT:.*]] = arith.addi %[[LOADED_X]], %[[CONST]] : i32
352+
!CHECK: hlfir.assign %[[RESULT]] to %[[X_DECLARE]]#0 : i32, !fir.ref<i32>
353+
!CHECK: omp.yield
354+
!CHECK: }
355+
!CHECK: omp.terminator
356+
!CHECK: }
357+
!$omp parallel do private(x)
358+
do i=1, 50
359+
x = x + 1
360+
end do
361+
!$omp end parallel do
362+
363+
!CHECK: omp.parallel {
364+
!CHECK: %[[LOOP_VAR:.*]] = fir.alloca i32 {adapt.valuebyref, pinned}
365+
!CHECK: %[[LOOP_VAR_DECLARE:.*]]:2 = hlfir.declare %[[LOOP_VAR]] {{.*}}
366+
!CHECK: %[[X_VAR:.*]] = fir.alloca i32 {bindc_name = "x", pinned, uniq_name = "_QFnested_default_clause_testsEx"}
367+
!CHECK: %[[X_VAR_DECLARE:.*]]:2 = hlfir.declare %[[X_VAR]] {{.*}}
368+
!CHECK: %[[Y_VAR:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFnested_default_clause_testsEy"}
369+
!CHECK: %[[Y_VAR_DECLARE:.*]]:2 = hlfir.declare %[[Y_VAR]] {{.*}}
370+
!CHECK: %[[Z_VAR:.*]] = fir.alloca i32 {bindc_name = "z", pinned, uniq_name = "_QFnested_default_clause_testsEz"}
371+
!CHECK: %[[Z_VAR_DECLARE:.*]]:2 = hlfir.declare %[[Z_VAR]] {{.*}}
372+
!CHECK: %[[CONST_LB:.*]] = arith.constant 1 : i32
373+
!CHECK: %[[CONST_UB:.*]] = arith.constant 10 : i32
374+
!CHECK: %[[CONST_STEP:.*]] = arith.constant 1 : i32
375+
!CHECK: omp.wsloop for (%[[ARG:.*]]) : i32 = (%[[CONST_LB]]) to (%[[CONST_UB]]) inclusive step (%[[CONST_STEP]]) {
376+
!CHECK: fir.store %[[ARG]] to %[[LOOP_VAR_DECLARE]]#1 : !fir.ref<i32>
377+
!CHECK: %[[LOADED_X:.*]] = fir.load %[[X_VAR_DECLARE]]#0 : !fir.ref<i32>
378+
!CHECK: %[[CONST:.*]] = arith.constant 1 : i32
379+
!CHECK: %[[ADD:.*]] = arith.addi %[[LOADED_X]], %[[CONST]] : i32
380+
!CHECK: hlfir.assign %[[ADD]] to %[[X_VAR_DECLARE]]#0 : i32, !fir.ref<i32>
381+
!CHECK: omp.parallel {
382+
!CHECK: %[[INNER_Y_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "y", pinned, uniq_name = "_QFnested_default_clause_testsEy"}
383+
!CHECK: %[[INNER_Y_DECLARE:.*]]:2 = hlfir.declare %[[INNER_Y_ALLOCA]] {{.}}
384+
!CHECK: %[[TEMP:.*]] = fir.load %[[Y_VAR_DECLARE]]#0 : !fir.ref<i32>
385+
!CHECK: hlfir.assign %[[TEMP]] to %[[INNER_Y_DECLARE]]#0 temporary_lhs : i32, !fir.ref<i32>
386+
!CHECK: %[[INNER_Z_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "z", pinned, uniq_name = "_QFnested_default_clause_testsEz"}
387+
!CHECK: %[[INNER_Z_DECLARE:.*]]:2 = hlfir.declare %[[INNER_Z_ALLOCA]] {{.}}
388+
!CHECK: %[[TEMP:.*]] = fir.load %[[Z_VAR_DECLARE]]#0 : !fir.ref<i32>
389+
!CHECK: hlfir.assign %[[TEMP]] to %[[INNER_Z_DECLARE]]#0 temporary_lhs : i32, !fir.ref<i32>
390+
!CHECK: %[[LOADED_Y:.*]] = fir.load %[[INNER_Y_DECLARE]]#0 : !fir.ref<i32>
391+
!CHECK: %[[LOADED_Z:.*]] = fir.load %[[INNER_Z_DECLARE]]#0 : !fir.ref<i32>
392+
!CHECK: %[[RESULT:.*]] = arith.addi %[[LOADED_Y]], %[[LOADED_Z]] : i32
393+
!CHECK: hlfir.assign %[[RESULT]] to %[[INNER_Y_DECLARE]]#0 : i32, !fir.ref<i32>
394+
!CHECK: omp.terminator
395+
!CHECK: }
396+
!CHECK: omp.yield
397+
!CHECK: }
398+
!CHECK: omp.terminator
399+
!CHECK: }
400+
!CHECK: return
401+
!CHECK: }
402+
!$omp parallel do default(private)
403+
do i = 1, 10
404+
x = x + 1
405+
!$omp parallel default(firstprivate)
406+
y = y + z
407+
!$omp end parallel
408+
end do
409+
!$omp end parallel do
328410
end subroutine
329411

330412
!CHECK: func.func @_QPskipped_default_clause_checks() {

0 commit comments

Comments
 (0)