summaryrefslogtreecommitdiff
path: root/0284-i386-Add-non-optimize-prefetchi-intrins.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 /0284-i386-Add-non-optimize-prefetchi-intrins.patch
parent49d3feaf4665cdb07576fc1a2382a4d82a612d35 (diff)
automatic import of gccopeneuler24.03_LTS_SP1
Diffstat (limited to '0284-i386-Add-non-optimize-prefetchi-intrins.patch')
-rw-r--r--0284-i386-Add-non-optimize-prefetchi-intrins.patch92
1 files changed, 92 insertions, 0 deletions
diff --git a/0284-i386-Add-non-optimize-prefetchi-intrins.patch b/0284-i386-Add-non-optimize-prefetchi-intrins.patch
new file mode 100644
index 0000000..2a450e8
--- /dev/null
+++ b/0284-i386-Add-non-optimize-prefetchi-intrins.patch
@@ -0,0 +1,92 @@
+From c19afda0ee549d294fd5714c63db24bcd4570d03 Mon Sep 17 00:00:00 2001
+From: Haochen Jiang <haochen.jiang@intel.com>
+Date: Thu, 25 Jul 2024 16:16:05 +0800
+Subject: [PATCH 2/2] i386: Add non-optimize prefetchi intrins
+
+Under -O0, with the "newly" introduced intrins, the variable will be
+transformed as mem instead of the origin symbol_ref. The compiler will
+then treat the operand as invalid and turn the operation into nop, which
+is not expected. Use macro for non-optimize to keep the variable as
+symbol_ref just as how prefetch intrin does.
+
+gcc/ChangeLog:
+
+ * config/i386/prfchiintrin.h
+ (_m_prefetchit0): Add macro for non-optimized option.
+ (_m_prefetchit1): Ditto.
+
+gcc/testsuite/ChangeLog:
+
+ * gcc.target/i386/prefetchi-1b.c: New test.
+
+Reference:
+https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=
+b4524c4430ba9771265bd9fc31e69a3f35dfe117
+---
+ gcc/config/i386/prfchiintrin.h | 9 +++++++
+ gcc/testsuite/gcc.target/i386/prefetchi-1b.c | 26 ++++++++++++++++++++
+ 2 files changed, 35 insertions(+)
+ create mode 100644 gcc/testsuite/gcc.target/i386/prefetchi-1b.c
+
+diff --git a/gcc/config/i386/prfchiintrin.h b/gcc/config/i386/prfchiintrin.h
+index 06deef488..1e3d42dc3 100644
+--- a/gcc/config/i386/prfchiintrin.h
++++ b/gcc/config/i386/prfchiintrin.h
+@@ -30,6 +30,7 @@
+
+ #ifdef __x86_64__
+
++#ifdef __OPTIMIZE__
+ extern __inline void
+ __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+ _m_prefetchit0 (void* __P)
+@@ -43,6 +44,14 @@ _m_prefetchit1 (void* __P)
+ {
+ __builtin_ia32_prefetchi (__P, 2);
+ }
++#else
++#define _m_prefetchit0(P) \
++ __builtin_ia32_prefetchi(P, 3)
++
++#define _m_prefetchit1(P) \
++ __builtin_ia32_prefetchi(P, 2)
++
++#endif
+
+ #endif
+
+diff --git a/gcc/testsuite/gcc.target/i386/prefetchi-1b.c b/gcc/testsuite/gcc.target/i386/prefetchi-1b.c
+new file mode 100644
+index 000000000..93139554d
+--- /dev/null
++++ b/gcc/testsuite/gcc.target/i386/prefetchi-1b.c
+@@ -0,0 +1,26 @@
++/* { dg-do compile { target { ! ia32 } } } */
++/* { dg-options "-mprefetchi -O0" } */
++/* { dg-final { scan-assembler-times "\[ \\t\]+prefetchit0\[ \\t\]+bar\\(%rip\\)" 1 } } */
++/* { dg-final { scan-assembler-times "\[ \\t\]+prefetchit1\[ \\t\]+bar\\(%rip\\)" 1 } } */
++
++#include <x86intrin.h>
++
++int
++bar (int a)
++{
++ return a + 1;
++}
++
++int
++foo1 (int b)
++{
++ _m_prefetchit0 (bar);
++ return bar (b) + 1;
++}
++
++int
++foo2 (int b)
++{
++ _m_prefetchit1 (bar);
++ return bar (b) + 1;
++}
+--
+2.31.1
+