]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
x86: Fix cmov cost model issue [PR109549]
authorkonglin1 <lingling.kong@intel.com>
Wed, 8 May 2024 07:46:10 +0000 (15:46 +0800)
committerkonglin1 <lingling.kong@intel.com>
Wed, 8 May 2024 07:46:22 +0000 (15:46 +0800)
(if_then_else:SI (eq (reg:CCZ 17 flags)
        (const_int 0 [0]))
    (reg/v:SI 101 [ e ])
    (reg:SI 102))
The cost is 8 for the rtx, the cost for
(eq (reg:CCZ 17 flags) (const_int 0 [0])) is 4,
but this is just an operator do not need to compute it's cost in cmov.

gcc/ChangeLog:

PR target/109549
* config/i386/i386.cc (ix86_rtx_costs): The XEXP (x, 0) for cmov
is an operator do not need to compute cost.

gcc/testsuite/ChangeLog:

* gcc.target/i386/cmov6.c: Fixed.

gcc/config/i386/i386.cc
gcc/testsuite/gcc.target/i386/cmov6.c

index e58335adc8f0b77210c6443a26ea3748dc024a33..c2df4ab91ee92f8605259d85a989b7c88bb746ba 100644 (file)
@@ -22237,7 +22237,7 @@ ix86_rtx_costs (rtx x, machine_mode mode, int outer_code_i, int opno,
        {
          /* cmov.  */
          *total = COSTS_N_INSNS (1);
-         if (!REG_P (XEXP (x, 0)))
+         if (!COMPARISON_P (XEXP (x, 0)) && !REG_P (XEXP (x, 0)))
            *total += rtx_cost (XEXP (x, 0), mode, code, 0, speed);
          if (!REG_P (XEXP (x, 1)))
            *total += rtx_cost (XEXP (x, 1), mode, code, 1, speed);
index 5111c8a909956635013ea3141636ed2299b21dac..535326e4c2a3c11aec303f6e677f5b0736bc17fa 100644 (file)
@@ -1,9 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -march=k8" } */
-/* if-converting this sequence would require two cmov
-   instructions and seems to always cost more independent
-   of the TUNE_ONE_IF_CONV setting.  */
-/* { dg-final { scan-assembler-not "cmov\[^6\]" } } */
+/* { dg-final { scan-assembler "cmov\[^6\]" } } */
 
 /* Verify that blocks are converted to conditional moves.  */
 extern int bar (int, int);