[flang-commits] [flang] [flang] do not finalize or initialize unused entry dummy (PR #125482)
via flang-commits
flang-commits at lists.llvm.org
Mon Feb 3 03:33:24 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-fir-hlfir
Author: None (jeanPerier)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/125482.diff
2 Files Affected:
- (modified) flang/lib/Lower/ConvertVariable.cpp (+9)
- (added) flang/test/Lower/entry-statement-init.f90 (+26)
``````````diff
diff --git a/flang/lib/Lower/ConvertVariable.cpp b/flang/lib/Lower/ConvertVariable.cpp
index 87236dc293ebbc..d7ef1e9478a3ab 100644
--- a/flang/lib/Lower/ConvertVariable.cpp
+++ b/flang/lib/Lower/ConvertVariable.cpp
@@ -956,7 +956,16 @@ static void instantiateLocal(Fortran::lower::AbstractConverter &converter,
Fortran::lower::SymMap &symMap) {
assert(!var.isAlias());
Fortran::lower::StatementContext stmtCtx;
+ // isUnusedEntryDummy must be computed before mapSymbolAttributes.
+ const bool isUnusedEntryDummy =
+ var.hasSymbol() ? Fortran::semantics::IsDummy(var.getSymbol()) &&
+ !symMap.lookupSymbol(var.getSymbol()).getAddr()
+ : false;
mapSymbolAttributes(converter, var, symMap, stmtCtx);
+ // Do not generate code to initialize/finalize/destroy dummy arguments that
+ // are nor part of the current ENTRY. They do not have backing storage.
+ if (isUnusedEntryDummy)
+ return;
deallocateIntentOut(converter, var, symMap);
if (needDummyIntentoutFinalization(var))
finalizeAtRuntime(converter, var, symMap);
diff --git a/flang/test/Lower/entry-statement-init.f90 b/flang/test/Lower/entry-statement-init.f90
new file mode 100644
index 00000000000000..731ccebef6873c
--- /dev/null
+++ b/flang/test/Lower/entry-statement-init.f90
@@ -0,0 +1,26 @@
+! RUN: bbc -emit-hlfir -o - %s | FileCheck %s
+
+! Test initialization and finalizations of dummy arguments in entry statements.
+
+module m
+ type t
+ end type
+contains
+ subroutine test1(x)
+ class(t), intent(out) :: x
+ entry test1_entry()
+ end subroutine
+ subroutine test2(x)
+ class(t), intent(out) :: x
+ entry test2_entry(x)
+ end subroutine
+end module
+! CHECK-LABEL: func.func @_QMmPtest1_entry(
+! CHECK-NOT: Destroy
+! CHECK-NOT: Initialize
+! CHECK: return
+
+! CHECK-LABEL: func.func @_QMmPtest2_entry(
+! CHECK: Destroy
+! CHECK: Initialize
+! CHECK: return
``````````
</details>
https://github.com/llvm/llvm-project/pull/125482
More information about the flang-commits
mailing list