summaryrefslogtreecommitdiff
path: root/0266-Disparage-slightly-for-the-alternative-which-move-DF.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2025-02-28 10:03:49 +0000
committerCoprDistGit <infra@openeuler.org>2025-02-28 10:03:49 +0000
commit73127104a245052cd5cf29cdaaca3e5c32c70348 (patch)
tree8e28b63e478c43c252f18b49836dff7313affe54 /0266-Disparage-slightly-for-the-alternative-which-move-DF.patch
parent49d3feaf4665cdb07576fc1a2382a4d82a612d35 (diff)
automatic import of gccopeneuler24.03_LTS_SP1
Diffstat (limited to '0266-Disparage-slightly-for-the-alternative-which-move-DF.patch')
-rw-r--r--0266-Disparage-slightly-for-the-alternative-which-move-DF.patch106
1 files changed, 106 insertions, 0 deletions
diff --git a/0266-Disparage-slightly-for-the-alternative-which-move-DF.patch b/0266-Disparage-slightly-for-the-alternative-which-move-DF.patch
new file mode 100644
index 0000000..5e8bd67
--- /dev/null
+++ b/0266-Disparage-slightly-for-the-alternative-which-move-DF.patch
@@ -0,0 +1,106 @@
+From afd539adfe762adb57863299a11987b7e20e7987 Mon Sep 17 00:00:00 2001
+From: liuhongt <hongtao.liu@intel.com>
+Date: Wed, 5 Jul 2023 13:45:11 +0800
+Subject: [PATCH 12/28] 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)
+---
+ gcc/config/i386/i386.md | 4 ++--
+ gcc/testsuite/gcc.target/i386/pr110170-3.c | 11 +++++++++++
+ 2 files changed, 13 insertions(+), 2 deletions(-)
+ create mode 100644 gcc/testsuite/gcc.target/i386/pr110170-3.c
+
+diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
+index be07be10d..71691f598 100644
+--- a/gcc/config/i386/i386.md
++++ b/gcc/config/i386/i386.md
+@@ -3582,9 +3582,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 000000000..70daa89e9
+--- /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;
++}
++
+--
+2.31.1
+