[llvm] [mlir] [mlir][emitc] Add a ConvertToEmitCPatternInterface for the math dialect (PR #223666)

via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 15 05:15:35 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir

Author: Alexander Viand (AlexanderViand)

<details>
<summary>Changes</summary>

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

---
Full diff: https://github.com/llvm/llvm-project/pull/223666.diff


8 Files Affected:

- (modified) mlir/include/mlir/Conversion/MathToEmitC/MathToEmitC.h (+3) 
- (modified) mlir/lib/Conversion/ConvertToEmitC/CMakeLists.txt (+1) 
- (modified) mlir/lib/Conversion/MathToEmitC/CMakeLists.txt (+1) 
- (modified) mlir/lib/Conversion/MathToEmitC/MathToEmitC.cpp (+24) 
- (modified) mlir/lib/Dialect/Math/IR/MathDialect.cpp (+2) 
- (modified) mlir/lib/RegisterAllExtensions.cpp (+2) 
- (modified) mlir/test/Conversion/MathToEmitC/math-to-emitc.mlir (+2) 
- (modified) utils/bazel/llvm-project-overlay/mlir/BUILD.bazel (+3) 


``````````diff
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..2152abd8e257c 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,23 @@
 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 +73,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",

``````````

</details>


https://github.com/llvm/llvm-project/pull/223666


More information about the llvm-commits mailing list