[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 ®istry);
} // 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 ®istry) {
+ 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 ®istry) {
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