Skip to content

Commit fdcb76f

Browse files
authored
[mlir][complex] Convert complex.tan to libm ctan call (#78250)
We can convert `complex.tan` op to [ctan/ctanf](https://sourceware.org/newlib/libm.html#ctan) function in libm in the complex to libm conversion.
1 parent 8dfc67d commit fdcb76f

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

mlir/lib/Conversion/ComplexToLibm/ComplexToLibm.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ void mlir::populateComplexToLibmConversionPatterns(RewritePatternSet &patterns,
117117
patterns.getContext(), "cabsf", "cabs", benefit);
118118
patterns.add<ScalarOpToLibmCall<complex::AngleOp, FloatTypeResolver>>(
119119
patterns.getContext(), "cargf", "carg", benefit);
120+
patterns.add<ScalarOpToLibmCall<complex::TanOp>>(patterns.getContext(),
121+
"ctanf", "ctan", benefit);
120122
}
121123

122124
namespace {
@@ -136,7 +138,8 @@ void ConvertComplexToLibmPass::runOnOperation() {
136138
target.addLegalDialect<func::FuncDialect>();
137139
target.addIllegalOp<complex::PowOp, complex::SqrtOp, complex::TanhOp,
138140
complex::CosOp, complex::SinOp, complex::ConjOp,
139-
complex::LogOp, complex::AbsOp, complex::AngleOp>();
141+
complex::LogOp, complex::AbsOp, complex::AngleOp,
142+
complex::TanOp>();
140143
if (failed(applyPartialConversion(module, target, std::move(patterns))))
141144
signalPassFailure();
142145
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
// CHECK-DAG: @cabs(complex<f64>) -> f64
1313
// CHECK-DAG: @carg(complex<f64>) -> f64
1414
// CHECK-DAG: @clog(complex<f64>) -> complex<f64>
15+
// CHECK-DAG: @ctanf(complex<f32>) -> complex<f32>
16+
// CHECK-DAG: @ctan(complex<f64>) -> complex<f64>
1517

1618
// CHECK-LABEL: func @cpow_caller
1719
// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
@@ -120,3 +122,15 @@ func.func @clog_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<
120122
// CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
121123
return %float_result, %double_result : complex<f32>, complex<f64>
122124
}
125+
126+
// CHECK-LABEL: func @ctan_caller
127+
// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>
128+
// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>
129+
func.func @ctan_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>) {
130+
// CHECK: %[[FLOAT_RESULT:.*]] = call @ctanf(%[[FLOAT]])
131+
%float_result = complex.tan %float : complex<f32>
132+
// CHECK: %[[DOUBLE_RESULT:.*]] = call @ctan(%[[DOUBLE]])
133+
%double_result = complex.tan %double : complex<f64>
134+
// CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]
135+
return %float_result, %double_result : complex<f32>, complex<f64>
136+
}

0 commit comments

Comments
 (0)