[flang-commits] [flang] [flang][MIF] Fix undef reference to a coarray_handle in mif.dealloc_coarray #193157 (PR #213890)

Jean-Didier PAILLEUX via flang-commits flang-commits at lists.llvm.org
Tue Aug 4 04:31:19 PDT 2026


https://github.com/JDPailleux updated https://github.com/llvm/llvm-project/pull/213890

>From 7043975dc317a0184d49b230d9c480c6011318ea Mon Sep 17 00:00:00 2001
From: Jean-Didier Pailleux <jean-didier.pailleux at sipearl.com>
Date: Tue, 4 Aug 2026 11:22:09 +0200
Subject: [PATCH] [flang][MIF] Fix undef reference to a coarray_handle in
 mif.dealloc_coarray #193157

---
 .../Optimizer/Transforms/MIFOpConversion.cpp  | 34 +++++++++++++++++--
 .../Lower/MIF/coarray_dealloc_not_alloc.f90   | 15 ++++++++
 2 files changed, 47 insertions(+), 2 deletions(-)
 create mode 100644 flang/test/Lower/MIF/coarray_dealloc_not_alloc.f90

diff --git a/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp b/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
index 77dfb5ac957ea..4223f32ec0d13 100644
--- a/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
+++ b/flang/lib/Optimizer/Transforms/MIFOpConversion.cpp
@@ -1360,6 +1360,32 @@ struct MIFImageIndexOpConversion
   }
 };
 
+static void genCoarrayHandle(fir::FirOpBuilder &builder, mlir::ModuleOp mod,
+                             fir::DeclareOp op) {
+  builder.setInsertionPointAfter(op);
+  mlir::Location loc = op.getLoc();
+  mlir::Type ty = fir::unwrapRefType(op.getMemref().getType());
+
+  if (auto boxTy = mlir::dyn_cast<fir::BaseBoxType>(ty)) {
+    if (boxTy.isCoarray()) {
+      mlir::Type handleTy =
+          fir::BoxType::get(getCoarrayHandleType(builder, loc));
+      std::string globalName =
+          op.getUniqName().str() + coarrayHandleSuffix.str();
+      fir::GlobalOp global = builder.createGlobal(
+          loc, handleTy, globalName, builder.createLinkOnceLinkage());
+      mlir::Region &region = global.getRegion();
+      region.push_back(new mlir::Block);
+      mlir::Block &block = region.back();
+      auto insertPt = builder.saveInsertionPoint();
+      builder.setInsertionPointToStart(&block);
+      auto box = fir::factory::createUnallocatedBox(builder, loc, handleTy, {});
+      fir::HasValueOp::create(builder, loc, box);
+      builder.restoreInsertionPoint(insertPt);
+    }
+  }
+}
+
 class MIFOpConversion : public fir::impl::MIFOpConversionBase<MIFOpConversion> {
 public:
   void runOnOperation() override {
@@ -1384,11 +1410,15 @@ class MIFOpConversion : public fir::impl::MIFOpConversionBase<MIFOpConversion> {
 
     fir::LLVMTypeConverter typeConverter(module, /*applyTBAA=*/false,
                                          /*forceUnifiedTBAATree=*/false, *dl);
-    mif::populateMIFOpConversionPatterns(typeConverter, *dl, patterns);
-
     target.addLegalDialect<fir::FIROpsDialect, mlir::cf::ControlFlowDialect>();
     target.addLegalOp<mlir::ModuleOp>();
 
+    // Generate non-allocated missing coarray_handle
+    fir::FirOpBuilder builder(op, fir::getKindMapping(op));
+    module.walk(
+        [&](fir::DeclareOp op) { genCoarrayHandle(builder, module, op); });
+
+    mif::populateMIFOpConversionPatterns(typeConverter, *dl, patterns);
     if (mlir::failed(mlir::applyPartialConversion(getOperation(), target,
                                                   std::move(patterns)))) {
       mlir::emitError(mlir::UnknownLoc::get(ctx),
diff --git a/flang/test/Lower/MIF/coarray_dealloc_not_alloc.f90 b/flang/test/Lower/MIF/coarray_dealloc_not_alloc.f90
new file mode 100644
index 0000000000000..d00c46fd89315
--- /dev/null
+++ b/flang/test/Lower/MIF/coarray_dealloc_not_alloc.f90
@@ -0,0 +1,15 @@
+! RUN: %flang_fc1 -emit-llvm -fcoarray %s -o - 2>&1 | FileCheck %s --check-prefix=LLVM
+
+! LLVM: @_QFB1Ekk_coarray_handle = linkonce global { ptr, i64, i32, i8, i8, i8, i8, ptr, [1 x i64] } { ptr null, i64 40, i32 20240719, i8 0, i8 42, i8 0, i8 1, ptr @_QMprifEXdtXprif_coarray_handle, [1 x i64] zeroinitializer }, comdat
+
+! LLVM-LABEL:  @_QQmain()
+! LLVM:       call void @llvm.memcpy.p0.p0.i32(ptr align 8 %[[VAL_1:.*]], ptr align 8 @_QFB1Ekk_coarray_handle, i32 40, i1 false)
+! LLVM-NEXT:  call void @_QMprifPprif_deallocate_coarray(ptr %[[VAL_1]], ptr null, ptr null, ptr null)
+
+
+block
+integer :: kk
+allocatable :: kk(:)[:]
+endblock
+end
+



More information about the flang-commits mailing list