[flang-commits] [flang] [flang] Lower passing non assumed-rank/size to assumed-ranks (PR #79145)
Valentin Clement バレンタイン クレメン via flang-commits
flang-commits at lists.llvm.org
Tue Jan 23 08:58:05 PST 2024
================
@@ -1043,39 +1083,55 @@ static PreparedDummyArgument preparePresentUserCallActualArgument(
// has the dummy attributes in BIND(C) contexts.
const bool actualBoxHasAllocatableOrPointerFlag =
fir::isa_ref_type(boxEleType);
+ // Fortran 2018 18.5.3, pp3: BIND(C) non pointer allocatable descriptors
+ // must have zero lower bounds.
+ bool needsZeroLowerBounds = callContext.isBindcCall() && entity.isArray();
// On the callee side, the current code generated for unlimited
// polymorphic might unconditionally read the addendum. Intrinsic type
// descriptors may not have an addendum, the rebox below will create a
// descriptor with an addendum in such case.
const bool actualBoxHasAddendum = fir::boxHasAddendum(actualBoxType);
const bool needToAddAddendum =
- fir::isUnlimitedPolymorphicType(dummyType) && !actualBoxHasAddendum;
- mlir::Type reboxType = dummyType;
- if (needToAddAddendum || actualBoxHasAllocatableOrPointerFlag) {
- if (fir::getBoxRank(dummyType) != fir::getBoxRank(actualBoxType)) {
- // This may happen only with IGNORE_TKR(R).
- if (!arg.testTKR(Fortran::common::IgnoreTKR::Rank))
- DIE("actual and dummy arguments must have equal ranks");
- // Only allow it for unlimited polymorphic dummy arguments
- // for now.
- if (!fir::isUnlimitedPolymorphicType(dummyType))
- TODO(loc, "actual/dummy rank mismatch for not unlimited polymorphic "
- "dummy.");
- auto elementType = fir::updateTypeForUnlimitedPolymorphic(boxEleType);
- if (fir::isAssumedType(dummyType))
- reboxType = fir::BoxType::get(elementType);
+ fir::isUnlimitedPolymorphicType(dummyTypeWithActualRank) &&
+ !actualBoxHasAddendum;
+ if (needToAddAddendum || actualBoxHasAllocatableOrPointerFlag ||
+ needsZeroLowerBounds) {
+ if (actualIsAssumedRank) {
+ if (needToAddAddendum)
+ TODO(loc, "passing intrinsic assumed-rank to unlimited polymorphic "
+ "assumed-rank");
else
- reboxType = fir::ClassType::get(elementType);
+ TODO(loc, "passing pointer or allocatable assumed-rank to non "
+ "pointer non allocatable assumed-rank");
}
+ mlir::Value shift{};
+ if (needsZeroLowerBounds)
+ shift = getZeroLowerBounds(loc, builder, entity);
entity = hlfir::Entity{builder.create<fir::ReboxOp>(
- loc, reboxType, entity, /*shape=*/mlir::Value{},
+ loc, dummyTypeWithActualRank, entity, /*shape=*/shift,
/*slice=*/mlir::Value{})};
}
addr = entity;
} else {
addr = hlfir::genVariableRawAddress(loc, builder, entity);
}
- preparedDummy.dummy = builder.createConvert(loc, dummyType, addr);
+ // The last extent created for assumed-rank descriptors must be -1 (18.5.3
+ // point 5.). This should be done when creating the assumed-size shape for
+ // consistency.
+ if (auto baseBoxDummy = mlir::dyn_cast<fir::BaseBoxType>(dummyType))
+ if (baseBoxDummy.isAssumedRank())
+ if (const Fortran::semantics::Symbol *sym =
+ Fortran::evaluate::UnwrapWholeSymbolDataRef(expr))
+ if (Fortran::semantics::IsAssumedSizeArray(sym->GetUltimate()))
+ TODO(loc, "passing assumed-size to assumed-rank array");
+
+ // For ranked actual passed to assumed-rank dummy, the cast to assumed-rank
+ // box is inserted when building the fir.call op. Inserting it here would
+ // cause the fir.if results to be assumed-rank in case of OPTIONAL dummy,
+ // causing extra runtime costs due to the unknwon runtime size of assumed-rank
----------------
clementval wrote:
```suggestion
// causing extra runtime costs due to the unknown runtime size of assumed-rank
```
https://github.com/llvm/llvm-project/pull/79145
More information about the flang-commits
mailing list