[Mlir-commits] [mlir] [mlir] Add math to LLVM lowering support for missing trigonometric & hyperbolic ops (PR #125753)
Paul Carabas
llvmlistbot at llvm.org
Wed Feb 5 01:18:31 PST 2025
https://github.com/PaulCarabas updated https://github.com/llvm/llvm-project/pull/125753
>From 15dba106f8cadb69ababeb7c60c021edbaaab662 Mon Sep 17 00:00:00 2001
From: PaulCarabas <paulcaraa at gmail.com>
Date: Tue, 4 Feb 2025 22:09:23 +0200
Subject: [PATCH] [mlir] Add math to LLVM lowering support for missing
trigonometric & hyperbolic ops
---
mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp | 10 ++++++-
.../Conversion/MathToLLVM/math-to-llvm.mlir | 26 +++++++++++++++++--
2 files changed, 33 insertions(+), 3 deletions(-)
diff --git a/mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp b/mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp
index 668f8385ac2dcf4..98680773e00d2ac 100644
--- a/mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp
+++ b/mlir/lib/Conversion/MathToLLVM/MathToLLVM.cpp
@@ -39,6 +39,7 @@ using CeilOpLowering = ConvertFMFMathToLLVMPattern<math::CeilOp, LLVM::FCeilOp>;
using CopySignOpLowering =
ConvertFMFMathToLLVMPattern<math::CopySignOp, LLVM::CopySignOp>;
using CosOpLowering = ConvertFMFMathToLLVMPattern<math::CosOp, LLVM::CosOp>;
+using CoshOpLowering = ConvertFMFMathToLLVMPattern<math::CoshOp, LLVM::CoshOp>;
using CtPopFOpLowering =
VectorConvertToLLVMPattern<math::CtPopOp, LLVM::CtPopOp>;
using Exp2OpLowering = ConvertFMFMathToLLVMPattern<math::Exp2Op, LLVM::Exp2Op>;
@@ -58,9 +59,12 @@ using RoundEvenOpLowering =
using RoundOpLowering =
ConvertFMFMathToLLVMPattern<math::RoundOp, LLVM::RoundOp>;
using SinOpLowering = ConvertFMFMathToLLVMPattern<math::SinOp, LLVM::SinOp>;
+using SinhOpLowering = ConvertFMFMathToLLVMPattern<math::SinhOp, LLVM::SinhOp>;
using SqrtOpLowering = ConvertFMFMathToLLVMPattern<math::SqrtOp, LLVM::SqrtOp>;
using FTruncOpLowering =
ConvertFMFMathToLLVMPattern<math::TruncOp, LLVM::FTruncOp>;
+using TanOpLowering = ConvertFMFMathToLLVMPattern<math::TanOp, LLVM::TanOp>;
+using TanhOpLowering = ConvertFMFMathToLLVMPattern<math::TanhOp, LLVM::TanhOp>;
// A `CtLz/CtTz/absi(a)` is converted into `CtLz/CtTz/absi(a, false)`.
template <typename MathOp, typename LLVMOp>
@@ -310,6 +314,7 @@ void mlir::populateMathToLLVMConversionPatterns(
CeilOpLowering,
CopySignOpLowering,
CosOpLowering,
+ CoshOpLowering,
CountLeadingZerosOpLowering,
CountTrailingZerosOpLowering,
CtPopFOpLowering,
@@ -327,8 +332,11 @@ void mlir::populateMathToLLVMConversionPatterns(
RoundOpLowering,
RsqrtOpLowering,
SinOpLowering,
+ SinhOpLowering,
SqrtOpLowering,
- FTruncOpLowering
+ FTruncOpLowering,
+ TanOpLowering,
+ TanhOpLowering
>(converter);
// clang-format on
}
diff --git a/mlir/test/Conversion/MathToLLVM/math-to-llvm.mlir b/mlir/test/Conversion/MathToLLVM/math-to-llvm.mlir
index 56129dbd2788923..24eef9341bf74f2 100644
--- a/mlir/test/Conversion/MathToLLVM/math-to-llvm.mlir
+++ b/mlir/test/Conversion/MathToLLVM/math-to-llvm.mlir
@@ -161,11 +161,33 @@ func.func @rsqrt(%arg0 : f32) {
// -----
-// CHECK-LABEL: func @sine(
+// CHECK-LABEL: func @trigonometrics(
// CHECK-SAME: f32
-func.func @sine(%arg0 : f32) {
+func.func @trigonometrics(%arg0 : f32) {
// CHECK: llvm.intr.sin(%arg0) : (f32) -> f32
%0 = math.sin %arg0 : f32
+
+ // CHECK: llvm.intr.cos(%arg0) : (f32) -> f32
+ %1 = math.cos %arg0 : f32
+
+ // CHECK: llvm.intr.tan(%arg0) : (f32) -> f32
+ %2 = math.tan %arg0 : f32
+ func.return
+}
+
+// -----
+
+// CHECK-LABEL: func @hyperbolics(
+// CHECK-SAME: f32
+func.func @hyperbolics(%arg0 : f32) {
+ // CHECK: llvm.intr.sinh(%arg0) : (f32) -> f32
+ %0 = math.sinh %arg0 : f32
+
+ // CHECK: llvm.intr.cosh(%arg0) : (f32) -> f32
+ %1 = math.cosh %arg0 : f32
+
+ // CHECK: llvm.intr.tanh(%arg0) : (f32) -> f32
+ %2 = math.tanh %arg0 : f32
func.return
}
More information about the Mlir-commits
mailing list