[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 ®ion = 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