@@ -679,14 +679,42 @@ func.func @complex_tanh(%arg: complex<f32>) -> complex<f32> {
679679}
680680// CHECK: %[[REAL:.*]] = complex.re %[[ARG]] : complex<f32>
681681// CHECK: %[[IMAG:.*]] = complex.im %[[ARG]] : complex<f32>
682- // CHECK: %[[TANH_A:.*]] = math.tanh %[[REAL]] : f32
683- // CHECK: %[[COS_B:.*]] = math.cos %[[IMAG]] : f32
684- // CHECK: %[[SIN_B:.*]] = math.sin %[[IMAG]] : f32
685- // CHECK: %[[TAN_B:.*]] = arith.divf %[[SIN_B]], %[[COS_B]] : f32
686- // CHECK: %[[NUM:.*]] = complex.create %[[TANH_A]], %[[TAN_B]] : complex<f32>
687- // CHECK: %[[ONE:.*]] = arith.constant 1.000000e+00 : f32
688- // CHECK: %[[MUL:.*]] = arith.mulf %[[TANH_A]], %[[TAN_B]] : f32
689- // CHECK: %[[DENOM:.*]] = complex.create %[[ONE]], %[[MUL]] : complex<f32>
682+ // CHECK: %[[INF:.*]] = arith.constant 0x7F800000 : f32
683+ // CHECK: %[[NEG_ONE:.*]] = arith.constant -1.000000e+00 : f32
684+ // CHECK: %[[FOUR:.*]] = arith.constant 4.000000e+00 : f32
685+ // CHECK: %[[TWO_REAL:.*]] = arith.addf %[[REAL]], %[[REAL]] : f32
686+ // CHECK: %[[NEG_TWO_REAL:.*]] = arith.mulf %[[NEG_ONE]], %[[TWO_REAL]] : f32
687+ // CHECK: %[[EXPM1:.*]] = math.expm1 %[[TWO_REAL]] : f32
688+ // CHECK: %[[EXPM1_2:.*]] = math.expm1 %[[NEG_TWO_REAL]] : f32
689+ // CHECK: %[[REAL_NUM:.*]] = arith.subf %[[EXPM1]], %[[EXPM1_2]] : f32
690+ // CHECK: %[[COS:.*]] = math.cos %[[IMAG]] : f32
691+ // CHECK: %[[COS_SQ:.*]] = arith.mulf %[[COS]], %[[COS]] : f32
692+ // CHECK: %[[FOUR_COS_SQ:.*]] = arith.mulf %[[COS_SQ]], %[[FOUR]] : f32
693+ // CHECK: %[[SIN:.*]] = math.sin %[[IMAG]] : f32
694+ // CHECK: %[[MUL:.*]] = arith.mulf %[[COS]], %[[SIN]] : f32
695+ // CHECK: %[[IMAG_NUM:.*]] = arith.mulf %[[FOUR]], %[[MUL]] : f32
696+ // CHECK: %[[ADD:.*]] = arith.addf %[[EXPM1]], %[[EXPM1_2]] : f32
697+ // CHECK: %[[DENOM:.*]] = arith.addf %[[ADD]], %[[FOUR_COS_SQ]] : f32
698+ // CHECK: %[[IS_INF:.*]] = arith.cmpf oeq, %[[ADD]], %[[INF]] : f32
699+ // CHECK: %[[LIMIT:.*]] = math.copysign %[[NEG_ONE]], %[[REAL]] : f32
700+ // CHECK: %[[RESULT_REAL:.*]] = arith.divf %[[REAL_NUM]], %[[DENOM]] : f32
701+ // CHECK: %[[RESULT_REAL2:.*]] = arith.select %[[IS_INF]], %[[LIMIT]], %[[RESULT_REAL]] : f32
702+ // CHECK: %[[RESULT_IMAG:.*]] = arith.divf %[[IMAG_NUM]], %[[DENOM]] : f32
703+ // CHECK: %[[ABS_REAL:.*]] = math.absf %[[REAL]] : f32
704+ // CHECK: %[[ZERO:.*]] = arith.constant 0.000000e+00 : f32
705+ // CHECK: %[[NAN:.*]] = arith.constant 0x7FC00000 : f32
706+ // CHECK: %[[ABS_REAL_INF:.*]] = arith.cmpf oeq, %[[ABS_REAL]], %[[INF]] : f32
707+ // CHECK: %[[IMAG_ZERO:.*]] = arith.cmpf oeq, %[[IMAG]], %[[ZERO]] : f32
708+ // CHECK: %true = arith.constant true
709+ // CHECK: %[[ABS_REAL_NOT_INF:.*]] = arith.xori %[[ABS_REAL_INF]], %true : i1
710+ // CHECK: %[[IMAG_IS_NAN:.*]] = arith.cmpf uno, %[[IMAG_NUM]], %[[IMAG_NUM]] : f32
711+ // CHECK: %[[REAL_IS_NAN:.*]] = arith.andi %[[IMAG_IS_NAN]], %[[ABS_REAL_NOT_INF]] : i1
712+ // CHECK: %[[AND:.*]] = arith.andi %[[ABS_REAL_INF]], %[[IMAG_IS_NAN]] : i1
713+ // CHECK: %[[IMAG_IS_NAN2:.*]] = arith.ori %[[IMAG_ZERO]], %[[AND]] : i1
714+ // CHECK: %[[RESULT_REAL3:.*]] = arith.select %[[REAL_IS_NAN]], %[[NAN]], %[[RESULT_REAL2]] : f32
715+ // CHECK: %[[RESULT_IMAG2:.*]] = arith.select %[[IMAG_IS_NAN2]], %[[ZERO]], %[[RESULT_IMAG]] : f32
716+ // CHECK: %[[RESULT:.*]] = complex.create %[[RESULT_REAL3]], %[[RESULT_IMAG2]] : complex<f32>
717+ // CHECK: return %[[RESULT]] : complex<f32>
690718
691719// -----
692720
@@ -2100,7 +2128,6 @@ func.func @complex_tan_with_fmf(%arg: complex<f32>) -> complex<f32> {
21002128// CHECK: %[[RESULT:.*]] = complex.create %[[RESULT_REAL_WITH_SPECIAL_CASES]], %[[RESULT_IMAG_WITH_SPECIAL_CASES]] : complex<f32>
21012129// CHECK: return %[[RESULT]] : complex<f32>
21022130
2103-
21042131// -----
21052132
21062133// CHECK-LABEL: func @complex_tanh_with_fmf
@@ -2109,13 +2136,54 @@ func.func @complex_tanh_with_fmf(%arg: complex<f32>) -> complex<f32> {
21092136 %tanh = complex.tanh %arg fastmath <nnan ,contract > : complex <f32 >
21102137 return %tanh : complex <f32 >
21112138}
2139+
21122140// CHECK: %[[REAL:.*]] = complex.re %[[ARG]] : complex<f32>
21132141// CHECK: %[[IMAG:.*]] = complex.im %[[ARG]] : complex<f32>
2114- // CHECK: %[[TANH_A:.*]] = math.tanh %[[REAL]] fastmath<nnan,contract> : f32
2115- // CHECK: %[[COS_B:.*]] = math.cos %[[IMAG]] fastmath<nnan,contract> : f32
2116- // CHECK: %[[SIN_B:.*]] = math.sin %[[IMAG]] fastmath<nnan,contract> : f32
2117- // CHECK: %[[TAN_B:.*]] = arith.divf %[[SIN_B]], %[[COS_B]] fastmath<nnan,contract> : f32
2118- // CHECK: %[[NUM:.*]] = complex.create %[[TANH_A]], %[[TAN_B]] : complex<f32>
2119- // CHECK: %[[ONE:.*]] = arith.constant 1.000000e+00 : f32
2120- // CHECK: %[[MUL:.*]] = arith.mulf %[[TANH_A]], %[[TAN_B]] fastmath<nnan,contract> : f32
2121- // CHECK: %[[DENOM:.*]] = complex.create %[[ONE]], %[[MUL]] : complex<f32>
2142+ // CHECK: %[[INF:.*]] = arith.constant 0x7F800000 : f32
2143+ // CHECK: %[[NEG_ONE:.*]] = arith.constant -1.000000e+00 : f32
2144+ // CHECK: %[[FOUR:.*]] = arith.constant 4.000000e+00 : f32
2145+ // CHECK: %[[TWO_REAL:.*]] = arith.addf %[[REAL]], %[[REAL]] fastmath<nnan,contract> : f32
2146+ // CHECK: %[[NEG_TWO_REAL:.*]] = arith.mulf %[[NEG_ONE]], %[[TWO_REAL]] fastmath<nnan,contract> : f32
2147+ // CHECK: %[[EXPM1:.*]] = math.expm1 %[[TWO_REAL]] fastmath<nnan,contract> : f32
2148+ // CHECK: %[[EXPM1_2:.*]] = math.expm1 %[[NEG_TWO_REAL]] fastmath<nnan,contract> : f32
2149+ // CHECK: %[[REAL_NUM:.*]] = arith.subf %[[EXPM1]], %[[EXPM1_2]] fastmath<nnan,contract> : f32
2150+ // CHECK: %[[COS:.*]] = math.cos %[[IMAG]] fastmath<nnan,contract> : f32
2151+ // CHECK: %[[COS_SQ:.*]] = arith.mulf %[[COS]], %[[COS]] fastmath<nnan,contract> : f32
2152+ // CHECK: %[[FOUR_COS_SQ:.*]] = arith.mulf %[[COS_SQ]], %[[FOUR]] fastmath<nnan,contract> : f32
2153+ // CHECK: %[[SIN:.*]] = math.sin %[[IMAG]] fastmath<nnan,contract> : f32
2154+ // CHECK: %[[MUL:.*]] = arith.mulf %[[COS]], %[[SIN]] fastmath<nnan,contract> : f32
2155+ // CHECK: %[[IMAG_NUM:.*]] = arith.mulf %[[FOUR]], %[[MUL]] fastmath<nnan,contract> : f32
2156+ // CHECK: %[[ADD:.*]] = arith.addf %[[EXPM1]], %[[EXPM1_2]] fastmath<nnan,contract> : f32
2157+ // CHECK: %[[DENOM:.*]] = arith.addf %[[ADD]], %[[FOUR_COS_SQ]] fastmath<nnan,contract> : f32
2158+ // CHECK: %[[IS_INF:.*]] = arith.cmpf oeq, %[[ADD]], %[[INF]] fastmath<nnan,contract> : f32
2159+ // CHECK: %[[LIMIT:.*]] = math.copysign %[[NEG_ONE]], %[[REAL]] fastmath<nnan,contract> : f32
2160+ // CHECK: %[[RESULT_REAL:.*]] = arith.divf %[[REAL_NUM]], %[[DENOM]] fastmath<nnan,contract> : f32
2161+ // CHECK: %[[RESULT_REAL2:.*]] = arith.select %[[IS_INF]], %[[LIMIT]], %[[RESULT_REAL]] : f32
2162+ // CHECK: %[[RESULT_IMAG:.*]] = arith.divf %[[IMAG_NUM]], %[[DENOM]] fastmath<nnan,contract> : f32
2163+ // CHECK: %[[ABS_REAL:.*]] = math.absf %[[REAL]] fastmath<nnan,contract> : f32
2164+ // CHECK: %[[ZERO:.*]] = arith.constant 0.000000e+00 : f32
2165+ // CHECK: %[[NAN:.*]] = arith.constant 0x7FC00000 : f32
2166+ // CHECK: %[[ABS_REAL_INF:.*]] = arith.cmpf oeq, %[[ABS_REAL]], %[[INF]] fastmath<nnan,contract> : f32
2167+ // CHECK: %[[IMAG_ZERO:.*]] = arith.cmpf oeq, %[[IMAG]], %[[ZERO]] fastmath<nnan,contract> : f32
2168+ // CHECK: %true = arith.constant true
2169+ // CHECK: %[[ABS_REAL_NOT_INF:.*]] = arith.xori %[[ABS_REAL_INF]], %true : i1
2170+ // CHECK: %[[IMAG_IS_NAN:.*]] = arith.cmpf uno, %[[IMAG_NUM]], %[[IMAG_NUM]] fastmath<nnan,contract> : f32
2171+ // CHECK: %[[REAL_IS_NAN:.*]] = arith.andi %[[IMAG_IS_NAN]], %[[ABS_REAL_NOT_INF]] : i1
2172+ // CHECK: %[[AND:.*]] = arith.andi %[[ABS_REAL_INF]], %[[IMAG_IS_NAN]] : i1
2173+ // CHECK: %[[IMAG_IS_NAN2:.*]] = arith.ori %[[IMAG_ZERO]], %[[AND]] : i1
2174+ // CHECK: %[[RESULT_REAL3:.*]] = arith.select %[[REAL_IS_NAN]], %[[NAN]], %[[RESULT_REAL2]] : f32
2175+ // CHECK: %[[RESULT_IMAG2:.*]] = arith.select %[[IMAG_IS_NAN2]], %[[ZERO]], %[[RESULT_IMAG]] : f32
2176+ // CHECK: %[[RESULT:.*]] = complex.create %[[RESULT_REAL3]], %[[RESULT_IMAG2]] : complex<f32>
2177+ // CHECK: return %[[RESULT]] : complex<f32>
2178+
2179+ // -----
2180+
2181+ // CHECK-LABEL: func @complex_tanh_nnan_ninf
2182+ // CHECK-SAME: %[[ARG:.*]]: complex<f32>
2183+ func.func @complex_tanh_nnan_ninf (%arg: complex <f32 >) -> complex <f32 > {
2184+ %tanh = complex.tanh %arg fastmath <nnan ,ninf > : complex <f32 >
2185+ return %tanh : complex <f32 >
2186+ }
2187+
2188+ // CHECK-COUNT-1: arith.select
2189+ // CHECK-NOT: arith.select
0 commit comments