[flang-commits] [flang] [flang][lowering] Implement component-wise initialization for derived types (PR #187465)
via flang-commits
flang-commits at lists.llvm.org
Fri Apr 3 07:09:04 PDT 2026
================
@@ -839,56 +983,68 @@ void Fortran::lower::defaultInitializeAtRuntime(
mlir::Type symTy = converter.genType(sym);
const auto *details =
sym.detailsIf<Fortran::semantics::ObjectEntityDetails>();
- if (details && !Fortran::semantics::IsPolymorphic(sym) &&
+ bool isDerivedTypeScalar =
+ details && !Fortran::semantics::IsPolymorphic(sym) &&
declTy->category() ==
Fortran::semantics::DeclTypeSpec::Category::TypeDerived &&
!mlir::isa<fir::SequenceType>(symTy) &&
!sym.test(Fortran::semantics::Symbol::Flag::OmpPrivate) &&
!sym.test(Fortran::semantics::Symbol::Flag::OmpFirstPrivate) &&
- !Fortran::semantics::HasCUDAComponent(sym)) {
- std::string globalName = fir::NameUniquer::doGenerated(
- (converter.mangleName(*declTy->AsDerived()) + fir::kNameSeparator +
- fir::kDerivedTypeInitSuffix)
- .str());
- mlir::Location loc = genLocation(converter, sym);
- mlir::StringAttr linkage = builder.createInternalLinkage();
- fir::GlobalOp global = builder.getNamedGlobal(globalName);
- if (!global && details->init()) {
- global = builder.createGlobal(loc, symTy, globalName, linkage,
- mlir::Attribute{},
- /*isConst=*/true,
- /*isTarget=*/false,
- /*dataAttr=*/{});
- createGlobalInitialization(
- builder, global, [&](fir::FirOpBuilder &builder) {
- Fortran::lower::StatementContext stmtCtx(
- /*cleanupProhibited=*/true);
- fir::ExtendedValue initVal = genInitializerExprValue(
- converter, loc, details->init().value(), stmtCtx);
- mlir::Value castTo =
- builder.createConvert(loc, symTy, fir::getBase(initVal));
- fir::HasValueOp::create(builder, loc, castTo);
- });
- } else if (!global) {
- global = builder.createGlobal(loc, symTy, globalName, linkage,
- mlir::Attribute{},
- /*isConst=*/true,
- /*isTarget=*/false,
- /*dataAttr=*/{});
- createGlobalInitialization(
- builder, global, [&](fir::FirOpBuilder &builder) {
- Fortran::lower::StatementContext stmtCtx(
- /*cleanupProhibited=*/true);
- mlir::Value initVal = genDefaultInitializerValue(
- converter, loc, sym, symTy, stmtCtx);
- mlir::Value castTo = builder.createConvert(loc, symTy, initVal);
- fir::HasValueOp::create(builder, loc, castTo);
- });
+ !Fortran::semantics::HasCUDAComponent(sym);
+ if (isDerivedTypeScalar) {
+ const auto &derivedSpec = *declTy->AsDerived();
+ if (isEligibleForComponentWiseInit(derivedSpec)) {
+ // Component-wise initialization
+ mlir::Value baseAddr = fir::getBase(exv);
+ auto recTy = mlir::cast<fir::RecordType>(
+ fir::unwrapPassByRefType(baseAddr.getType()));
+ genDerivedTypeComponentInit(converter, loc, derivedSpec, baseAddr,
+ recTy);
+ } else {
----------------
jeanPerier wrote:
nit: can you move the else branch into its own "genInlinedInitWithMemcpy" helper?
https://github.com/llvm/llvm-project/pull/187465
More information about the flang-commits
mailing list