mirror of
https://github.com/intel/llvm.git
synced 2026-01-24 08:30:34 +08:00
[mlir] Add math to LLVM lowering support for missing trigonometric & hyperbolic ops (#125753)
The patch adds support for math -> LLVM dialect lowering for TanOp, Sinh, Cosh, Tanh
This commit is contained in:
@@ -1803,10 +1803,10 @@ func.func private @sinh(f64) -> f64
|
||||
//--- tanh_fast.fir
|
||||
// RUN: fir-opt %t/tanh_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tanh_fast.fir
|
||||
// CHECK: @_QPtest_real4
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.tanh({{%[A-Za-z0-9._]+}}) : (f32) -> f32
|
||||
|
||||
// CHECK: @_QPtest_real8
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.tanh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
|
||||
|
||||
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
|
||||
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
|
||||
@@ -1828,10 +1828,10 @@ func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
|
||||
//--- tanh_relaxed.fir
|
||||
// RUN: fir-opt %t/tanh_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tanh_relaxed.fir
|
||||
// CHECK: @_QPtest_real4
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanhf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.tanh({{%[A-Za-z0-9._]+}}) : (f32) -> f32
|
||||
|
||||
// CHECK: @_QPtest_real8
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.tanh({{%[A-Za-z0-9._]+}}) : (f64) -> f64
|
||||
|
||||
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
|
||||
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
|
||||
@@ -1880,10 +1880,10 @@ func.func private @tanh(f64) -> f64
|
||||
//--- tan_fast.fir
|
||||
// RUN: fir-opt %t/tan_fast.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tan_fast.fir
|
||||
// CHECK: @_QPtest_real4
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.tan({{%[A-Za-z0-9._]+}}) : (f32) -> f32
|
||||
|
||||
// CHECK: @_QPtest_real8
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.tan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
|
||||
|
||||
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
|
||||
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
|
||||
@@ -1905,10 +1905,10 @@ func.func @_QPtest_real8(%arg0: !fir.ref<f64> {fir.bindc_name = "x"}) -> f64 {
|
||||
//--- tan_relaxed.fir
|
||||
// RUN: fir-opt %t/tan_relaxed.fir --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" | FileCheck %t/tan_relaxed.fir
|
||||
// CHECK: @_QPtest_real4
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tanf({{%[A-Za-z0-9._]+}}) : (f32) -> f32
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.tan({{%[A-Za-z0-9._]+}}) : (f32) -> f32
|
||||
|
||||
// CHECK: @_QPtest_real8
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.call @tan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
|
||||
// CHECK: {{%[A-Za-z0-9._]+}} = llvm.intr.tan({{%[A-Za-z0-9._]+}}) : (f64) -> f64
|
||||
|
||||
func.func @_QPtest_real4(%arg0: !fir.ref<f32> {fir.bindc_name = "x"}) -> f32 {
|
||||
%0 = fir.alloca f32 {bindc_name = "test_real4", uniq_name = "_QFtest_real4Etest_real4"}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -161,11 +161,33 @@ func.func @rsqrt(%arg0 : f32) {
|
||||
|
||||
// -----
|
||||
|
||||
// CHECK-LABEL: func @sine(
|
||||
// CHECK-SAME: f32
|
||||
func.func @sine(%arg0 : f32) {
|
||||
// CHECK: llvm.intr.sin(%arg0) : (f32) -> f32
|
||||
// CHECK-LABEL: func @trigonometrics
|
||||
// CHECK-SAME: [[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: [[ARG0:%.+]]: 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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user