On Tue, 2020-02-25 at 12:15 -0600, will schmidt wrote: > PR90763: PowerPC vec_xl_len should take const argument.
ping! :-) thanks -Will > > Hi, > > Adds some logic in altivec_resolve_overloaded_builtin() to handle > the > scenario where const <foo>* arguments are passed in to the > vec_xl_len() > builtin. > The existing logic to remove const from pointers does not kick in > since > the return type is not itself a pointer type. > > Regtested ok. > OK for master? > > Thanks, > -Will > > 2020-02-24: Will Schmidt <will_schm...@vnet.ibm.com> > > gcc/ > PR target/90763 > * config/rs6000/rs6000-c.c > (altivec_resolve_overloaded_builtin): Add > clause to handle P9V_BUILTIN_VEC_LXVL with const arguments. > > testsuite/ > PR target/90763 > * gcc.target/powerpc/pr90763: New. > > diff --git a/gcc/config/rs6000/rs6000-c.c b/gcc/config/rs6000/rs6000- > c.c > index 37c74cf..9ad8309 100644 > --- a/gcc/config/rs6000/rs6000-c.c > +++ b/gcc/config/rs6000/rs6000-c.c > @@ -1636,10 +1636,24 @@ altivec_resolve_overloaded_builtin > (location_t loc, tree fndecl, > type = build_pointer_type (build_qualified_type (TREE_TYPE > (type), > 0)); > arg = fold_convert (type, arg); > } > > + /* For P9V_BUILTIN_VEC_LXVL, convert any const * to its non > constant > + equivalent to simplify the overload matching below. */ > + if (fcode == P9V_BUILTIN_VEC_LXVL) > + { > + if (POINTER_TYPE_P (type) > + && (TYPE_QUALS (TREE_TYPE (type)) != 0) > + && TYPE_READONLY (TREE_TYPE (type))) > + { > + type = build_pointer_type (build_qualified_type ( > + TREE_TYPE (type),0)); > + arg = fold_convert (type, arg); > + } > + } > + > args[n] = arg; > types[n] = type; > } > > /* If the number of arguments did not match the prototype, return > NULL > diff --git a/gcc/testsuite/gcc.target/powerpc/pr90763.c > b/gcc/testsuite/gcc.target/powerpc/pr90763.c > new file mode 100644 > index 0000000..ec0e56e > --- /dev/null > +++ b/gcc/testsuite/gcc.target/powerpc/pr90763.c > @@ -0,0 +1,87 @@ > +/* { dg-require-effective-target powerpc_p9vector_ok } */ > +/* { dg-options "-mcpu=power9" } */ > + > +/* PR90763: PowerPC vec_xl_len should take const. > +*/ > + > +#include <altivec.h> > + > +vector unsigned char vec_load_uc(unsigned char *p, int num) { > + return vec_xl_len(p, num); > +} > +vector unsigned char vec_load_const_uc(const unsigned char *p, int > num) { > + return vec_xl_len(p, num); > +} > +vector signed char vec_load_sc(signed char *p, int num) { > + return vec_xl_len(p, num); > +} > +vector signed char vec_load_const_sc(const signed char *p, int num) > { > + return vec_xl_len(p, num); > +} > + > +vector signed short vec_load_ss(signed short *p, int num) { > + return vec_xl_len(p, num); > +} > +vector signed short vec_load_const_ss(const signed short *p, int > num) { > + return vec_xl_len(p, num); > +} > +vector unsigned short vec_load_us(unsigned short *p, int num) { > + return vec_xl_len(p, num); > +} > +vector unsigned short vec_load_const_us(const unsigned short *p, int > num) { > + return vec_xl_len(p, num); > +} > + > +vector signed int vec_load_si(signed int *p, int num) { > + return vec_xl_len(p, num); > +} > +vector signed int vec_load_const_si(const signed int *p, int num) { > + return vec_xl_len(p, num); > +} > +vector unsigned int vec_load_ui(unsigned int *p, int num) { > + return vec_xl_len(p, num); > +} > +vector unsigned int vec_load_const_ui(const unsigned int *p, int > num) { > + return vec_xl_len(p, num); > +} > + > +vector signed long long vec_load_sll(signed long long *p, int num) { > + return vec_xl_len(p, num); > +} > +vector signed long long vec_load_const_sll(const signed long long > *p, int num) { > + return vec_xl_len(p, num); > +} > +vector unsigned long long vec_load_ull(unsigned long long *p, int > num) { > + return vec_xl_len(p, num); > +} > +vector unsigned long long vec_load_const_ull(const unsigned long > long *p, int num) { > + return vec_xl_len(p, num); > +} > + > +vector signed __int128 vec_load_si128(signed __int128 *p, int num) { > + return vec_xl_len(p, num); > +} > +vector signed __int128 vec_load_const_si128(const signed __int128 > *p, int num) { > + return vec_xl_len(p, num); > +} > +vector unsigned __int128 vec_load_ui128(unsigned __int128 *p, int > num) { > + return vec_xl_len(p, num); > +} > +vector unsigned __int128 vec_load_const_ui128(const unsigned > __int128 *p, int num) { > + return vec_xl_len(p, num); > +} > + > +vector float vec_load_f(float *p, int num) { > + return vec_xl_len(p, num); > +} > +vector float vec_load_const_f(const float *p, int num) { > + return vec_xl_len(p, num); > +} > + > +vector double vec_load_d(double *p, int num) { > + return vec_xl_len(p, num); > +} > +vector double vec_load_const_d(const double *p, int num) { > + return vec_xl_len(p, num); > +} > + >