// RUN: mlir-opt %s -convert-complex-to-libm -canonicalize | FileCheck %s // CHECK-DAG: @cpowf(complex, complex) -> complex // CHECK-DAG: @cpow(complex, complex) -> complex // CHECK-DAG: @csqrtf(complex) -> complex // CHECK-DAG: @csqrt(complex) -> complex // CHECK-DAG: @ctanhf(complex) -> complex // CHECK-DAG: @ctanh(complex) -> complex // CHECK-DAG: @ccos(complex) -> complex // CHECK-DAG: @csin(complex) -> complex // CHECK-DAG: @conj(complex) -> complex // CHECK-DAG: @cabs(complex) -> f64 // CHECK-DAG: @carg(complex) -> f64 // CHECK-DAG: @clog(complex) -> complex // CHECK-DAG: @ctanf(complex) -> complex // CHECK-DAG: @ctan(complex) -> complex // CHECK-LABEL: func @cpow_caller // CHECK-SAME: %[[FLOAT:.*]]: complex // CHECK-SAME: %[[DOUBLE:.*]]: complex func.func @cpow_caller(%float: complex, %double: complex) -> (complex, complex) { // CHECK-DAG: %[[FLOAT_RESULT:.*]] = call @cpowf(%[[FLOAT]], %[[FLOAT]]) : (complex, complex) -> complex %float_result = complex.pow %float, %float : complex // CHECK-DAG: %[[DOUBLE_RESULT:.*]] = call @cpow(%[[DOUBLE]], %[[DOUBLE]]) : (complex, complex) -> complex %double_result = complex.pow %double, %double : complex // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]] return %float_result, %double_result : complex, complex } // CHECK-LABEL: func @csqrt_caller // CHECK-SAME: %[[FLOAT:.*]]: complex // CHECK-SAME: %[[DOUBLE:.*]]: complex func.func @csqrt_caller(%float: complex, %double: complex) -> (complex, complex) { // CHECK-DAG: %[[FLOAT_RESULT:.*]] = call @csqrtf(%[[FLOAT]]) : (complex) -> complex %float_result = complex.sqrt %float : complex // CHECK-DAG: %[[DOUBLE_RESULT:.*]] = call @csqrt(%[[DOUBLE]]) : (complex) -> complex %double_result = complex.sqrt %double : complex // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]] return %float_result, %double_result : complex, complex } // CHECK-LABEL: func @ctanh_caller // CHECK-SAME: %[[FLOAT:.*]]: complex // CHECK-SAME: %[[DOUBLE:.*]]: complex func.func @ctanh_caller(%float: complex, %double: complex) -> (complex, complex) { // CHECK-DAG: %[[FLOAT_RESULT:.*]] = call @ctanhf(%[[FLOAT]]) : (complex) -> complex %float_result = complex.tanh %float : complex // CHECK-DAG: %[[DOUBLE_RESULT:.*]] = call @ctanh(%[[DOUBLE]]) : (complex) -> complex %double_result = complex.tanh %double : complex // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]] return %float_result, %double_result : complex, complex } // CHECK-LABEL: func @ccos_caller // CHECK-SAME: %[[FLOAT:.*]]: complex // CHECK-SAME: %[[DOUBLE:.*]]: complex func.func @ccos_caller(%float: complex, %double: complex) -> (complex, complex) { // CHECK: %[[FLOAT_RESULT:.*]] = call @ccosf(%[[FLOAT]]) %float_result = complex.cos %float : complex // CHECK: %[[DOUBLE_RESULT:.*]] = call @ccos(%[[DOUBLE]]) %double_result = complex.cos %double : complex // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]] return %float_result, %double_result : complex, complex } // CHECK-LABEL: func @csin_caller // CHECK-SAME: %[[FLOAT:.*]]: complex // CHECK-SAME: %[[DOUBLE:.*]]: complex func.func @csin_caller(%float: complex, %double: complex) -> (complex, complex) { // CHECK: %[[FLOAT_RESULT:.*]] = call @csinf(%[[FLOAT]]) %float_result = complex.sin %float : complex // CHECK: %[[DOUBLE_RESULT:.*]] = call @csin(%[[DOUBLE]]) %double_result = complex.sin %double : complex // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]] return %float_result, %double_result : complex, complex } // CHECK-LABEL: func @conj_caller // CHECK-SAME: %[[FLOAT:.*]]: complex // CHECK-SAME: %[[DOUBLE:.*]]: complex func.func @conj_caller(%float: complex, %double: complex) -> (complex, complex) { // CHECK: %[[FLOAT_RESULT:.*]] = call @conjf(%[[FLOAT]]) %float_result = complex.conj %float : complex // CHECK: %[[DOUBLE_RESULT:.*]] = call @conj(%[[DOUBLE]]) %double_result = complex.conj %double : complex // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]] return %float_result, %double_result : complex, complex } // CHECK-LABEL: func @cabs_caller // CHECK-SAME: %[[FLOAT:.*]]: complex // CHECK-SAME: %[[DOUBLE:.*]]: complex func.func @cabs_caller(%float: complex, %double: complex) -> (f32, f64) { // CHECK: %[[FLOAT_RESULT:.*]] = call @cabsf(%[[FLOAT]]) %float_result = complex.abs %float : complex // CHECK: %[[DOUBLE_RESULT:.*]] = call @cabs(%[[DOUBLE]]) %double_result = complex.abs %double : complex // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]] return %float_result, %double_result : f32, f64 } // CHECK-LABEL: func @carg_caller // CHECK-SAME: %[[FLOAT:.*]]: complex // CHECK-SAME: %[[DOUBLE:.*]]: complex func.func @carg_caller(%float: complex, %double: complex) -> (f32, f64) { // CHECK: %[[FLOAT_RESULT:.*]] = call @cargf(%[[FLOAT]]) %float_result = complex.angle %float : complex // CHECK: %[[DOUBLE_RESULT:.*]] = call @carg(%[[DOUBLE]]) %double_result = complex.angle %double : complex // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]] return %float_result, %double_result : f32, f64 } // CHECK-LABEL: func @clog_caller // CHECK-SAME: %[[FLOAT:.*]]: complex // CHECK-SAME: %[[DOUBLE:.*]]: complex func.func @clog_caller(%float: complex, %double: complex) -> (complex, complex) { // CHECK: %[[FLOAT_RESULT:.*]] = call @clogf(%[[FLOAT]]) %float_result = complex.log %float : complex // CHECK: %[[DOUBLE_RESULT:.*]] = call @clog(%[[DOUBLE]]) %double_result = complex.log %double : complex // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]] return %float_result, %double_result : complex, complex } // CHECK-LABEL: func @ctan_caller // CHECK-SAME: %[[FLOAT:.*]]: complex // CHECK-SAME: %[[DOUBLE:.*]]: complex func.func @ctan_caller(%float: complex, %double: complex) -> (complex, complex) { // CHECK: %[[FLOAT_RESULT:.*]] = call @ctanf(%[[FLOAT]]) %float_result = complex.tan %float : complex // CHECK: %[[DOUBLE_RESULT:.*]] = call @ctan(%[[DOUBLE]]) %double_result = complex.tan %double : complex // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]] return %float_result, %double_result : complex, complex }