[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