@@ -708,11 +708,60 @@ func.func @complex_tanh(%arg: complex<f32>) -> complex<f32> {
708708// -----
709709
710710// CHECK-LABEL: func @complex_sqrt
711+ // CHECK-SAME: %[[ARG:.*]]: complex<f32>
711712func.func @complex_sqrt (%arg: complex <f32 >) -> complex <f32 > {
712713 %sqrt = complex.sqrt %arg : complex <f32 >
713714 return %sqrt : complex <f32 >
714715}
715716
717+ // CHECK: %[[CST:.*]] = arith.constant 0.000000e+00 : f32
718+ // CHECK: %[[VAR0:.*]] = complex.re %[[ARG]] : complex<f32>
719+ // CHECK: %[[VAR1:.*]] = complex.im %[[ARG]] : complex<f32>
720+ // CHECK: %[[VAR2:.*]] = math.absf %[[VAR0]] : f32
721+ // CHECK: %[[CST0:.*]] = arith.constant 0.000000e+00 : f32
722+ // CHECK: %[[CST1:.*]] = arith.constant 1.000000e+00 : f32
723+ // CHECK: %[[VAR3:.*]] = complex.re %[[ARG]] : complex<f32>
724+ // CHECK: %[[VAR4:.*]] = complex.im %[[ARG]] : complex<f32>
725+ // CHECK: %[[VAR5:.*]] = arith.cmpf oeq, %[[VAR3]], %[[CST0]] : f32
726+ // CHECK: %[[VAR6:.*]] = arith.cmpf oeq, %[[VAR4]], %[[CST0]] : f32
727+ // CHECK: %[[VAR7:.*]] = arith.divf %[[VAR4]], %[[VAR3]] : f32
728+ // CHECK: %[[VAR8:.*]] = arith.mulf %[[VAR7]], %[[VAR7]] : f32
729+ // CHECK: %[[VAR9:.*]] = arith.addf %[[VAR8]], %[[CST1]] : f32
730+ // CHECK: %[[VAR10:.*]] = math.sqrt %[[VAR9]] : f32
731+ // CHECK: %[[VAR11:.*]] = math.absf %[[VAR3]] : f32
732+ // CHECK: %[[VAR12:.*]] = arith.mulf %[[VAR10]], %[[VAR11]] : f32
733+ // CHECK: %[[VAR13:.*]] = arith.divf %[[VAR3]], %[[VAR4]] : f32
734+ // CHECK: %[[VAR14:.*]] = arith.mulf %[[VAR13]], %[[VAR13]] : f32
735+ // CHECK: %[[VAR15:.*]] = arith.addf %[[VAR14]], %[[CST1]] : f32
736+ // CHECK: %[[VAR16:.*]] = math.sqrt %[[VAR15]] : f32
737+ // CHECK: %[[VAR17:.*]] = math.absf %[[VAR4]] : f32
738+ // CHECK: %[[VAR18:.*]] = arith.mulf %[[VAR16]], %[[VAR17]] : f32
739+ // CHECK: %[[VAR19:.*]] = arith.cmpf ogt, %[[VAR3]], %[[VAR4]] : f32
740+ // CHECK: %[[VAR20:.*]] = arith.select %[[VAR19]], %[[VAR12]], %[[VAR18]] : f32
741+ // CHECK: %[[VAR21:.*]] = arith.select %[[VAR6]], %[[VAR11]], %[[VAR20]] : f32
742+ // CHECK: %[[VAR22:.*]] = arith.select %[[VAR5]], %[[VAR17]], %[[VAR21]] : f32
743+ // CHECK: %[[VAR23:.*]] = arith.addf %[[VAR2]], %[[VAR22]] : f32
744+ // CHECK: %[[CST2:.*]] = arith.constant 5.000000e-01 : f32
745+ // CHECK: %[[VAR24:.*]] = arith.mulf %[[VAR23]], %[[CST2]] : f32
746+ // CHECK: %[[VAR25:.*]] = math.sqrt %[[VAR24]] : f32
747+ // CHECK: %[[VAR26:.*]] = arith.cmpf olt, %[[VAR0]], %cst : f32
748+ // CHECK: %[[VAR27:.*]] = arith.cmpf olt, %[[VAR1]], %cst : f32
749+ // CHECK: %[[VAR28:.*]] = arith.addf %[[VAR25]], %[[VAR25]] : f32
750+ // CHECK: %[[VAR29:.*]] = arith.divf %[[VAR1]], %[[VAR28]] : f32
751+ // CHECK: %[[VAR30:.*]] = arith.negf %[[VAR25]] : f32
752+ // CHECK: %[[VAR31:.*]] = arith.select %[[VAR27]], %[[VAR30]], %[[VAR25]] : f32
753+ // CHECK: %[[VAR32:.*]] = arith.select %[[VAR26]], %[[VAR31]], %[[VAR29]] : f32
754+ // CHECK: %[[VAR33:.*]] = arith.addf %[[VAR32]], %[[VAR32]] : f32
755+ // CHECK: %[[VAR34:.*]] = arith.divf %[[VAR1]], %[[VAR33]] : f32
756+ // CHECK: %[[VAR35:.*]] = arith.select %[[VAR26]], %[[VAR34]], %[[VAR25]] : f32
757+ // CHECK: %[[VAR36:.*]] = arith.cmpf oeq, %[[VAR0]], %cst : f32
758+ // CHECK: %[[VAR37:.*]] = arith.cmpf oeq, %[[VAR1]], %cst : f32
759+ // CHECK: %[[VAR38:.*]] = arith.andi %[[VAR36]], %[[VAR37]] : i1
760+ // CHECK: %[[VAR39:.*]] = arith.select %[[VAR38]], %cst, %[[VAR35]] : f32
761+ // CHECK: %[[VAR40:.*]] = arith.select %[[VAR38]], %cst, %[[VAR32]] : f32
762+ // CHECK: %[[VAR41:.*]] = complex.create %[[VAR39]], %[[VAR40]] : complex<f32>
763+ // CHECK: return %[[VAR41]] : complex<f32>
764+
716765// -----
717766
718767// CHECK-LABEL: func @complex_conj
@@ -1254,42 +1303,42 @@ func.func @complex_atan2_with_fmf(%lhs: complex<f32>,
12541303// CHECK: %[[CST_6:.*]] = arith.constant 0.000000e+00 : f32
12551304// CHECK: %[[VAR187:.*]] = complex.re %[[VAR186]] : complex<f32>
12561305// CHECK: %[[VAR188:.*]] = complex.im %[[VAR186]] : complex<f32>
1257- // CHECK: %[[VAR189:.*]] = math.absf %[[VAR187]] : f32
1306+ // CHECK: %[[VAR189:.*]] = math.absf %[[VAR187]] fastmath<nnan,contract> : f32
12581307// CHECK: %[[CST_7:.*]] = arith.constant 0.000000e+00 : f32
12591308// CHECK: %[[CST_8:.*]] = arith.constant 1.000000e+00 : f32
12601309// CHECK: %[[VAR190:.*]] = complex.re %[[VAR186]] : complex<f32>
12611310// CHECK: %[[VAR191:.*]] = complex.im %[[VAR186]] : complex<f32>
12621311// CHECK: %[[VAR192:.*]] = arith.cmpf oeq, %[[VAR190]], %[[CST_7]] : f32
12631312// CHECK: %[[VAR193:.*]] = arith.cmpf oeq, %[[VAR191]], %[[CST_7]] : f32
1264- // CHECK: %[[VAR194:.*]] = arith.divf %[[VAR191]], %[[VAR190]] : f32
1265- // CHECK: %[[VAR195:.*]] = arith.mulf %[[VAR194]], %[[VAR194]] : f32
1266- // CHECK: %[[VAR196:.*]] = arith.addf %[[VAR195]], %[[CST_8]] : f32
1267- // CHECK: %[[VAR197:.*]] = math.sqrt %[[VAR196]] : f32
1268- // CHECK: %[[VAR198:.*]] = math.absf %[[VAR190]] : f32
1269- // CHECK: %[[VAR199:.*]] = arith.mulf %[[VAR197]], %[[VAR198]] : f32
1270- // CHECK: %[[VAR200:.*]] = arith.divf %[[VAR190]], %[[VAR191]] : f32
1271- // CHECK: %[[VAR201:.*]] = arith.mulf %[[VAR200]], %[[VAR200]] : f32
1272- // CHECK: %[[VAR202:.*]] = arith.addf %[[VAR201]], %[[CST_8]] : f32
1273- // CHECK: %[[VAR203:.*]] = math.sqrt %[[VAR202]] : f32
1274- // CHECK: %[[VAR204:.*]] = math.absf %[[VAR191]] : f32
1275- // CHECK: %[[VAR205:.*]] = arith.mulf %[[VAR203]], %[[VAR204]] : f32
1313+ // CHECK: %[[VAR194:.*]] = arith.divf %[[VAR191]], %[[VAR190]] fastmath<nnan,contract> : f32
1314+ // CHECK: %[[VAR195:.*]] = arith.mulf %[[VAR194]], %[[VAR194]] fastmath<nnan,contract> : f32
1315+ // CHECK: %[[VAR196:.*]] = arith.addf %[[VAR195]], %[[CST_8]] fastmath<nnan,contract> : f32
1316+ // CHECK: %[[VAR197:.*]] = math.sqrt %[[VAR196]] fastmath<nnan,contract> : f32
1317+ // CHECK: %[[VAR198:.*]] = math.absf %[[VAR190]] fastmath<nnan,contract> : f32
1318+ // CHECK: %[[VAR199:.*]] = arith.mulf %[[VAR197]], %[[VAR198]] fastmath<nnan,contract> : f32
1319+ // CHECK: %[[VAR200:.*]] = arith.divf %[[VAR190]], %[[VAR191]] fastmath<nnan,contract> : f32
1320+ // CHECK: %[[VAR201:.*]] = arith.mulf %[[VAR200]], %[[VAR200]] fastmath<nnan,contract> : f32
1321+ // CHECK: %[[VAR202:.*]] = arith.addf %[[VAR201]], %[[CST_8]] fastmath<nnan,contract> : f32
1322+ // CHECK: %[[VAR203:.*]] = math.sqrt %[[VAR202]] fastmath<nnan,contract> : f32
1323+ // CHECK: %[[VAR204:.*]] = math.absf %[[VAR191]] fastmath<nnan,contract> : f32
1324+ // CHECK: %[[VAR205:.*]] = arith.mulf %[[VAR203]], %[[VAR204]] fastmath<nnan,contract> : f32
12761325// CHECK: %[[VAR206:.*]] = arith.cmpf ogt, %[[VAR190]], %[[VAR191]] : f32
12771326// CHECK: %[[VAR207:.*]] = arith.select %[[VAR206]], %[[VAR199]], %[[VAR205]] : f32
12781327// CHECK: %[[VAR208:.*]] = arith.select %[[VAR193]], %[[VAR198]], %[[VAR207]] : f32
12791328// CHECK: %[[VAR209:.*]] = arith.select %[[VAR192]], %[[VAR204]], %[[VAR208]] : f32
1280- // CHECK: %[[VAR210:.*]] = arith.addf %[[VAR189]], %[[VAR209]] : f32
1329+ // CHECK: %[[VAR210:.*]] = arith.addf %[[VAR189]], %[[VAR209]] fastmath<nnan,contract> : f32
12811330// CHECK: %[[CST_9:.*]] = arith.constant 5.000000e-01 : f32
1282- // CHECK: %[[VAR211:.*]] = arith.mulf %[[VAR210]], %[[CST_9]] : f32
1283- // CHECK: %[[VAR212:.*]] = math.sqrt %[[VAR211]] : f32
1331+ // CHECK: %[[VAR211:.*]] = arith.mulf %[[VAR210]], %[[CST_9]] fastmath<nnan,contract> : f32
1332+ // CHECK: %[[VAR212:.*]] = math.sqrt %[[VAR211]] fastmath<nnan,contract> : f32
12841333// CHECK: %[[VAR213:.*]] = arith.cmpf olt, %[[VAR187]], %[[CST_6]] : f32
12851334// CHECK: %[[VAR214:.*]] = arith.cmpf olt, %[[VAR188]], %[[CST_6]] : f32
1286- // CHECK: %[[VAR215:.*]] = arith.addf %[[VAR212]], %[[VAR212]] : f32
1287- // CHECK: %[[VAR216:.*]] = arith.divf %[[VAR188]], %[[VAR215]] : f32
1335+ // CHECK: %[[VAR215:.*]] = arith.addf %[[VAR212]], %[[VAR212]] fastmath<nnan,contract> : f32
1336+ // CHECK: %[[VAR216:.*]] = arith.divf %[[VAR188]], %[[VAR215]] fastmath<nnan,contract> : f32
12881337// CHECK: %[[VAR217:.*]] = arith.negf %[[VAR212]] : f32
12891338// CHECK: %[[VAR218:.*]] = arith.select %[[VAR214]], %[[VAR217]], %[[VAR212]] : f32
12901339// CHECK: %[[VAR219:.*]] = arith.select %[[VAR213]], %[[VAR218]], %[[VAR216]] : f32
1291- // CHECK: %[[VAR220:.*]] = arith.addf %[[VAR219]], %[[VAR219]] : f32
1292- // CHECK: %[[VAR221:.*]] = arith.divf %[[VAR188]], %[[VAR220]] : f32
1340+ // CHECK: %[[VAR220:.*]] = arith.addf %[[VAR219]], %[[VAR219]] fastmath<nnan,contract> : f32
1341+ // CHECK: %[[VAR221:.*]] = arith.divf %[[VAR188]], %[[VAR220]] fastmath<nnan,contract> : f32
12931342// CHECK: %[[VAR222:.*]] = arith.select %[[VAR213]], %[[VAR221]], %[[VAR212]] : f32
12941343// CHECK: %[[VAR223:.*]] = arith.cmpf oeq, %[[VAR187]], %[[CST_6]] : f32
12951344// CHECK: %[[VAR224:.*]] = arith.cmpf oeq, %[[VAR188]], %[[CST_6]] : f32
@@ -1728,3 +1777,60 @@ func.func @complex_div_with_fmf(%lhs: complex<f32>, %rhs: complex<f32>) -> compl
17281777// CHECK: %[[RESULT_IMAG_WITH_SPECIAL_CASES:.*]] = arith.select %[[RESULT_IS_NAN]], %[[RESULT_IMAG_SPECIAL_CASE_1]], %[[RESULT_IMAG]] : f32
17291778// CHECK: %[[RESULT:.*]] = complex.create %[[RESULT_REAL_WITH_SPECIAL_CASES]], %[[RESULT_IMAG_WITH_SPECIAL_CASES]] : complex<f32>
17301779// CHECK: return %[[RESULT]] : complex<f32>
1780+
1781+ // -----
1782+
1783+ // CHECK-LABEL: func @complex_sqrt_with_fmf
1784+ // CHECK-SAME: %[[ARG:.*]]: complex<f32>
1785+ func.func @complex_sqrt_with_fmf (%arg: complex <f32 >) -> complex <f32 > {
1786+ %sqrt = complex.sqrt %arg fastmath <nnan ,contract > : complex <f32 >
1787+ return %sqrt : complex <f32 >
1788+ }
1789+
1790+ // CHECK: %[[CST:.*]] = arith.constant 0.000000e+00 : f32
1791+ // CHECK: %[[VAR0:.*]] = complex.re %[[ARG]] : complex<f32>
1792+ // CHECK: %[[VAR1:.*]] = complex.im %[[ARG]] : complex<f32>
1793+ // CHECK: %[[VAR2:.*]] = math.absf %[[VAR0]] fastmath<nnan,contract> : f32
1794+ // CHECK: %[[CST0:.*]] = arith.constant 0.000000e+00 : f32
1795+ // CHECK: %[[CST1:.*]] = arith.constant 1.000000e+00 : f32
1796+ // CHECK: %[[VAR3:.*]] = complex.re %[[ARG]] : complex<f32>
1797+ // CHECK: %[[VAR4:.*]] = complex.im %[[ARG]] : complex<f32>
1798+ // CHECK: %[[VAR5:.*]] = arith.cmpf oeq, %[[VAR3]], %[[CST0]] : f32
1799+ // CHECK: %[[VAR6:.*]] = arith.cmpf oeq, %[[VAR4]], %[[CST0]] : f32
1800+ // CHECK: %[[VAR7:.*]] = arith.divf %[[VAR4]], %[[VAR3]] fastmath<nnan,contract> : f32
1801+ // CHECK: %[[VAR8:.*]] = arith.mulf %[[VAR7]], %[[VAR7]] fastmath<nnan,contract> : f32
1802+ // CHECK: %[[VAR9:.*]] = arith.addf %[[VAR8]], %[[CST1]] fastmath<nnan,contract> : f32
1803+ // CHECK: %[[VAR10:.*]] = math.sqrt %[[VAR9]] fastmath<nnan,contract> : f32
1804+ // CHECK: %[[VAR11:.*]] = math.absf %[[VAR3]] fastmath<nnan,contract> : f32
1805+ // CHECK: %[[VAR12:.*]] = arith.mulf %[[VAR10]], %[[VAR11]] fastmath<nnan,contract> : f32
1806+ // CHECK: %[[VAR13:.*]] = arith.divf %[[VAR3]], %[[VAR4]] fastmath<nnan,contract> : f32
1807+ // CHECK: %[[VAR14:.*]] = arith.mulf %[[VAR13]], %[[VAR13]] fastmath<nnan,contract> : f32
1808+ // CHECK: %[[VAR15:.*]] = arith.addf %[[VAR14]], %[[CST1]] fastmath<nnan,contract> : f32
1809+ // CHECK: %[[VAR16:.*]] = math.sqrt %[[VAR15]] fastmath<nnan,contract> : f32
1810+ // CHECK: %[[VAR17:.*]] = math.absf %[[VAR4]] fastmath<nnan,contract> : f32
1811+ // CHECK: %[[VAR18:.*]] = arith.mulf %[[VAR16]], %[[VAR17]] fastmath<nnan,contract> : f32
1812+ // CHECK: %[[VAR19:.*]] = arith.cmpf ogt, %[[VAR3]], %[[VAR4]] : f32
1813+ // CHECK: %[[VAR20:.*]] = arith.select %[[VAR19]], %[[VAR12]], %[[VAR18]] : f32
1814+ // CHECK: %[[VAR21:.*]] = arith.select %[[VAR6]], %[[VAR11]], %[[VAR20]] : f32
1815+ // CHECK: %[[VAR22:.*]] = arith.select %[[VAR5]], %[[VAR17]], %[[VAR21]] : f32
1816+ // CHECK: %[[VAR23:.*]] = arith.addf %[[VAR2]], %[[VAR22]] fastmath<nnan,contract> : f32
1817+ // CHECK: %[[CST2:.*]] = arith.constant 5.000000e-01 : f32
1818+ // CHECK: %[[VAR24:.*]] = arith.mulf %[[VAR23]], %[[CST2]] fastmath<nnan,contract> : f32
1819+ // CHECK: %[[VAR25:.*]] = math.sqrt %[[VAR24]] fastmath<nnan,contract> : f32
1820+ // CHECK: %[[VAR26:.*]] = arith.cmpf olt, %[[VAR0]], %cst : f32
1821+ // CHECK: %[[VAR27:.*]] = arith.cmpf olt, %[[VAR1]], %cst : f32
1822+ // CHECK: %[[VAR28:.*]] = arith.addf %[[VAR25]], %[[VAR25]] fastmath<nnan,contract> : f32
1823+ // CHECK: %[[VAR29:.*]] = arith.divf %[[VAR1]], %[[VAR28]] fastmath<nnan,contract> : f32
1824+ // CHECK: %[[VAR30:.*]] = arith.negf %[[VAR25]] : f32
1825+ // CHECK: %[[VAR31:.*]] = arith.select %[[VAR27]], %[[VAR30]], %[[VAR25]] : f32
1826+ // CHECK: %[[VAR32:.*]] = arith.select %[[VAR26]], %[[VAR31]], %[[VAR29]] : f32
1827+ // CHECK: %[[VAR33:.*]] = arith.addf %[[VAR32]], %[[VAR32]] fastmath<nnan,contract> : f32
1828+ // CHECK: %[[VAR34:.*]] = arith.divf %[[VAR1]], %[[VAR33]] fastmath<nnan,contract> : f32
1829+ // CHECK: %[[VAR35:.*]] = arith.select %[[VAR26]], %[[VAR34]], %[[VAR25]] : f32
1830+ // CHECK: %[[VAR36:.*]] = arith.cmpf oeq, %[[VAR0]], %cst : f32
1831+ // CHECK: %[[VAR37:.*]] = arith.cmpf oeq, %[[VAR1]], %cst : f32
1832+ // CHECK: %[[VAR38:.*]] = arith.andi %[[VAR36]], %[[VAR37]] : i1
1833+ // CHECK: %[[VAR39:.*]] = arith.select %[[VAR38]], %cst, %[[VAR35]] : f32
1834+ // CHECK: %[[VAR40:.*]] = arith.select %[[VAR38]], %cst, %[[VAR32]] : f32
1835+ // CHECK: %[[VAR41:.*]] = complex.create %[[VAR39]], %[[VAR40]] : complex<f32>
1836+ // CHECK: return %[[VAR41]] : complex<f32>
0 commit comments