[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