public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r14-2158] i386: Fix FAIL of gcc.target/i386/pr78794.c on ia32.
@ 2023-06-28 10:08 Roger Sayle
  0 siblings, 0 replies; only message in thread
From: Roger Sayle @ 2023-06-28 10:08 UTC (permalink / raw)
  To: gcc-cvs

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

commit r14-2158-gc027592d39b2968005aa28bc84a946bab2668db8
Author: Roger Sayle <roger@nextmovesoftware.com>
Date:   Wed Jun 28 11:07:47 2023 +0100

    i386: Fix FAIL of gcc.target/i386/pr78794.c on ia32.
    
    This patch fixes that FAIL of gcc.target/i386/pr78794.c on ia32, which
    is caused by minor STV rtx_cost differences with -march=silvermont.
    It turns out that generic tuning results in pandn, but the lack of
    accurate parameterization for COMPARE in compute_convert_gain combined
    with small differences in scalar<->SSE costs on silvermont results in
    this DImode chain not being converted.
    
    The solution is to provide more accurate costs/gains for converting
    (DImode and SImode) comparisons.
    
    I'd been holding off of doing this as I'd thought it would be possible
    to turn pandn;ptestz into ptestc (for an even bigger scalar-to-vector
    win) but I've recently realized that these optimizations (as I've
    implemented them) occur in the wrong order (stv2 occurs after
    combine), so it isn't easy for STV to convert CCZmode into CCCmode.
    Doh!  Perhaps something can be done in peephole2.
    
    2023-06-28  Roger Sayle  <roger@nextmovesoftware.com>
    
    gcc/ChangeLog
            PR target/78794
            * config/i386/i386-features.cc (compute_convert_gain): Provide
            more accurate gains for conversion of scalar comparisons to
            PTEST.

Diff:
---
 gcc/config/i386/i386-features.cc | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index 92ae08d442e..c676a90f51b 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -631,7 +631,31 @@ general_scalar_chain::compute_convert_gain ()
 	    break;
 
 	  case COMPARE:
-	    /* Assume comparison cost is the same.  */
+	    if (XEXP (src, 1) != const0_rtx)
+	      {
+		/* cmp vs. pxor;pshufd;ptest.  */
+		igain += COSTS_N_INSNS (m - 3);
+	      }
+	    else if (GET_CODE (XEXP (src, 0)) != AND)
+	      {
+		/* test vs. pshufd;ptest.  */
+		igain += COSTS_N_INSNS (m - 2);
+	      }
+	    else if (GET_CODE (XEXP (XEXP (src, 0), 0)) != NOT)
+	      {
+		/* and;test vs. pshufd;ptest.  */
+		igain += COSTS_N_INSNS (2 * m - 2);
+	      }
+	    else if (TARGET_BMI)
+	      {
+		/* andn;test vs. pandn;pshufd;ptest.  */
+		igain += COSTS_N_INSNS (2 * m - 3);
+	      }
+	    else
+	      {
+		/* not;and;test vs. pandn;pshufd;ptest.  */
+		igain += COSTS_N_INSNS (3 * m - 3);
+	      }
 	    break;
 
 	  case CONST_INT:

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-06-28 10:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-06-28 10:08 [gcc r14-2158] i386: Fix FAIL of gcc.target/i386/pr78794.c on ia32 Roger Sayle

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).