[flang-commits] [flang] [flang] Rely on global initialization for simpler derived types (PR #114002)
via flang-commits
flang-commits at lists.llvm.org
Tue Oct 29 03:09:55 PDT 2024
================
@@ -793,11 +794,35 @@ void Fortran::lower::defaultInitializeAtRuntime(
})
.end();
} else {
- mlir::Value box = builder.createBox(loc, exv);
- fir::runtime::genDerivedTypeInitialize(builder, loc, box);
+ /// For "simpler" types, relying on "_FortranAInitialize"
+ /// leads to poor runtime performance. Hence optimize
+ /// the same.
+ const Fortran::semantics::DeclTypeSpec *declTy = sym.GetType();
+ mlir::Type symTy = converter.genType(var);
+ if (!var.isAlias() && !hasAllocatableDirectComponent(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)) {
+ std::string globalName = converter.mangleName(sym) + "_globalinit";
+ mlir::Location loc = genLocation(converter, sym);
+ mlir::StringAttr linkage = getLinkageAttribute(builder, var);
+ cuf::DataAttributeAttr dataAttr =
+ Fortran::lower::translateSymbolCUFDataAttribute(builder.getContext(),
+ sym);
+ fir::GlobalOp global =
+ defineGlobal(converter, var, globalName, linkage, dataAttr);
+ auto addrOf = builder.create<fir::AddrOfOp>(loc, global.resultType(),
+ global.getSymbol());
+ fir::LoadOp load = builder.create<fir::LoadOp>(loc, addrOf.getResult());
+ builder.create<fir::StoreOp>(loc, load, fir::getBase(exv));
----------------
jeanPerier wrote:
This load/store assumes that exv base is a `fir.ref<fir.type<>>`, that sounds fine but it may not always be the case (for instance with polymorphic arguments), so better to only fall here in the if when the base is what you expect.
https://github.com/llvm/llvm-project/pull/114002
More information about the flang-commits
mailing list