On Tue, Nov 5, 2024 at 10:52 AM Hu, Lin1 <lin1...@intel.com> wrote: > > Hi, all > > __builtin_ia32_prefetch's op1 should be between 0 and 2. So add an error > handler. > > Bootstrapped and regtested on x86_64-pc-linux-gnu, there is a unrelated FAIL > that has yet to be found root cause, just send patch for review. > > BRs, > Lin > > gcc/ChangeLog: > > PR target/117416 > * config/i386/i386-expand.cc (ix86_expand_builtin): Raise warning when > op1 isn't in range of (0, 2) and set op1 as const0_rtx; > > gcc/testsuite/ChangeLog: > > PR target/117416 > * gcc.target/i386/pr117416-1.c: New test. > --- > gcc/config/i386/i386-expand.cc | 7 +++++++ > gcc/testsuite/gcc.target/i386/pr117416-1.c | 12 ++++++++++++ > 2 files changed, 19 insertions(+) > create mode 100644 gcc/testsuite/gcc.target/i386/pr117416-1.c > > diff --git a/gcc/config/i386/i386-expand.cc b/gcc/config/i386/i386-expand.cc > index 515334aa5a3..5dab5859463 100644 > --- a/gcc/config/i386/i386-expand.cc > +++ b/gcc/config/i386/i386-expand.cc > @@ -14194,6 +14194,13 @@ ix86_expand_builtin (tree exp, rtx target, rtx > subtarget, > return const0_rtx; > } > > + if (!IN_RANGE (INTVAL (op1), 0, 2)) > + { > + warning (0, "invalid second argument to" > + " %<__builtin_ia32_prefetch%>; using zero"); > + op1 = const0_rtx; > + } > + op3 should be handled similarly, 1 indicates for instruction prefetch, 0 for data prefetch. > if (INTVAL (op3) == 1) > { > if (INTVAL (op2) < 2 || INTVAL (op2) > 3) > diff --git a/gcc/testsuite/gcc.target/i386/pr117416-1.c > b/gcc/testsuite/gcc.target/i386/pr117416-1.c > new file mode 100644 > index 00000000000..7062f27e21a > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/pr117416-1.c > @@ -0,0 +1,12 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O0" } */ > + > +#include <x86intrin.h> > + > +void* p; > + > +void extern > +prefetch_test (void) > +{ > + __builtin_ia32_prefetch (p, 5, 0, 0); /* { dg-warning "invalid second > argument to '__builtin_ia32_prefetch'; using zero" } */ > +} > -- > 2.31.1 >
-- BR, Hongtao