[mlir][complex] Lower complex.sin/cos to libm
authorlewuathe <lewuathe@me.com>
Thu, 2 Jun 2022 08:38:20 +0000 (10:38 +0200)
committerAlexander Belyaev <pifon@google.com>
Thu, 2 Jun 2022 08:39:00 +0000 (10:39 +0200)
Lower sin/cos operation in complex dialect to libm as a baseline. This follows up to https://reviews.llvm.org/D125550.

Reviewed By: pifon2a

Differential Revision: https://reviews.llvm.org/D126755

mlir/lib/Conversion/ComplexToLibm/ComplexToLibm.cpp
mlir/test/Conversion/ComplexToLibm/convert-to-libm.mlir

index 456c74d..739603a 100644 (file)
@@ -73,6 +73,10 @@ void mlir::populateComplexToLibmConversionPatterns(RewritePatternSet &patterns,
                                                     "csqrtf", "csqrt", benefit);
   patterns.add<ScalarOpToLibmCall<complex::TanhOp>>(patterns.getContext(),
                                                     "ctanhf", "ctanh", benefit);
+  patterns.add<ScalarOpToLibmCall<complex::CosOp>>(patterns.getContext(),
+                                                   "ccosf", "ccos", benefit);
+  patterns.add<ScalarOpToLibmCall<complex::SinOp>>(patterns.getContext(),
+                                                   "csinf", "csin", benefit);
 }
 
 namespace {
index ca21f50..48655bb 100644 (file)
@@ -6,6 +6,8 @@
 // CHECK-DAG: @csqrt(complex<f64>) -> complex<f64>
 // CHECK-DAG: @ctanhf(complex<f32>) -> complex<f32>
 // CHECK-DAG: @ctanh(complex<f64>) -> complex<f64>
+// CHECK-DAG: @ccos(complex<f64>) -> complex<f64>
+// CHECK-DAG: @csin(complex<f64>) -> complex<f64>
 
 // CHECK-LABEL: func @cpow_caller
 // CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
@@ -42,3 +44,27 @@ func.func @ctanh_caller(%float: complex<f32>, %double: complex<f64>) -> (complex
   // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
   return %float_result, %double_result : complex<f32>, complex<f64>
 }
+
+// CHECK-LABEL: func @ccos_caller
+// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
+// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
+func.func @ccos_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>)  {
+  // CHECK: %[[FLOAT_RESULT:.*]] = call @ccosf(%[[FLOAT]])
+  %float_result = complex.cos %float : complex<f32>
+  // CHECK: %[[DOUBLE_RESULT:.*]] = call @ccos(%[[DOUBLE]])
+  %double_result = complex.cos %double : complex<f64>
+  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
+  return %float_result, %double_result : complex<f32>, complex<f64>
+}
+
+// CHECK-LABEL: func @csin_caller
+// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
+// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
+func.func @csin_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>)  {
+  // CHECK: %[[FLOAT_RESULT:.*]] = call @csinf(%[[FLOAT]])
+  %float_result = complex.sin %float : complex<f32>
+  // CHECK: %[[DOUBLE_RESULT:.*]] = call @csin(%[[DOUBLE]])
+  %double_result = complex.sin %double : complex<f64>
+  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
+  return %float_result, %double_result : complex<f32>, complex<f64>
+}
\ No newline at end of file