On Fri, Jul 26, 2024 at 4:55 PM Haochen Jiang <haochen.ji...@intel.com> wrote:
>
> Hi all,
>
> I added related O0 testcase in this patch.
>
> Ok for trunk and backport to GCC 14 and GCC 13?
Ok.
>
> Thx,
> Haochen
>
> ---
>
> Changes in v2: Add testcases.
>
> ---
>
> 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.
> ---
>  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 dfca89c7d16..d6580e504c0 100644
> --- a/gcc/config/i386/prfchiintrin.h
> +++ b/gcc/config/i386/prfchiintrin.h
> @@ -37,6 +37,7 @@
>  #define __DISABLE_PREFETCHI__
>  #endif /* __PREFETCHI__ */
>
> +#ifdef __OPTIMIZE__
>  extern __inline void
>  __attribute__((__gnu_inline__, __always_inline__, __artificial__))
>  _m_prefetchit0 (void* __P)
> @@ -50,6 +51,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
>
>  #ifdef __DISABLE_PREFETCHI__
>  #undef __DISABLE_PREFETCHI__
> 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 00000000000..93139554d3c
> --- /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
>


-- 
BR,
Hongtao

Reply via email to