Hi all, 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.
Bootstrapped and regtested on x86-64-pc-linux-gnu. Ok for trunk and backport to GCC 14 and GCC 13? Thx, Haochen --- gcc/config/i386/prfchiintrin.h | 9 +++++++++ 1 file changed, 9 insertions(+) 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__ -- 2.31.1