From 744d5fb133b00bfcbce220af5f3223d8172948c7 Mon Sep 17 00:00:00 2001 From: mrsoliman Date: Sun, 18 Feb 2024 16:53:30 -0500 Subject: [PATCH] [CIR][Lowering] Handle unsupported types for CIR-MLIR type conversion * Pointers to CIR types that do not have converters (e.g. cir.struct) cause crashes due to passing null types to construct mlir::MemRefType. * This commit adds checks for pointers and alloca lowering to fail gracefully if the underlying type can not be converted. --- clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp b/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp index 948d0a34e376..6437664e932f 100644 --- a/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp +++ b/clang/lib/CIR/Lowering/ThroughMLIR/LowerCIRToMLIR.cpp @@ -103,6 +103,10 @@ class CIRAllocaOpLowering auto type = adaptor.getAllocaType(); auto mlirType = getTypeConverter()->convertType(type); + // FIXME: Some types can not be converted yet (e.g. struct) + if (!mlirType) + return mlir::LogicalResult::failure(); + auto memreftype = mlir::MemRefType::get({}, mlirType); rewriter.replaceOpWithNewOp(op, memreftype, op.getAlignmentAttr()); @@ -615,6 +619,9 @@ static mlir::TypeConverter prepareTypeConverter() { mlir::TypeConverter converter; converter.addConversion([&](mlir::cir::PointerType type) -> mlir::Type { auto ty = converter.convertType(type.getPointee()); + // FIXME: The pointee type might not be converted (e.g. struct) + if (!ty) + return nullptr; return mlir::MemRefType::get({}, ty); }); converter.addConversion(