[Mlir-commits] [mlir] c34dc9a - [mlir][SCFToEmitC] Don't convert unsupported types in EmitC (#131786)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Tue Mar 18 23:18:54 PDT 2025
Author: Longsheng Mou
Date: 2025-03-19T14:18:51+08:00
New Revision: c34dc9a0cf328ace8a68069b1d1bbddd53179053
URL: https://github.com/llvm/llvm-project/commit/c34dc9a0cf328ace8a68069b1d1bbddd53179053
DIFF: https://github.com/llvm/llvm-project/commit/c34dc9a0cf328ace8a68069b1d1bbddd53179053.diff
LOG: [mlir][SCFToEmitC] Don't convert unsupported types in EmitC (#131786)
This PR adds check for unsupported types in emitc, which fixes a crash.
Fixes #131442.
Added:
mlir/test/Conversion/SCFToEmitC/scf-to-emitc-failed.mlir
Modified:
mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitCPass.cpp
mlir/lib/Conversion/SCFToEmitC/SCFToEmitC.cpp
Removed:
################################################################################
diff --git a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitCPass.cpp b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitCPass.cpp
index 7f433254e95ae..33097c71e70b1 100644
--- a/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitCPass.cpp
+++ b/mlir/lib/Conversion/MemRefToEmitC/MemRefToEmitCPass.cpp
@@ -33,9 +33,9 @@ struct ConvertMemRefToEmitCPass
// Fallback for other types.
converter.addConversion([](Type type) -> std::optional<Type> {
- if (emitc::isSupportedEmitCType(type))
- return type;
- return {};
+ if (!emitc::isSupportedEmitCType(type))
+ return {};
+ return type;
});
populateMemRefToEmitCTypeConversion(converter);
diff --git a/mlir/lib/Conversion/SCFToEmitC/SCFToEmitC.cpp b/mlir/lib/Conversion/SCFToEmitC/SCFToEmitC.cpp
index 92523ca4f12b2..d81e92c842369 100644
--- a/mlir/lib/Conversion/SCFToEmitC/SCFToEmitC.cpp
+++ b/mlir/lib/Conversion/SCFToEmitC/SCFToEmitC.cpp
@@ -319,10 +319,12 @@ void mlir::populateSCFToEmitCConversionPatterns(RewritePatternSet &patterns,
void SCFToEmitCPass::runOnOperation() {
RewritePatternSet patterns(&getContext());
TypeConverter typeConverter;
- // Fallback converter
- // See note https://mlir.llvm.org/docs/DialectConversion/#type-converter
- // Type converters are called most to least recently inserted
- typeConverter.addConversion([](Type t) { return t; });
+ // Fallback for other types.
+ typeConverter.addConversion([](Type type) -> std::optional<Type> {
+ if (!emitc::isSupportedEmitCType(type))
+ return {};
+ return type;
+ });
populateEmitCSizeTTypeConversions(typeConverter);
populateSCFToEmitCConversionPatterns(patterns, typeConverter);
diff --git a/mlir/test/Conversion/SCFToEmitC/scf-to-emitc-failed.mlir b/mlir/test/Conversion/SCFToEmitC/scf-to-emitc-failed.mlir
new file mode 100644
index 0000000000000..02c27deaa7a13
--- /dev/null
+++ b/mlir/test/Conversion/SCFToEmitC/scf-to-emitc-failed.mlir
@@ -0,0 +1,10 @@
+// RUN: mlir-opt -convert-scf-to-emitc %s -split-input-file -verify-diagnostics
+
+func.func @unsupported_type_vector(%arg0 : index, %arg1 : index, %arg2 : index) -> vector<3xindex> {
+ %zero = arith.constant dense<0> : vector<3xindex>
+ // expected-error at +1 {{failed to legalize operation 'scf.for'}}
+ %r = scf.for %i0 = %arg0 to %arg1 step %arg2 iter_args(%acc = %zero) -> vector<3xindex> {
+ scf.yield %acc : vector<3xindex>
+ }
+ return %r : vector<3xindex>
+}
More information about the Mlir-commits
mailing list