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);
> +}
> +
> 

Reply via email to