Skip to content

Commit aeaf319

Browse files
authored
[flang] avoid useless rebox of polymorphic scalars (#145507)
Do not create new descriptor for polymorphic scalars when lowering hlfir.declare. hlfir.declare of box/class is lowered to a fir.rebox to ensure that local lower bounds and descriptor attributes (Pointer/Allocatable/None) are properly set-up in the descriptor associated to the symbol. For polymorphic scalar, this created a useless temporary descriptor. This was breaking invalid code #145256 that violates OPTIONAL usage rules. I am not fixing it primarily to support this invalid code, but rather because it is dumb to create a useless fir.rebox.
1 parent 31545ca commit aeaf319

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

flang/lib/Optimizer/HLFIR/Transforms/ConvertToFIR.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -326,11 +326,14 @@ class DeclareOpConversion : public mlir::OpRewritePattern<hlfir::DeclareOp> {
326326
auto genHlfirBox = [&]() -> mlir::Value {
327327
if (auto baseBoxType =
328328
mlir::dyn_cast<fir::BaseBoxType>(firBase.getType())) {
329-
// Rebox so that lower bounds are correct.
329+
// Rebox so that lower bounds and attributes are correct.
330330
if (baseBoxType.isAssumedRank())
331331
return builder.create<fir::ReboxAssumedRankOp>(
332332
loc, hlfirBaseType, firBase,
333333
fir::LowerBoundModifierAttribute::SetToOnes);
334+
if (!fir::extractSequenceType(baseBoxType.getEleTy()) &&
335+
baseBoxType == hlfirBaseType)
336+
return firBase;
334337
return builder.create<fir::ReboxOp>(loc, hlfirBaseType, firBase,
335338
declareOp.getShape(),
336339
/*slice=*/mlir::Value{});

flang/test/HLFIR/declare-codegen.fir

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,3 +219,21 @@ func.func @assumed_rank_declare(%arg0: !fir.box<!fir.array<*:f32>>) {
219219
// CHECK-SAME: %[[VAL_0:.*]]: !fir.box<!fir.array<*:f32>>) {
220220
// CHECK: %[[VAL_1:.*]] = fir.declare %[[VAL_0]] {uniq_name = "x"} : (!fir.box<!fir.array<*:f32>>) -> !fir.box<!fir.array<*:f32>>
221221
// CHECK: %[[VAL_2:.*]] = fir.rebox_assumed_rank %[[VAL_1]] lbs ones : (!fir.box<!fir.array<*:f32>>) -> !fir.box<!fir.array<*:f32>>
222+
223+
func.func @no_useless_rebox(%arg0: !fir.class<!fir.type<sometype{i:i32}>>) {
224+
%0:2 = hlfir.declare %arg0 {uniq_name = "x"} : (!fir.class<!fir.type<sometype{i:i32}>>) -> (!fir.class<!fir.type<sometype{i:i32}>>, !fir.class<!fir.type<sometype{i:i32}>>)
225+
fir.call @takes_class(%0#0) : (!fir.class<!fir.type<sometype{i:i32}>>) -> ()
226+
return
227+
}
228+
// CHECK-LABEL: @no_useless_rebox
229+
// CHECK-NOT: fir.rebox
230+
// CHECK: return
231+
232+
func.func @rebox_scalar_attrs(%arg0: !fir.class<!fir.ptr<!fir.type<sometype{i:i32}>>>) {
233+
%0:2 = hlfir.declare %arg0 {uniq_name = "x"} : (!fir.class<!fir.ptr<!fir.type<sometype{i:i32}>>>) -> (!fir.class<!fir.type<sometype{i:i32}>>, !fir.class<!fir.type<sometype{i:i32}>>)
234+
fir.call @takes_class(%0#0) : (!fir.class<!fir.type<sometype{i:i32}>>) -> ()
235+
return
236+
}
237+
// CHECK-LABEL: @rebox_scalar_attrs
238+
// CHECK: fir.rebox %{{.*}} : (!fir.class<!fir.ptr<!fir.type<sometype{i:i32}>>>) -> !fir.class<!fir.type<sometype{i:i32}>>
239+
// CHECK: return

0 commit comments

Comments
 (0)