[flang-commits] [flang] [flang] fix fir.ref<fir.box<..>> type conversion in FIRToMemRefTypeConverter (PR #204271)

Susan Tan ス-ザン タン via flang-commits flang-commits at lists.llvm.org
Tue Jun 16 18:20:37 PDT 2026


https://github.com/SusanTan created https://github.com/llvm/llvm-project/pull/204271

WIP

>From 13367fab9d6f3598faf89c1a541aa8376048b116 Mon Sep 17 00:00:00 2001
From: Susan Tan <zujunt at nvidia.com>
Date: Tue, 16 Jun 2026 18:17:14 -0700
Subject: [PATCH] fix converter bug

---
 .../Transforms/FIRToMemRefTypeConverter.h     | 28 +++++++++++++------
 1 file changed, 20 insertions(+), 8 deletions(-)

diff --git a/flang/include/flang/Optimizer/Transforms/FIRToMemRefTypeConverter.h b/flang/include/flang/Optimizer/Transforms/FIRToMemRefTypeConverter.h
index fd434b1f09c9b..fe9fee94b95df 100644
--- a/flang/include/flang/Optimizer/Transforms/FIRToMemRefTypeConverter.h
+++ b/flang/include/flang/Optimizer/Transforms/FIRToMemRefTypeConverter.h
@@ -66,15 +66,27 @@ class FIRToMemRefTypeConverter : public mlir::TypeConverter {
   /// Return true if the given FIR type can be converted to a MemRef-typed
   /// descriptor (i.e. is a supported base element for MemRef converting).
   bool convertibleMemrefType(mlir::Type ty) {
-    if (auto refTy = mlir::dyn_cast<fir::ReferenceType>(ty))
-      return convertibleMemrefType(refTy.getElementType());
-    else if (auto pointerTy = mlir::dyn_cast<fir::PointerType>(ty))
-      return convertibleMemrefType(pointerTy.getElementType());
-    else if (auto heapTy = mlir::dyn_cast<fir::HeapType>(ty))
-      return convertibleMemrefType(heapTy.getElementType());
-    else if (auto seqTy = mlir::dyn_cast<fir::SequenceType>(ty))
+    // !fir.box<T> is a descriptor value and maps to a strided memref:
+    //   !fir.box<!fir.array<?xi32>>  →  memref<?xi32, strided<[?], offset:?>>
+    // !fir.ref<!fir.box<T>> is a pointer-to-descriptor (e.g. an assumed-shape
+    // dummy argument or allocatable on entry). There is no memref equivalent:
+    // memref descriptors are SSA values, not addressable memory objects.
+    // Passing ref<box<T>> to convertBaseType would assert on the invalid
+    // element type.
+    mlir::Type indirectElTy;
+    if (auto t = mlir::dyn_cast<fir::ReferenceType>(ty))
+      indirectElTy = t.getElementType();
+    else if (auto t = mlir::dyn_cast<fir::PointerType>(ty))
+      indirectElTy = t.getElementType();
+    else if (auto t = mlir::dyn_cast<fir::HeapType>(ty))
+      indirectElTy = t.getElementType();
+    if (indirectElTy)
+      return !mlir::isa<fir::BoxType>(indirectElTy) &&
+             convertibleMemrefType(indirectElTy);
+
+    if (auto seqTy = mlir::dyn_cast<fir::SequenceType>(ty))
       return convertibleMemrefType(seqTy.getElementType());
-    else if (auto boxTy = mlir::dyn_cast<fir::BoxType>(ty))
+    if (auto boxTy = mlir::dyn_cast<fir::BoxType>(ty))
       return convertibleMemrefType(boxTy.getElementType());
 
     setConvertScalarTypesOnly(true);



More information about the flang-commits mailing list