[gcc r15-313] x86: Fix cmov cost model issue [PR109549]

Kong Lingling konglin1@gcc.gnu.org
Wed May 8 07:48:31 GMT 2024


https://gcc.gnu.org/g:d826f7945609046f922732b138fb90795d5b1985

commit r15-313-gd826f7945609046f922732b138fb90795d5b1985
Author: konglin1 <lingling.kong@intel.com>
Date:   Wed May 8 15:46:10 2024 +0800

    x86: Fix cmov cost model issue [PR109549]
    
    (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.

Diff:
---
 gcc/config/i386/i386.cc               | 2 +-
 gcc/testsuite/gcc.target/i386/cmov6.c | 5 +----
 2 files changed, 2 insertions(+), 5 deletions(-)

diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc
index e58335adc8f0..c2df4ab91ee9 100644
--- a/gcc/config/i386/i386.cc
+++ b/gcc/config/i386/i386.cc
@@ -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);
diff --git a/gcc/testsuite/gcc.target/i386/cmov6.c b/gcc/testsuite/gcc.target/i386/cmov6.c
index 5111c8a90995..535326e4c2a3 100644
--- a/gcc/testsuite/gcc.target/i386/cmov6.c
+++ b/gcc/testsuite/gcc.target/i386/cmov6.c
@@ -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);


More information about the Gcc-cvs mailing list