[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 08:23:09 PST 2025


https://github.com/jeanPerier updated https://github.com/llvm/llvm-project/pull/125482

>From 90742f966cb95be8295e99f6bb5724203b5a744e Mon Sep 17 00:00:00 2001
From: Jean Perier <jperier at nvidia.com>
Date: Mon, 3 Feb 2025 03:26:22 -0800
Subject: [PATCH 1/2] [flang] do not finalize or initialize unused entry dummy

---
 flang/lib/Lower/ConvertVariable.cpp       |  9 ++++++++
 flang/test/Lower/entry-statement-init.f90 | 26 +++++++++++++++++++++++
 2 files changed, 35 insertions(+)
 create mode 100644 flang/test/Lower/entry-statement-init.f90

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

>From 273a7a8b1f8c361ae817f93fb24ca6519664e6bb Mon Sep 17 00:00:00 2001
From: Jean Perier <jperier at nvidia.com>
Date: Mon, 3 Feb 2025 08:22:00 -0800
Subject: [PATCH 2/2] apply suggestion

---
 flang/lib/Lower/ConvertVariable.cpp | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/flang/lib/Lower/ConvertVariable.cpp b/flang/lib/Lower/ConvertVariable.cpp
index d7ef1e9478a3ab..81d14fbb1d7773 100644
--- a/flang/lib/Lower/ConvertVariable.cpp
+++ b/flang/lib/Lower/ConvertVariable.cpp
@@ -958,9 +958,8 @@ static void instantiateLocal(Fortran::lower::AbstractConverter &converter,
   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;
+      var.hasSymbol() && Fortran::semantics::IsDummy(var.getSymbol()) &&
+      !symMap.lookupSymbol(var.getSymbol()).getAddr();
   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.
@@ -1008,7 +1007,6 @@ static void instantiateLocal(Fortran::lower::AbstractConverter &converter,
                "trying to deallocate entity not lowered as allocatable");
         Fortran::lower::genDeallocateIfAllocated(*converterPtr, *mutableBox,
                                                  loc, sym);
-        
       });
     }
   }



More information about the flang-commits mailing list