@@ -609,32 +609,22 @@ void createEmptyRegionBlocks(
609609 }
610610}
611611
612- inline AddrAndBoundsInfo
613- getDataOperandBaseAddr (Fortran::lower::AbstractConverter &converter,
614- fir::FirOpBuilder &builder,
615- Fortran::lower::SymbolRef sym, mlir::Location loc) {
616- mlir::Value symAddr = converter.getSymbolAddress (sym);
612+ inline AddrAndBoundsInfo getDataOperandBaseAddr (fir::FirOpBuilder &builder,
613+ mlir::Value symAddr,
614+ bool isOptional,
615+ mlir::Location loc) {
617616 mlir::Value rawInput = symAddr;
618617 if (auto declareOp =
619618 mlir::dyn_cast_or_null<hlfir::DeclareOp>(symAddr.getDefiningOp ())) {
620619 symAddr = declareOp.getResults ()[0 ];
621620 rawInput = declareOp.getResults ()[1 ];
622621 }
623622
624- // TODO: Might need revisiting to handle for non-shared clauses
625- if (!symAddr) {
626- if (const auto *details =
627- sym->detailsIf <Fortran::semantics::HostAssocDetails>()) {
628- symAddr = converter.getSymbolAddress (details->symbol ());
629- rawInput = symAddr;
630- }
631- }
632-
633623 if (!symAddr)
634624 llvm::report_fatal_error (" could not retrieve symbol address" );
635625
636626 mlir::Value isPresent;
637- if (Fortran::semantics::IsOptional (sym) )
627+ if (isOptional )
638628 isPresent =
639629 builder.create <fir::IsPresentOp>(loc, builder.getI1Type (), rawInput);
640630
@@ -648,8 +638,7 @@ getDataOperandBaseAddr(Fortran::lower::AbstractConverter &converter,
648638 // all address/dimension retrievals. For Fortran optional though, leave
649639 // the load generation for later so it can be done in the appropriate
650640 // if branches.
651- if (mlir::isa<fir::ReferenceType>(symAddr.getType ()) &&
652- !Fortran::semantics::IsOptional (sym)) {
641+ if (mlir::isa<fir::ReferenceType>(symAddr.getType ()) && !isOptional) {
653642 mlir::Value addr = builder.create <fir::LoadOp>(loc, symAddr);
654643 return AddrAndBoundsInfo (addr, rawInput, isPresent, boxTy);
655644 }
@@ -659,6 +648,14 @@ getDataOperandBaseAddr(Fortran::lower::AbstractConverter &converter,
659648 return AddrAndBoundsInfo (symAddr, rawInput, isPresent);
660649}
661650
651+ inline AddrAndBoundsInfo
652+ getDataOperandBaseAddr (Fortran::lower::AbstractConverter &converter,
653+ fir::FirOpBuilder &builder,
654+ Fortran::lower::SymbolRef sym, mlir::Location loc) {
655+ return getDataOperandBaseAddr (builder, converter.getSymbolAddress (sym),
656+ Fortran::semantics::IsOptional (sym), loc);
657+ }
658+
662659template <typename BoundsOp, typename BoundsType>
663660llvm::SmallVector<mlir::Value>
664661gatherBoundsOrBoundValues (fir::FirOpBuilder &builder, mlir::Location loc,
@@ -1224,6 +1221,25 @@ AddrAndBoundsInfo gatherDataOperandAddrAndBounds(
12241221
12251222 return info;
12261223}
1224+
1225+ template <typename BoundsOp, typename BoundsType>
1226+ llvm::SmallVector<mlir::Value>
1227+ genImplicitBoundsOps (fir::FirOpBuilder &builder, lower::AddrAndBoundsInfo &info,
1228+ fir::ExtendedValue dataExv, bool dataExvIsAssumedSize,
1229+ mlir::Location loc) {
1230+ llvm::SmallVector<mlir::Value> bounds;
1231+
1232+ mlir::Value baseOp = info.rawInput ;
1233+ if (mlir::isa<fir::BaseBoxType>(fir::unwrapRefType (baseOp.getType ())))
1234+ bounds = lower::genBoundsOpsFromBox<BoundsOp, BoundsType>(builder, loc,
1235+ dataExv, info);
1236+ if (mlir::isa<fir::SequenceType>(fir::unwrapRefType (baseOp.getType ()))) {
1237+ bounds = lower::genBaseBoundsOps<BoundsOp, BoundsType>(
1238+ builder, loc, dataExv, dataExvIsAssumedSize);
1239+ }
1240+
1241+ return bounds;
1242+ }
12271243} // namespace lower
12281244} // namespace Fortran
12291245
0 commit comments