[mlir][complex] Lower complex.angle to libm
authorlewuathe <lewuathe@me.com>
Fri, 8 Jul 2022 02:30:26 +0000 (04:30 +0200)
committerAlexander Belyaev <pifon@google.com>
Fri, 8 Jul 2022 02:39:23 +0000 (04:39 +0200)
complex.angle corresponds to arg function in libm. We can lower complex.angle to arg and argf.

Reviewed By: pifon2a

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

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

index 802f171..716b7a8 100644 (file)
@@ -109,6 +109,8 @@ void mlir::populateComplexToLibmConversionPatterns(RewritePatternSet &patterns,
                                                     "conjf", "conj", benefit);
   patterns.add<ScalarOpToLibmCall<complex::AbsOp, FloatTypeResolver>>(
       patterns.getContext(), "cabsf", "cabs", benefit);
+  patterns.add<ScalarOpToLibmCall<complex::AngleOp, FloatTypeResolver>>(
+      patterns.getContext(), "cargf", "carg", benefit);
 }
 
 namespace {
@@ -127,7 +129,7 @@ void ConvertComplexToLibmPass::runOnOperation() {
   ConversionTarget target(getContext());
   target.addLegalDialect<func::FuncDialect>();
   target.addIllegalOp<complex::PowOp, complex::SqrtOp, complex::TanhOp,
-                      complex::AbsOp>();
+                      complex::AbsOp, complex::AngleOp>();
   if (failed(applyPartialConversion(module, target, std::move(patterns))))
     signalPassFailure();
 }
index ad6e5a2..0b574b2 100644 (file)
@@ -93,4 +93,16 @@ func.func @cabs_caller(%float: complex<f32>, %double: complex<f64>) -> (f32, f64
   %double_result = complex.abs %double : complex<f64>
   // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
   return %float_result, %double_result : f32, f64
+}
+
+// CHECK-LABEL: func @carg_caller
+// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
+// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
+func.func @carg_caller(%float: complex<f32>, %double: complex<f64>) -> (f32, f64)  {
+  // CHECK: %[[FLOAT_RESULT:.*]] = call @cargf(%[[FLOAT]])
+  %float_result = complex.angle %float : complex<f32>
+  // CHECK: %[[DOUBLE_RESULT:.*]] = call @carg(%[[DOUBLE]])
+  %double_result = complex.angle %double : complex<f64>
+  // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
+  return %float_result, %double_result : f32, f64
 }
\ No newline at end of file