Skip to content

Commit c4d7321

Browse files
[flang][OpenMP] Skip default privatization for crashing cases (#71922)
This patch skips default privatization for crashing cases like namelists, reduction instrinsics, and structure constructor. Fixes: #67332, #66454, and #65569 Co-Authored-By: kiranchandramohan <[email protected]>
1 parent fd5206c commit c4d7321

File tree

2 files changed

+62
-1
lines changed

2 files changed

+62
-1
lines changed

flang/lib/Lower/OpenMP.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -481,7 +481,10 @@ void DataSharingProcessor::copyLastPrivatize(mlir::Operation *op) {
481481

482482
void DataSharingProcessor::defaultPrivatize() {
483483
for (const Fortran::semantics::Symbol *sym : defaultSymbols) {
484-
if (!symbolsInNestedRegions.contains(sym) &&
484+
if (!Fortran::semantics::IsProcedure(*sym) &&
485+
!sym->GetUltimate().has<Fortran::semantics::DerivedTypeDetails>() &&
486+
!sym->GetUltimate().has<Fortran::semantics::NamelistDetails>() &&
487+
!symbolsInNestedRegions.contains(sym) &&
485488
!symbolsInParentRegions.contains(sym) &&
486489
!privatizedSymbols.contains(sym)) {
487490
cloneSymbol(sym);

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,10 +318,68 @@ subroutine nested_default_clause_tests
318318
!CHECK: }
319319
!CHECK: omp.terminator
320320
!CHECK: }
321+
!CHECK: return
321322
!CHECK: }
322323
!$omp parallel default(firstprivate)
323324
!$omp single
324325
x = y
325326
!$omp end single
326327
!$omp end parallel
327328
end subroutine
329+
330+
!CHECK: func.func @_QPskipped_default_clause_checks() {
331+
!CHECK: %[[TYPE_ADDR:.*]] = fir.address_of(@_QFskipped_default_clause_checksE.n.i1) : !fir.ref<!fir.char<1,2>>
332+
!CHECK: %[[VAL_CONST_2:.*]] = arith.constant 2 : index
333+
!CHECK: %[[VAL_I1_DECLARE:.*]]:2 = hlfir.declare %[[TYPE_ADDR]] typeparams %[[VAL_CONST_2]] {{.*}}
334+
!CHECK: %[[TYPE_ADDR_IT:.*]] = fir.address_of(@_QFskipped_default_clause_checksE.n.it) : !fir.ref<!fir.char<1,2>>
335+
!CHECK: %[[VAL_CONST_2_0:.*]] = arith.constant 2 : index
336+
!CHECK: %[[VAL_IT_DECLARE:.*]]:2 = hlfir.declare %[[TYPE_ADDR_IT]] typeparams %[[VAL_CONST_2_0]] {{.*}}
337+
!CHECK: %[[VAL_I_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFskipped_default_clause_checksEi"}
338+
!CHECK: %[[VAL_I_DECLARE:.*]]:2 = hlfir.declare %[[VAL_I_ALLOCA]] {{.*}}
339+
!CHECK: %[[VAL_III_ALLOCA:.*]] = fir.alloca !fir.type<_QFskipped_default_clause_checksTit{i1:i32}> {bindc_name = "iii", uniq_name = "_QFskipped_default_clause_checksEiii"}
340+
!CHECK: %[[VAL_III_DECLARE:.*]]:2 = hlfir.declare %[[VAL_III_ALLOCA]] {{.*}}
341+
!CHECK: %[[VAL_X_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "x", uniq_name = "_QFskipped_default_clause_checksEx"}
342+
!CHECK: %[[VAL_X_DECLARE:.*]]:2 = hlfir.declare %[[VAL_X_ALLOCA]] {{.*}}
343+
!CHECK: %[[VAL_Y_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "y", uniq_name = "_QFskipped_default_clause_checksEy"}
344+
!CHECK: %[[VAL_Y_DECLARE:.*]]:2 = hlfir.declare %[[VAL_Y_ALLOCA]] {{.*}}
345+
!CHECK: %[[VAL_Z_ALLOCA:.*]] = fir.alloca i32 {bindc_name = "z", uniq_name = "_QFskipped_default_clause_checksEz"}
346+
!CHECK: %[[VAL_Z_DECLARE:.*]]:2 = hlfir.declare %[[VAL_Z_ALLOCA]] {{.*}}
347+
subroutine skipped_default_clause_checks()
348+
integer :: x,y,z
349+
type it
350+
integer::i1
351+
end type
352+
type(it)::iii
353+
354+
!CHECK: omp.parallel {
355+
!CHECK: omp.wsloop reduction(@min_i_32 -> %[[VAL_Z_DECLARE]]#0 : !fir.ref<i32>) for (%[[ARG:.*]]) {{.*}} {
356+
!CHECK: omp.yield
357+
!CHECK: }
358+
!CHECK: omp.terminator
359+
!CHECK: }
360+
!$omp parallel do default(private) REDUCTION(MIN:z)
361+
do i = 1, 10
362+
x = x + MIN(y,x)
363+
enddo
364+
!$omp end parallel do
365+
366+
!CHECK: omp.parallel {
367+
!CHECK: omp.terminator
368+
!CHECK: }
369+
namelist /nam/i
370+
!$omp parallel default(private)
371+
write(1,nam )
372+
!$omp endparallel
373+
374+
!CHECK: omp.parallel {
375+
!CHECK: %[[PRIVATE_III_ALLOCA:.*]] = fir.alloca !fir.type<_QFskipped_default_clause_checksTit{i1:i32}> {{.*}}
376+
!CHECK: %[[PRIVATE_III_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_III_ALLOCA]] {{.*}}
377+
!CHECK: %[[PRIVATE_ADDR:.*]] = fir.address_of(@_QQro._QFskipped_default_clause_checksTit.0) : !fir.ref<!fir.type<_QFskipped_default_clause_checksTit{i1:i32}>>
378+
!CHECK: %[[PRIVATE_PARAM:.*]]:2 = hlfir.declare %[[PRIVATE_ADDR]] {{.*}}
379+
!CHECK: hlfir.assign %[[PRIVATE_PARAM]]#0 to %[[PRIVATE_III_DECLARE]]#0 {{.*}}
380+
!CHECK: omp.terminator
381+
!CHECK: }
382+
!$omp parallel default(private)
383+
iii=it(11)
384+
!$omp end parallel
385+
end subroutine

0 commit comments

Comments
 (0)