93 lines
2.4 KiB
Diff
93 lines
2.4 KiB
Diff
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
|
|
|