public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-7956] Disparage slightly for the alternative which move DFmode between SSE_REGS and GENERAL_REGS.
@ 2023-10-17  6:31 hongtao Liu
  0 siblings, 0 replies; only message in thread
From: hongtao Liu @ 2023-10-17  6:31 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:27165633859bdf92589428213edfeccdb49b7d83

commit r13-7956-g27165633859bdf92589428213edfeccdb49b7d83
Author: liuhongt <hongtao.liu@intel.com>
Date:   Wed Jul 5 13:45:11 2023 +0800

    Disparage slightly for the alternative which move DFmode between SSE_REGS and GENERAL_REGS.
    
    For testcase
    
    void __cond_swap(double* __x, double* __y) {
      bool __r = (*__x < *__y);
      auto __tmp = __r ? *__x : *__y;
      *__y = __r ? *__y : *__x;
      *__x = __tmp;
    }
    
    GCC-14 with -O2 and -march=x86-64 options generates the following code:
    
    __cond_swap(double*, double*):
            movsd   xmm1, QWORD PTR [rdi]
            movsd   xmm0, QWORD PTR [rsi]
            comisd  xmm0, xmm1
            jbe     .L2
            movq    rax, xmm1
            movapd  xmm1, xmm0
            movq    xmm0, rax
    .L2:
            movsd   QWORD PTR [rsi], xmm1
            movsd   QWORD PTR [rdi], xmm0
            ret
    
    rax is used to save and restore DFmode value. In RA both GENERAL_REGS
    and SSE_REGS cost zero since we didn't disparage the
    alternative in movdf_internal pattern, according to register
    allocation order, GENERAL_REGS is allocated. The patch add ? for
    alternative (r,v) and (v,r) just like we did for movsf/hf/bf_internal
    pattern, after that we get optimal RA.
    
    __cond_swap:
    .LFB0:
            .cfi_startproc
            movsd   (%rdi), %xmm1
            movsd   (%rsi), %xmm0
            comisd  %xmm1, %xmm0
            jbe     .L2
            movapd  %xmm1, %xmm2
            movapd  %xmm0, %xmm1
            movapd  %xmm2, %xmm0
    .L2:
            movsd   %xmm1, (%rsi)
            movsd   %xmm0, (%rdi)
            ret
    
    gcc/ChangeLog:
    
            PR target/110170
            * config/i386/i386.md (movdf_internal): Disparage slightly for
            2 alternatives (r,v) and (v,r) by adding constraint modifier
            '?'.
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/i386/pr110170-3.c: New test.
    
    (cherry picked from commit 37a231cc7594d12ba0822077018aad751a6fb94e)

Diff:
---
 gcc/config/i386/i386.md                    |  4 ++--
 gcc/testsuite/gcc.target/i386/pr110170-3.c | 11 +++++++++++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index bd678190782e..d6e25db9d014 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -3744,9 +3744,9 @@
 ;; Possible store forwarding (partial memory) stall in alternatives 4, 6 and 7.
 (define_insn "*movdf_internal"
   [(set (match_operand:DF 0 "nonimmediate_operand"
-    "=Yf*f,m   ,Yf*f,?r ,!o,?*r ,!o,!o,?r,?m,?r,?r,v,v,v,m,*x,*x,*x,m ,r ,v,r  ,o ,r  ,m")
+    "=Yf*f,m   ,Yf*f,?r ,!o,?*r ,!o,!o,?r,?m,?r,?r,v,v,v,m,*x,*x,*x,m ,?r,?v,r  ,o ,r  ,m")
 	(match_operand:DF 1 "general_operand"
-    "Yf*fm,Yf*f,G   ,roF,r ,*roF,*r,F ,rm,rC,C ,F ,C,v,m,v,C ,*x,m ,*x,v,r ,roF,rF,rmF,rC"))]
+    "Yf*fm,Yf*f,G   ,roF,r ,*roF,*r,F ,rm,rC,C ,F ,C,v,m,v,C ,*x,m ,*x, v, r,roF,rF,rmF,rC"))]
   "!(MEM_P (operands[0]) && MEM_P (operands[1]))
    && (lra_in_progress || reload_completed
        || !CONST_DOUBLE_P (operands[1])
diff --git a/gcc/testsuite/gcc.target/i386/pr110170-3.c b/gcc/testsuite/gcc.target/i386/pr110170-3.c
new file mode 100644
index 000000000000..70daa89e9aae
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr110170-3.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O2 -fno-if-conversion -fno-if-conversion2" } */
+/* { dg-final { scan-assembler-not {(?n)movq.*r} } } */
+
+void __cond_swap(double* __x, double* __y) {
+  _Bool __r = (*__x < *__y);
+  double __tmp = __r ? *__x : *__y;
+  *__y = __r ? *__y : *__x;
+  *__x = __tmp;
+}
+

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

only message in thread, other threads:[~2023-10-17  6:31 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-10-17  6:31 [gcc r13-7956] Disparage slightly for the alternative which move DFmode between SSE_REGS and GENERAL_REGS hongtao Liu

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).