PR90763: PowerPC vec_xl_len should take const argument. 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); +} +