Skip to content

Commit 1c8b7c5

Browse files
committed
[flang][hlfir] Added allocatable/pointer support in hlfir::convertToValue.
The code is used, for example, when passing arguments to IO or intrinsic calls as value. The allocatable/pointer boxes must be dereferenced, and trivial values have to be loaded. Character and derived values have to stay boxed. I am not sure what to do for the array cases, and I have not seen any test triggering it, so I leave it as a TODO. Reviewed By: tblah, clementval Differential Revision: https://reviews.llvm.org/D151925
1 parent 99dc683 commit 1c8b7c5

File tree

2 files changed

+285
-1
lines changed

2 files changed

+285
-1
lines changed

flang/lib/Optimizer/Builder/HLFIRTools.cpp

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -859,7 +859,7 @@ translateVariableToExtendedValue(mlir::Location loc, fir::FirOpBuilder &builder,
859859
llvm::SmallVector<mlir::Value> nonDefaultLbounds;
860860
if (variable.getType().isa<fir::BaseBoxType>() &&
861861
!variable.getIfVariableInterface()) {
862-
// This special case avoids generating two generating to sets of identical
862+
// This special case avoids generating two sets of identical
863863
// fir.box_dim to get both the lower bounds and extents.
864864
genLboundsAndExtentsFromBox(loc, builder, variable, nonDefaultLbounds,
865865
&extents);
@@ -928,7 +928,33 @@ hlfir::convertToValue(mlir::Location loc, fir::FirOpBuilder &builder,
928928
[&](const fir::CharArrayBoxValue &box) -> fir::ExtendedValue {
929929
return box;
930930
},
931+
[&](const fir::MutableBoxValue &box) -> fir::ExtendedValue {
932+
if (box.rank() != 0)
933+
TODO(loc, "lower array descriptor designator to HLFIR value");
934+
if (entity.isProcedure())
935+
TODO(loc, "lower proc descriptor designator to HLFIR value");
936+
937+
hlfir::Entity derefedEntity =
938+
hlfir::derefPointersAndAllocatables(loc, builder, entity);
939+
mlir::Type eleTy = derefedEntity.getFortranElementType();
940+
941+
// Trivial values are unboxed.
942+
if (derefedEntity.isScalar() && fir::isa_trivial(eleTy))
943+
return builder.create<fir::LoadOp>(loc, derefedEntity);
944+
945+
if (mlir::isa<fir::CharacterType>(eleTy)) {
946+
if (mlir::isa<fir::BoxCharType>(derefedEntity.getFirBase().getType()))
947+
return genUnboxChar(loc, builder, derefedEntity.getFirBase());
948+
// Extract length from the original entity.
949+
mlir::Value len = genCharacterVariableLength(loc, builder, entity);
950+
return fir::CharBoxValue{derefedEntity, len};
951+
}
952+
953+
// Keep derived type value boxed.
954+
return fir::factory::genMutableBoxRead(builder, loc, box);
955+
},
931956
[&](const auto &) -> fir::ExtendedValue {
957+
// Can we end up here?
932958
TODO(loc, "lower descriptor designator to HLFIR value");
933959
});
934960
return {exv, cleanup};

0 commit comments

Comments
 (0)