@@ -708,11 +708,60 @@ func.func @complex_tanh(%arg: complex<f32>) -> complex<f32> {
708
708
// -----
709
709
710
710
// CHECK-LABEL: func @complex_sqrt
711
+ // CHECK-SAME: %[[ARG:.*]]: complex<f32>
711
712
func.func @complex_sqrt (%arg: complex <f32 >) -> complex <f32 > {
712
713
%sqrt = complex.sqrt %arg : complex <f32 >
713
714
return %sqrt : complex <f32 >
714
715
}
715
716
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
+
716
765
// -----
717
766
718
767
// CHECK-LABEL: func @complex_conj
@@ -1254,42 +1303,42 @@ func.func @complex_atan2_with_fmf(%lhs: complex<f32>,
1254
1303
// CHECK: %[[CST_6:.*]] = arith.constant 0.000000e+00 : f32
1255
1304
// CHECK: %[[VAR187:.*]] = complex.re %[[VAR186]] : complex<f32>
1256
1305
// CHECK: %[[VAR188:.*]] = complex.im %[[VAR186]] : complex<f32>
1257
- // CHECK: %[[VAR189:.*]] = math.absf %[[VAR187]] : f32
1306
+ // CHECK: %[[VAR189:.*]] = math.absf %[[VAR187]] fastmath<nnan,contract> : f32
1258
1307
// CHECK: %[[CST_7:.*]] = arith.constant 0.000000e+00 : f32
1259
1308
// CHECK: %[[CST_8:.*]] = arith.constant 1.000000e+00 : f32
1260
1309
// CHECK: %[[VAR190:.*]] = complex.re %[[VAR186]] : complex<f32>
1261
1310
// CHECK: %[[VAR191:.*]] = complex.im %[[VAR186]] : complex<f32>
1262
1311
// CHECK: %[[VAR192:.*]] = arith.cmpf oeq, %[[VAR190]], %[[CST_7]] : f32
1263
1312
// 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
1276
1325
// CHECK: %[[VAR206:.*]] = arith.cmpf ogt, %[[VAR190]], %[[VAR191]] : f32
1277
1326
// CHECK: %[[VAR207:.*]] = arith.select %[[VAR206]], %[[VAR199]], %[[VAR205]] : f32
1278
1327
// CHECK: %[[VAR208:.*]] = arith.select %[[VAR193]], %[[VAR198]], %[[VAR207]] : f32
1279
1328
// 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
1281
1330
// 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
1284
1333
// CHECK: %[[VAR213:.*]] = arith.cmpf olt, %[[VAR187]], %[[CST_6]] : f32
1285
1334
// 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
1288
1337
// CHECK: %[[VAR217:.*]] = arith.negf %[[VAR212]] : f32
1289
1338
// CHECK: %[[VAR218:.*]] = arith.select %[[VAR214]], %[[VAR217]], %[[VAR212]] : f32
1290
1339
// 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
1293
1342
// CHECK: %[[VAR222:.*]] = arith.select %[[VAR213]], %[[VAR221]], %[[VAR212]] : f32
1294
1343
// CHECK: %[[VAR223:.*]] = arith.cmpf oeq, %[[VAR187]], %[[CST_6]] : f32
1295
1344
// 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
1728
1777
// CHECK: %[[RESULT_IMAG_WITH_SPECIAL_CASES:.*]] = arith.select %[[RESULT_IS_NAN]], %[[RESULT_IMAG_SPECIAL_CASE_1]], %[[RESULT_IMAG]] : f32
1729
1778
// CHECK: %[[RESULT:.*]] = complex.create %[[RESULT_REAL_WITH_SPECIAL_CASES]], %[[RESULT_IMAG_WITH_SPECIAL_CASES]] : complex<f32>
1730
1779
// 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