[Mlir-commits] [mlir] 4cbd7f8 - [mlir][emitc] Add a ConvertToEmitCPatternInterface for the math dialect (#223666)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Tue Sep 15 12:15:35 PDT 2026


Author: Alexander Viand
Date: 2026-09-15T12:15:30-07:00
New Revision: 4cbd7f8300cab44d8847ab2b7db7ef2caa5b2942

URL: https://github.com/llvm/llvm-project/commit/4cbd7f8300cab44d8847ab2b7db7ef2caa5b2942
DIFF: https://github.com/llvm/llvm-project/commit/4cbd7f8300cab44d8847ab2b7db7ef2caa5b2942.diff

LOG: [mlir][emitc] Add a ConvertToEmitCPatternInterface for the math dialect (#223666)

MathToEmitC wasn't registered for `--convert-to-emitc`. This registers
an interface matching the other *ToEmitC interfaces.

Added: 
    

Modified: 
    mlir/include/mlir/Conversion/MathToEmitC/MathToEmitC.h
    mlir/lib/Conversion/ConvertToEmitC/CMakeLists.txt
    mlir/lib/Conversion/MathToEmitC/CMakeLists.txt
    mlir/lib/Conversion/MathToEmitC/MathToEmitC.cpp
    mlir/lib/Dialect/Math/IR/MathDialect.cpp
    mlir/lib/RegisterAllExtensions.cpp
    mlir/test/Conversion/MathToEmitC/math-to-emitc.mlir
    utils/bazel/llvm-project-overlay/mlir/BUILD.bazel

Removed: 
    


################################################################################
diff  --git a/mlir/include/mlir/Conversion/MathToEmitC/MathToEmitC.h b/mlir/include/mlir/Conversion/MathToEmitC/MathToEmitC.h
index c61773026ca53..f6b91c8d9f413 100644
--- a/mlir/include/mlir/Conversion/MathToEmitC/MathToEmitC.h
+++ b/mlir/include/mlir/Conversion/MathToEmitC/MathToEmitC.h
@@ -9,6 +9,7 @@
 #ifndef MLIR_CONVERSION_MATHTOEMITC_MATHTOEMITC_H
 #define MLIR_CONVERSION_MATHTOEMITC_MATHTOEMITC_H
 namespace mlir {
+class DialectRegistry;
 class RewritePatternSet;
 namespace emitc {
 
@@ -19,6 +20,8 @@ enum class LanguageTarget { c99, cpp11 };
 
 void populateConvertMathToEmitCPatterns(RewritePatternSet &patterns,
                                         emitc::LanguageTarget languageTarget);
+
+void registerConvertMathToEmitCInterface(DialectRegistry &registry);
 } // namespace mlir
 
 #endif // MLIR_CONVERSION_MATHTOEMITC_MATHTOEMITC_H

diff  --git a/mlir/lib/Conversion/ConvertToEmitC/CMakeLists.txt b/mlir/lib/Conversion/ConvertToEmitC/CMakeLists.txt
index e893d5cd1d35e..ce3704e03e0b3 100644
--- a/mlir/lib/Conversion/ConvertToEmitC/CMakeLists.txt
+++ b/mlir/lib/Conversion/ConvertToEmitC/CMakeLists.txt
@@ -12,6 +12,7 @@ add_mlir_conversion_library(MLIRConvertToEmitC
   MLIRArithToEmitC
   MLIREmitCCommonConversion
   MLIRFuncToEmitC
+  MLIRMathToEmitC
   MLIRMemRefToEmitC
   MLIRPass
   MLIRSCFToEmitC

diff  --git a/mlir/lib/Conversion/MathToEmitC/CMakeLists.txt b/mlir/lib/Conversion/MathToEmitC/CMakeLists.txt
index 12a99c31e2ba5..7f5e7b4a3aa77 100644
--- a/mlir/lib/Conversion/MathToEmitC/CMakeLists.txt
+++ b/mlir/lib/Conversion/MathToEmitC/CMakeLists.txt
@@ -12,6 +12,7 @@ add_mlir_conversion_library(MLIRMathToEmitC
   Core
 
   LINK_LIBS PUBLIC
+  MLIREmitCCommonConversion
   MLIREmitCDialect
   MLIRMathDialect
   MLIRPass

diff  --git a/mlir/lib/Conversion/MathToEmitC/MathToEmitC.cpp b/mlir/lib/Conversion/MathToEmitC/MathToEmitC.cpp
index 77d7ce236e435..adf06c139021f 100644
--- a/mlir/lib/Conversion/MathToEmitC/MathToEmitC.cpp
+++ b/mlir/lib/Conversion/MathToEmitC/MathToEmitC.cpp
@@ -8,6 +8,7 @@
 
 #include "mlir/Conversion/MathToEmitC/MathToEmitC.h"
 
+#include "mlir/Conversion/ConvertToEmitC/ToEmitCInterface.h"
 #include "mlir/Dialect/EmitC/IR/EmitC.h"
 #include "mlir/Dialect/Math/IR/Math.h"
 #include "mlir/Transforms/DialectConversion.h"
@@ -15,6 +16,22 @@
 using namespace mlir;
 
 namespace {
+/// Implement the interface to convert Math to EmitC.
+struct MathToEmitCDialectInterface : public ConvertToEmitCPatternInterface {
+  MathToEmitCDialectInterface(Dialect *dialect)
+      : ConvertToEmitCPatternInterface(dialect) {}
+
+  /// Hook for derived dialect interface to provide conversion patterns
+  /// and mark dialect legal for the conversion target.
+  void populateConvertToEmitCConversionPatterns(
+      ConversionTarget &target, TypeConverter &typeConverter,
+      RewritePatternSet &patterns, std::optional<bool> lowerToCpp) const final {
+    populateConvertMathToEmitCPatterns(
+        patterns, lowerToCpp.value_or(true) ? emitc::LanguageTarget::cpp11
+                                            : emitc::LanguageTarget::c99);
+  }
+};
+
 template <typename OpType>
 class LowerToEmitCCallOpaque : public OpRewritePattern<OpType> {
   std::string calleeStr;
@@ -55,6 +72,12 @@ LogicalResult LowerToEmitCCallOpaque<OpType>::matchAndRewrite(
 
 } // namespace
 
+void mlir::registerConvertMathToEmitCInterface(DialectRegistry &registry) {
+  registry.addExtension(+[](MLIRContext *ctx, math::MathDialect *dialect) {
+    dialect->addInterfaces<MathToEmitCDialectInterface>();
+  });
+}
+
 // Populates patterns to replace `math` operations with `emitc.call_opaque`,
 // using function names consistent with those in <math.h>.
 void mlir::populateConvertMathToEmitCPatterns(

diff  --git a/mlir/lib/Dialect/Math/IR/MathDialect.cpp b/mlir/lib/Dialect/Math/IR/MathDialect.cpp
index 6757894fea4a5..46d2e7a4b62fc 100644
--- a/mlir/lib/Dialect/Math/IR/MathDialect.cpp
+++ b/mlir/lib/Dialect/Math/IR/MathDialect.cpp
@@ -6,6 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "mlir/Conversion/ConvertToEmitC/ToEmitCInterface.h"
 #include "mlir/Conversion/ConvertToLLVM/ToLLVMInterface.h"
 #include "mlir/Dialect/Math/IR/Math.h"
 #include "mlir/Transforms/InliningUtils.h"
@@ -34,5 +35,6 @@ void mlir::math::MathDialect::initialize() {
 #include "mlir/Dialect/Math/IR/MathOps.cpp.inc"
       >();
   addInterfaces<MathInlinerInterface>();
+  declarePromisedInterface<ConvertToEmitCPatternInterface, MathDialect>();
   declarePromisedInterface<ConvertToLLVMPatternInterface, MathDialect>();
 }

diff  --git a/mlir/lib/RegisterAllExtensions.cpp b/mlir/lib/RegisterAllExtensions.cpp
index 27a89ef8712da..e32e114215092 100644
--- a/mlir/lib/RegisterAllExtensions.cpp
+++ b/mlir/lib/RegisterAllExtensions.cpp
@@ -23,6 +23,7 @@
 #include "mlir/Conversion/GPUToNVVM/GPUToNVVM.h"
 #include "mlir/Conversion/IndexToLLVM/IndexToLLVM.h"
 #include "mlir/Conversion/MPIToLLVM/MPIToLLVM.h"
+#include "mlir/Conversion/MathToEmitC/MathToEmitC.h"
 #include "mlir/Conversion/MathToLLVM/MathToLLVM.h"
 #include "mlir/Conversion/MemRefToEmitC/MemRefToEmitC.h"
 #include "mlir/Conversion/MemRefToLLVM/MemRefToLLVM.h"
@@ -81,6 +82,7 @@ void mlir::registerAllExtensions(DialectRegistry &registry) {
   registerConvertFuncToEmitCInterface(registry);
   registerConvertFuncToLLVMInterface(registry);
   index::registerConvertIndexToLLVMInterface(registry);
+  registerConvertMathToEmitCInterface(registry);
   registerConvertMathToLLVMInterface(registry);
   mpi::registerConvertMPIToLLVMInterface(registry);
   registerConvertMemRefToEmitCInterface(registry);

diff  --git a/mlir/test/Conversion/MathToEmitC/math-to-emitc.mlir b/mlir/test/Conversion/MathToEmitC/math-to-emitc.mlir
index 85e9a269f3f2b..0947556e20fb5 100644
--- a/mlir/test/Conversion/MathToEmitC/math-to-emitc.mlir
+++ b/mlir/test/Conversion/MathToEmitC/math-to-emitc.mlir
@@ -1,5 +1,7 @@
 // RUN: mlir-opt -convert-math-to-emitc=language-target=c99 %s | FileCheck %s --check-prefix=c99
 // RUN: mlir-opt -convert-math-to-emitc=language-target=cpp11 %s | FileCheck %s --check-prefix=cpp11
+// RUN: mlir-opt -convert-to-emitc="filter-dialects=math lower-to-cpp=false" %s | FileCheck %s --check-prefix=c99
+// RUN: mlir-opt -convert-to-emitc="filter-dialects=math" %s | FileCheck %s --check-prefix=cpp11
 
 func.func @absf(%arg0: f32, %arg1: f64) {
     // c99: emitc.call_opaque "fabsf"

diff  --git a/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel b/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel
index 8a8ff6d91e98b..f8b267ad74b7a 100644
--- a/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/mlir/BUILD.bazel
@@ -9037,6 +9037,7 @@ cc_library(
     ],
     deps = [
         ":ConversionPassIncGen",
+        ":ConvertToEmitCInterface",
         ":EmitCCommon",
         ":EmitCDialect",
         ":MathDialect",
@@ -10044,6 +10045,7 @@ cc_library(
         ":LLVMToLLVMIRTranslation",
         ":LinalgTransformOps",
         ":MPIToLLVM",
+        ":MathToEmitC",
         ":MathToLLVM",
         ":MemRefToEmitC",
         ":MemRefToLLVM",
@@ -13547,6 +13549,7 @@ cc_library(
         ":ArithDialect",
         ":BytecodeOpInterface",
         ":CommonFolders",
+        ":ConvertToEmitCInterface",
         ":ConvertToLLVMInterface",
         ":IR",
         ":InferTypeOpInterface",


        


More information about the Mlir-commits mailing list