Skip to content

Commit 04e6c51

Browse files
committed
Fix compiler crash for unnesecarry len params
1 parent 863ba45 commit 04e6c51

File tree

3 files changed

+76
-39
lines changed

3 files changed

+76
-39
lines changed

flang/lib/Lower/OpenMP/PrivateReductionUtils.cpp

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,29 @@ static void initializeIfDerivedTypeBox(fir::FirOpBuilder &builder,
186186
fir::runtime::genDerivedTypeInitializeClone(builder, loc, newBox, moldBox);
187187
}
188188

189+
static void getLengthParameters(fir::FirOpBuilder &builder, mlir::Location loc,
190+
mlir::Value moldArg,
191+
llvm::SmallVectorImpl<mlir::Value> &lenParams) {
192+
// We pass derived types unboxed and so are not self-contained entities.
193+
// Assume that unboxed derived types won't need length paramters.
194+
if (!hlfir::isFortranEntity(moldArg))
195+
return;
196+
197+
hlfir::genLengthParameters(loc, builder, hlfir::Entity{moldArg}, lenParams);
198+
if (lenParams.empty())
199+
return;
200+
201+
// The verifier for EmboxOp doesn't allow length parameters when the the
202+
// character already has static LEN. genLengthParameters may still return them
203+
// in this case.
204+
mlir::Type unwrappedType =
205+
fir::unwrapRefType(fir::unwrapSeqOrBoxedSeqType(moldArg.getType()));
206+
if (auto strTy = mlir::dyn_cast<fir::CharacterType>(unwrappedType)) {
207+
if (strTy.hasConstantLen())
208+
lenParams.resize(0);
209+
}
210+
}
211+
189212
static bool
190213
isDerivedTypeNeedingInitialization(const Fortran::semantics::Symbol &sym) {
191214
// Fortran::lower::hasDefaultInitialization returns false for ALLOCATABLE, so
@@ -287,6 +310,9 @@ void Fortran::lower::omp::populateByRefInitAndCleanupRegions(
287310
builder.setInsertionPointToEnd(initBlock);
288311
mlir::Value boxAlloca = allocatedPrivVarArg;
289312

313+
moldArg = builder.loadIfRef(loc, moldArg);
314+
getLengthParameters(builder, loc, moldArg, lenParams);
315+
290316
// The initial state of a private pointer is undefined so we don't need to
291317
// match the mold argument (OpenMP 5.2 end of page 106).
292318
if (isPrivatization(kind) &&
@@ -299,20 +325,17 @@ void Fortran::lower::omp::populateByRefInitAndCleanupRegions(
299325
mlir::Value null = builder.createNullConstant(loc, boxTy.getEleTy());
300326
mlir::Value nullBox;
301327
if (shape)
302-
nullBox = builder.create<fir::EmboxOp>(loc, boxTy, null, shape);
328+
nullBox = builder.create<fir::EmboxOp>(
329+
loc, boxTy, null, shape, /*slice=*/mlir::Value{}, lenParams);
303330
else
304-
nullBox = builder.create<fir::EmboxOp>(loc, boxTy, null);
331+
nullBox = builder.create<fir::EmboxOp>(
332+
loc, boxTy, null, /*shape=*/mlir::Value{}, /*slice=*/mlir::Value{},
333+
lenParams);
305334
builder.create<fir::StoreOp>(loc, nullBox, boxAlloca);
306335
yield(boxAlloca);
307336
return;
308337
}
309338

310-
moldArg = builder.loadIfRef(loc, moldArg);
311-
// We pass derived types unboxed and so are not self-contained entities.
312-
if (hlfir::isFortranEntity(moldArg))
313-
hlfir::genLengthParameters(loc, builder, hlfir::Entity{moldArg},
314-
lenParams);
315-
316339
mlir::Type innerTy = fir::unwrapRefType(boxTy.getEleTy());
317340
bool isDerived = fir::isa_derived(innerTy);
318341
bool isChar = fir::isa_char(innerTy);
@@ -359,12 +382,7 @@ void Fortran::lower::omp::populateByRefInitAndCleanupRegions(
359382
TODO(loc, "Unsupported boxed type for reduction/privatization");
360383

361384
moldArg = builder.loadIfRef(loc, moldArg);
362-
// We pass derived types unboxed and so are not self-contained entities.
363-
// Assume that if length parameters are required, they will be boxed by
364-
// lowering.
365-
if (hlfir::isFortranEntity(moldArg))
366-
hlfir::genLengthParameters(loc, builder, hlfir::Entity{moldArg},
367-
lenParams);
385+
getLengthParameters(builder, loc, moldArg, lenParams);
368386

369387
fir::IfOp ifUnallocated{nullptr};
370388
if (isAllocatableOrPointer) {

flang/test/Lower/OpenMP/copyprivate.f90

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@
1414
!CHECK-DAG: func private @_copy_c16x8(%{{.*}}: !fir.ref<!fir.char<2,8>>, %{{.*}}: !fir.ref<!fir.char<2,8>>)
1515

1616
!CHECK-DAG: func private @_copy_box_Uxi32(%{{.*}}: !fir.ref<!fir.box<!fir.array<?xi32>>>, %{{.*}}: !fir.ref<!fir.box<!fir.array<?xi32>>>)
17-
!CHECK-DAG: func private @_copy_10xi32(%{{.*}}: !fir.ref<!fir.array<10xi32>>, %{{.*}}: !fir.ref<!fir.array<10xi32>>)
18-
!CHECK-DAG: func private @_copy_3x4xi32(%{{.*}}: !fir.ref<!fir.array<3x4xi32>>, %{{.*}}: !fir.ref<!fir.array<3x4xi32>>)
19-
!CHECK-DAG: func private @_copy_10xf32(%{{.*}}: !fir.ref<!fir.array<10xf32>>, %{{.*}}: !fir.ref<!fir.array<10xf32>>)
20-
!CHECK-DAG: func private @_copy_3x4xz32(%{{.*}}: !fir.ref<!fir.array<3x4xcomplex<f32>>>, %{{.*}}: !fir.ref<!fir.array<3x4xcomplex<f32>>>)
21-
!CHECK-DAG: func private @_copy_10xl32(%{{.*}}: !fir.ref<!fir.array<10x!fir.logical<4>>>, %{{.*}}: !fir.ref<!fir.array<10x!fir.logical<4>>>)
22-
!CHECK-DAG: func private @_copy_3xc8x8(%{{.*}}: !fir.ref<!fir.array<3x!fir.char<1,8>>>, %{{.*}}: !fir.ref<!fir.array<3x!fir.char<1,8>>>)
23-
!CHECK-DAG: func private @_copy_3xc16x5(%{{.*}}: !fir.ref<!fir.array<3x!fir.char<2,5>>>, %{{.*}}: !fir.ref<!fir.array<3x!fir.char<2,5>>>)
17+
!CHECK-DAG: func private @_copy_box_10xi32(%{{.*}}: !fir.ref<!fir.box<!fir.array<10xi32>>>, %{{.*}}: !fir.ref<!fir.box<!fir.array<10xi32>>>)
18+
!CHECK-DAG: func private @_copy_box_3x4xi32(%{{.*}}: !fir.ref<!fir.box<!fir.array<3x4xi32>>>, %{{.*}}: !fir.ref<!fir.box<!fir.array<3x4xi32>>>)
19+
!CHECK-DAG: func private @_copy_box_10xf32(%{{.*}}: !fir.ref<!fir.box<!fir.array<10xf32>>>, %{{.*}}: !fir.ref<!fir.box<!fir.array<10xf32>>>)
20+
!CHECK-DAG: func private @_copy_box_3x4xz32(%{{.*}}: !fir.ref<!fir.box<!fir.array<3x4xcomplex<f32>>>>, %{{.*}}: !fir.ref<!fir.box<!fir.array<3x4xcomplex<f32>>>>)
21+
!CHECK-DAG: func private @_copy_box_10xl32(%{{.*}}: !fir.ref<!fir.box<!fir.array<10x!fir.logical<4>>>>, %{{.*}}: !fir.ref<!fir.box<!fir.array<10x!fir.logical<4>>>>)
22+
!CHECK-DAG: func private @_copy_box_3xc8x8(%{{.*}}: !fir.ref<!fir.box<!fir.array<3x!fir.char<1,8>>>>, %{{.*}}: !fir.ref<!fir.box<!fir.array<3x!fir.char<1,8>>>>)
23+
!CHECK-DAG: func private @_copy_box_3xc16x5(%{{.*}}: !fir.ref<!fir.box<!fir.array<3x!fir.char<2,5>>>>, %{{.*}}: !fir.ref<!fir.box<!fir.array<3x!fir.char<2,5>>>>)
2424

2525
!CHECK-DAG: func private @_copy_rec__QFtest_dtTdt(%{{.*}}: !fir.ref<!fir.type<_QFtest_dtTdt{i:i32,r:f32}>>, %{{.*}}: !fir.ref<!fir.type<_QFtest_dtTdt{i:i32,r:f32}>>)
2626
!CHECK-DAG: func private @_copy_box_heap_Uxi32(%{{.*}}: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>, %{{.*}}: !fir.ref<!fir.box<!fir.heap<!fir.array<?xi32>>>>)
@@ -95,20 +95,16 @@ subroutine test_scalar()
9595

9696
!CHECK-LABEL: func @_QPtest_array
9797
!CHECK: omp.parallel
98-
!CHECK: %[[A:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) {uniq_name = "_QFtest_arrayEa"} : (!fir.box<!fir.array<?xi32>>, !fir.shift<1>) -> (!fir.box<!fir.array<?xi32>>, !fir.box<!fir.array<?xi32>>)
99-
!CHECK: %[[I1:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) {uniq_name = "_QFtest_arrayEi1"} : (!fir.ref<!fir.array<10xi32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xi32>>, !fir.ref<!fir.array<10xi32>>)
100-
!CHECK: %[[I2:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) {uniq_name = "_QFtest_arrayEi2"} : (!fir.ref<!fir.array<3x4xi32>>, !fir.shape<2>) -> (!fir.ref<!fir.array<3x4xi32>>, !fir.ref<!fir.array<3x4xi32>>)
101-
!CHECK: %[[I3:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) {uniq_name = "_QFtest_arrayEi3"} : (!fir.ref<!fir.array<?xi32>>, !fir.shapeshift<1>) -> (!fir.box<!fir.array<?xi32>>, !fir.ref<!fir.array<?xi32>>)
102-
!CHECK: %[[R1:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) {uniq_name = "_QFtest_arrayEr1"} : (!fir.ref<!fir.array<10xf32>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10xf32>>, !fir.ref<!fir.array<10xf32>>)
103-
!CHECK: %[[C1:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) {uniq_name = "_QFtest_arrayEc1"} : (!fir.ref<!fir.array<3x4xcomplex<f32>>>, !fir.shape<2>) -> (!fir.ref<!fir.array<3x4xcomplex<f32>>>, !fir.ref<!fir.array<3x4xcomplex<f32>>>)
104-
!CHECK: %[[L1:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) {uniq_name = "_QFtest_arrayEl1"} : (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.shape<1>) -> (!fir.ref<!fir.array<10x!fir.logical<4>>>, !fir.ref<!fir.array<10x!fir.logical<4>>>)
105-
!CHECK: %[[S1:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFtest_arrayEs1"} : (!fir.ref<!fir.array<3x!fir.char<1,8>>>, !fir.shape<1>, index) -> (!fir.ref<!fir.array<3x!fir.char<1,8>>>, !fir.ref<!fir.array<3x!fir.char<1,8>>>)
106-
!CHECK: %[[S2:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFtest_arrayEs2"} : (!fir.ref<!fir.array<3x!fir.char<2,5>>>, !fir.shape<1>, index) -> (!fir.ref<!fir.array<3x!fir.char<2,5>>>, !fir.ref<!fir.array<3x!fir.char<2,5>>>)
107-
!CHECK: %[[A_REF:.*]] = fir.alloca !fir.box<!fir.array<?xi32>>
108-
!CHECK: fir.store %[[A]]#0 to %[[A_REF]] : !fir.ref<!fir.box<!fir.array<?xi32>>>
109-
!CHECK: %[[I3_REF:.*]] = fir.alloca !fir.box<!fir.array<?xi32>>
110-
!CHECK: fir.store %[[I3]]#0 to %[[I3_REF]] : !fir.ref<!fir.box<!fir.array<?xi32>>>
111-
!CHECK: omp.single copyprivate(%[[A_REF]] -> @_copy_box_Uxi32 : !fir.ref<!fir.box<!fir.array<?xi32>>>, %[[I1]]#0 -> @_copy_10xi32 : !fir.ref<!fir.array<10xi32>>, %[[I2]]#0 -> @_copy_3x4xi32 : !fir.ref<!fir.array<3x4xi32>>, %[[I3_REF]] -> @_copy_box_Uxi32 : !fir.ref<!fir.box<!fir.array<?xi32>>>, %[[R1]]#0 -> @_copy_10xf32 : !fir.ref<!fir.array<10xf32>>, %[[C1]]#0 -> @_copy_3x4xz32 : !fir.ref<!fir.array<3x4xcomplex<f32>>>, %[[L1]]#0 -> @_copy_10xl32 : !fir.ref<!fir.array<10x!fir.logical<4>>>, %[[S1]]#0 -> @_copy_3xc8x8 : !fir.ref<!fir.array<3x!fir.char<1,8>>>, %[[S2]]#0 -> @_copy_3xc16x5 : !fir.ref<!fir.array<3x!fir.char<2,5>>>)
98+
!CHECK: %[[A:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtest_arrayEa"}
99+
!CHECK: %[[I1:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtest_arrayEi1"}
100+
!CHECK: %[[I2:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtest_arrayEi2"}
101+
!CHECK: %[[I3:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtest_arrayEi3"}
102+
!CHECK: %[[R1:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtest_arrayEr1"}
103+
!CHECK: %[[C1:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtest_arrayEc1"}
104+
!CHECK: %[[L1:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFtest_arrayEl1"}
105+
!CHECK: %[[S1:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFtest_arrayEs1"}
106+
!CHECK: %[[S2:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFtest_arrayEs2"}
107+
!CHECK: omp.single copyprivate(%[[A]]#0 -> @_copy_box_Uxi32 : {{.*}}, %[[I1]]#0 -> @_copy_box_10xi32 : {{.*}}, %[[I2]]#0 -> @_copy_box_3x4xi32 : {{.*}}, %[[I3]]#0 -> @_copy_box_Uxi32 : {{.*}}, %[[R1]]#0 -> @_copy_box_10xf32 : {{.*}}, %[[C1]]#0 -> @_copy_box_3x4xz32 : {{.*}}, %[[L1]]#0 -> @_copy_box_10xl32 : {{.*}}, %[[S1]]#0 -> @_copy_box_3xc8x8 : {{.*}}, %[[S2]]#0 -> @_copy_box_3xc16x5 : {{.*}})
112108
subroutine test_array(a, n)
113109
integer :: a(:), n
114110
integer :: i1(10), i2(3, 4), i3(n)

flang/test/Lower/OpenMP/delayed-privatization-pointer.f90

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,42 @@ subroutine delayed_privatization_pointer
1414
!$omp end parallel
1515
end subroutine
1616

17-
! CHECK-LABEL: omp.private {type = firstprivate}
18-
! CHECK-SAME: @[[PRIVATIZER_SYM:.*]] : [[TYPE:!fir.box<!fir.ptr<i32>>]] init {
17+
subroutine delayed_privatization_lenparams(length)
18+
integer, intent(in) :: length
19+
character(length), pointer :: var
20+
21+
!$omp parallel firstprivate(var)
22+
var = 'a'
23+
!$omp end parallel
24+
end subroutine
1925

26+
! CHECK-LABEL: omp.private {type = firstprivate}
27+
! CHECK-SAME: @[[PRIVATIZER_SYM2:.*]] : [[TYPE:!fir.box<!fir.ptr<!fir.char<1,\?>>>]] init {
2028
! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: !fir.ref<[[TYPE]]>, %[[PRIV_ALLOC:.*]]: !fir.ref<[[TYPE]]>):
29+
! CHECK-NEXT: %[[ARG:.*]] = fir.load %[[PRIV_ARG]]
30+
! CHECK-NEXT: %[[SIZE:.*]] = fir.box_elesize %[[ARG]]
31+
! CHECK-NEXT: %[[NULL:.*]] = fir.zero_bits !fir.ptr<!fir.char<1,?>>
32+
! CHECK-NEXT: %[[INIT:.*]] = fir.embox %[[NULL]] typeparams %[[SIZE]]
33+
! CHECK-NEXT: fir.store %[[INIT]] to %[[PRIV_ALLOC]]
34+
! CHECK-NEXT: omp.yield(%[[PRIV_ALLOC]] : !fir.ref<[[TYPE]]>)
35+
! CHECK-NEXT: } copy {
36+
! CHECK: ^bb0(%[[PRIV_ORIG_ARG:.*]]: !fir.ref<[[TYPE]]>, %[[PRIV_PRIV_ARG:.*]]: !fir.ref<[[TYPE]]>):
37+
! CHECK-NEXT: %[[ORIG_BASE_VAL:.*]] = fir.load %[[PRIV_ORIG_ARG]]
38+
! CHECK-NEXT: fir.store %[[ORIG_BASE_VAL]] to %[[PRIV_PRIV_ARG]]
39+
! CHECK-NEXT: omp.yield(%[[PRIV_PRIV_ARG]] : !fir.ref<[[TYPE]]>)
40+
! CHECK-NEXT: }
2141

42+
! CHECK-LABEL: omp.private {type = firstprivate}
43+
! CHECK-SAME: @[[PRIVATIZER_SYM:.*]] : [[TYPE:!fir.box<!fir.ptr<i32>>]] init {
44+
! CHECK-NEXT: ^bb0(%[[PRIV_ARG:.*]]: !fir.ref<[[TYPE]]>, %[[PRIV_ALLOC:.*]]: !fir.ref<[[TYPE]]>):
45+
! CHECK-NEXT: %[[ARG:.*]] = fir.load %[[PRIV_ARG]]
2246
! CHECK-NEXT: %[[NULL:.*]] = fir.zero_bits !fir.ptr<i32>
2347
! CHECK-NEXT: %[[INIT:.*]] = fir.embox %[[NULL]] : (!fir.ptr<i32>) -> !fir.box<!fir.ptr<i32>>
2448
! CHECK-NEXT: fir.store %[[INIT]] to %[[PRIV_ALLOC]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
2549
! CHECK-NEXT: omp.yield(%[[PRIV_ALLOC]] : !fir.ref<[[TYPE]]>)
26-
2750
! CHECK-NEXT: } copy {
2851
! CHECK: ^bb0(%[[PRIV_ORIG_ARG:.*]]: !fir.ref<[[TYPE]]>, %[[PRIV_PRIV_ARG:.*]]: !fir.ref<[[TYPE]]>):
2952
! CHECK-NEXT: %[[ORIG_BASE_VAL:.*]] = fir.load %[[PRIV_ORIG_ARG]]
30-
! CHECK-NEXT: fir.store %[[ORIG_BASE_VAL]] to %[[PRIV_PRIV_ARG]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
53+
! CHECK-NEXT: fir.store %[[ORIG_BASE_VAL]] to %[[PRIV_PRIV_ARG]] : !fir.ref<!fir.box<!fir.ptr<i32>>>
3154
! CHECK-NEXT: omp.yield(%[[PRIV_PRIV_ARG]] : !fir.ref<[[TYPE]]>)
3255
! CHECK-NEXT: }

0 commit comments

Comments
 (0)