137 lines · plain
1// RUN: mlir-opt %s -convert-complex-to-libm -canonicalize | FileCheck %s2 3// CHECK-DAG: @cpowf(complex<f32>, complex<f32>) -> complex<f32>4// CHECK-DAG: @cpow(complex<f64>, complex<f64>) -> complex<f64>5// CHECK-DAG: @csqrtf(complex<f32>) -> complex<f32>6// CHECK-DAG: @csqrt(complex<f64>) -> complex<f64>7// CHECK-DAG: @ctanhf(complex<f32>) -> complex<f32>8// CHECK-DAG: @ctanh(complex<f64>) -> complex<f64>9// CHECK-DAG: @ccos(complex<f64>) -> complex<f64>10// CHECK-DAG: @csin(complex<f64>) -> complex<f64>11// CHECK-DAG: @conj(complex<f64>) -> complex<f64>12// CHECK-DAG: @cabs(complex<f64>) -> f6413// CHECK-DAG: @carg(complex<f64>) -> f6414// CHECK-DAG: @clog(complex<f64>) -> complex<f64>15// CHECK-DAG: @ctanf(complex<f32>) -> complex<f32>16// CHECK-DAG: @ctan(complex<f64>) -> complex<f64>17 18// CHECK-LABEL: func @cpow_caller19// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>20// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>21func.func @cpow_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>) {22 // CHECK-DAG: %[[FLOAT_RESULT:.*]] = call @cpowf(%[[FLOAT]], %[[FLOAT]]) : (complex<f32>, complex<f32>) -> complex<f32>23 %float_result = complex.pow %float, %float : complex<f32>24 // CHECK-DAG: %[[DOUBLE_RESULT:.*]] = call @cpow(%[[DOUBLE]], %[[DOUBLE]]) : (complex<f64>, complex<f64>) -> complex<f64>25 %double_result = complex.pow %double, %double : complex<f64>26 // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]27 return %float_result, %double_result : complex<f32>, complex<f64>28}29 30// CHECK-LABEL: func @csqrt_caller31// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>32// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>33func.func @csqrt_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>) {34 // CHECK-DAG: %[[FLOAT_RESULT:.*]] = call @csqrtf(%[[FLOAT]]) : (complex<f32>) -> complex<f32>35 %float_result = complex.sqrt %float : complex<f32>36 // CHECK-DAG: %[[DOUBLE_RESULT:.*]] = call @csqrt(%[[DOUBLE]]) : (complex<f64>) -> complex<f64>37 %double_result = complex.sqrt %double : complex<f64>38 // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]39 return %float_result, %double_result : complex<f32>, complex<f64>40}41 42// CHECK-LABEL: func @ctanh_caller43// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>44// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>45func.func @ctanh_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>) {46 // CHECK-DAG: %[[FLOAT_RESULT:.*]] = call @ctanhf(%[[FLOAT]]) : (complex<f32>) -> complex<f32>47 %float_result = complex.tanh %float : complex<f32>48 // CHECK-DAG: %[[DOUBLE_RESULT:.*]] = call @ctanh(%[[DOUBLE]]) : (complex<f64>) -> complex<f64>49 %double_result = complex.tanh %double : complex<f64>50 // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]51 return %float_result, %double_result : complex<f32>, complex<f64>52}53 54// CHECK-LABEL: func @ccos_caller55// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>56// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>57func.func @ccos_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>) {58 // CHECK: %[[FLOAT_RESULT:.*]] = call @ccosf(%[[FLOAT]])59 %float_result = complex.cos %float : complex<f32>60 // CHECK: %[[DOUBLE_RESULT:.*]] = call @ccos(%[[DOUBLE]])61 %double_result = complex.cos %double : complex<f64>62 // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]63 return %float_result, %double_result : complex<f32>, complex<f64>64}65 66// CHECK-LABEL: func @csin_caller67// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>68// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>69func.func @csin_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>) {70 // CHECK: %[[FLOAT_RESULT:.*]] = call @csinf(%[[FLOAT]])71 %float_result = complex.sin %float : complex<f32>72 // CHECK: %[[DOUBLE_RESULT:.*]] = call @csin(%[[DOUBLE]])73 %double_result = complex.sin %double : complex<f64>74 // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]75 return %float_result, %double_result : complex<f32>, complex<f64>76}77 78// CHECK-LABEL: func @conj_caller79// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>80// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>81func.func @conj_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>) {82 // CHECK: %[[FLOAT_RESULT:.*]] = call @conjf(%[[FLOAT]])83 %float_result = complex.conj %float : complex<f32>84 // CHECK: %[[DOUBLE_RESULT:.*]] = call @conj(%[[DOUBLE]])85 %double_result = complex.conj %double : complex<f64>86 // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]87 return %float_result, %double_result : complex<f32>, complex<f64>88}89 90// CHECK-LABEL: func @cabs_caller91// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>92// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>93func.func @cabs_caller(%float: complex<f32>, %double: complex<f64>) -> (f32, f64) {94 // CHECK: %[[FLOAT_RESULT:.*]] = call @cabsf(%[[FLOAT]])95 %float_result = complex.abs %float : complex<f32>96 // CHECK: %[[DOUBLE_RESULT:.*]] = call @cabs(%[[DOUBLE]])97 %double_result = complex.abs %double : complex<f64>98 // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]99 return %float_result, %double_result : f32, f64100}101 102// CHECK-LABEL: func @carg_caller103// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>104// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>105func.func @carg_caller(%float: complex<f32>, %double: complex<f64>) -> (f32, f64) {106 // CHECK: %[[FLOAT_RESULT:.*]] = call @cargf(%[[FLOAT]])107 %float_result = complex.angle %float : complex<f32>108 // CHECK: %[[DOUBLE_RESULT:.*]] = call @carg(%[[DOUBLE]])109 %double_result = complex.angle %double : complex<f64>110 // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]111 return %float_result, %double_result : f32, f64112}113 114// CHECK-LABEL: func @clog_caller115// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>116// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>117func.func @clog_caller(%float: complex<f32>, %double: complex<f64>) -> (complex<f32>, complex<f64>) {118 // CHECK: %[[FLOAT_RESULT:.*]] = call @clogf(%[[FLOAT]])119 %float_result = complex.log %float : complex<f32>120 // CHECK: %[[DOUBLE_RESULT:.*]] = call @clog(%[[DOUBLE]])121 %double_result = complex.log %double : complex<f64>122 // CHECK: return %[[FLOAT_RESULT]], %[[DOUBLE_RESULT]]123 return %float_result, %double_result : complex<f32>, complex<f64>124}125 126// CHECK-LABEL: func @ctan_caller127// CHECK-SAME: %[[FLOAT:.*]]: complex<f32>128// CHECK-SAME: %[[DOUBLE:.*]]: complex<f64>129func.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}137