diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp index f96d45d3f6b66..55e885d46d351 100644 --- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -816,6 +816,15 @@ struct ConvertOpConversion : public fir::FIROpConversion { mlir::ConversionPatternRewriter &rewriter) const override { auto fromFirTy = convert.getValue().getType(); auto toFirTy = convert.getRes().getType(); + + // Let more specialized conversions (e.g. FIR to memref + // converters) handle fir.convert when either side is a memref. This + // avoids interfering with descriptor-based flows such as fir.box / + // fir.box_addr and keeps this pattern focused on value conversions. + if (mlir::isa(fromFirTy) || + mlir::isa(toFirTy)) + return mlir::failure(); + auto fromTy = convertType(fromFirTy); auto toTy = convertType(toFirTy); mlir::Value op0 = adaptor.getOperands()[0]; diff --git a/flang/test/Fir/convert-memref-codegen.mlir b/flang/test/Fir/convert-memref-codegen.mlir new file mode 100644 index 0000000000000..4496af19e0f67 --- /dev/null +++ b/flang/test/Fir/convert-memref-codegen.mlir @@ -0,0 +1,15 @@ +// RUN: not fir-opt --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" %s -o - 2>&1 | FileCheck %s + +// This test ensures that the FIR CodeGen ConvertOpConversion +// rejects fir.convert when either the source or the destination +// type is a memref (i.e. it fails to legalize those ops). + +module { + // CHECK: error: failed to legalize operation 'fir.convert' + func.func @memref_to_ref_convert(%arg0: memref) { + %0 = fir.convert %arg0 : (memref) -> !fir.ref + return + } +} + +