[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:53 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)) {
----------------
jeanPerier wrote:

You should also not do that on polymorphic entities because we do not know the dynamic type, so we cannot fetch the correct initial value at compile time without some table look-up:

```
module m
 type t
 end type
contains
subroutine foo(x)
  class(t), intent(out) :: x
end subroutine
end module
```

I think the code is not falling into it anyway, but I would rather be explicit here (checking the base is a fir.ref<fir.type> would work).

https://github.com/llvm/llvm-project/pull/114002


More information about the flang-commits mailing list