On Mon, 2 Dec 2024 at 12:44, Richard Earnshaw (lists)
<richard.earns...@arm.com> wrote:
>
> On 02/12/2024 11:21, Christophe Lyon wrote:
> > If the target does not support floating-point, we register FP vector
> > types as 'void' (see register_vector_type).
> >
> > The leads to warnings about 'pure attribute on function returning
> > void' when we declare the various load intrinsics because their
> > call_properties say CP_READ_MEMORY (thus giving them the 'pure'
> > attribute), but their return type is void.
> >
> > To avoid such warnings, pretend the call_properties are empty when FP
> > is disabled and the function would return an FP value.  If such
> > functions are incorrectly used in user code, a proper error is
> > emitted:
> > unknown type name ‘float16x8_t'; did you mean ‘int16x8_t’?
> >
> > gcc/ChangeLog:
> >
> >       PR target/117814
> >       * config/arm/arm-mve-builtins-base.cc (vld1_impl): Fix
> >       call_properties.
> >       (vld24_impl): Likewise.
> >       * config/arm/arm-mve-builtins-functions.h (load_extending):
> >       Likewise.
>
> Won't this lead to problems if the code is something like
>
> #include "arm_mve.h"
>
> #pragma gcc target ("arch=armv8.1-m.main+mve.fp")
>
> // Some use of an affected intrinsic
>
> and then compile with "-march=armv8.1-m.main+mve -mfpu=auto 
> -mfloat-abi=softfp"?
>
Indeed.... actually the real cause is precisely that without FPU we do
not register FP types (and map them to "void" instead).
I had started to look at fixing that but it looked more invasive.

Actually if you take any intrinsic test (say vaddq_f16.c), remove
"_fp" from dg-require-effective-target and dg-add-options, and add the
pragma above, you'll get the same error:
vaddq_f16.c:20:1: error: unknown type name 'float16x8_t'; did you mean
'int16x8_t'?

Let me look at fixing this.

Thanks,

Christophe

> R.
>
> > ---
> >  gcc/config/arm/arm-mve-builtins-base.cc     | 22 +++++++++++++++++++--
> >  gcc/config/arm/arm-mve-builtins-functions.h | 11 ++++++++++-
> >  2 files changed, 30 insertions(+), 3 deletions(-)
> >
> > diff --git a/gcc/config/arm/arm-mve-builtins-base.cc 
> > b/gcc/config/arm/arm-mve-builtins-base.cc
> > index 723004b53d7..a322730eca8 100644
> > --- a/gcc/config/arm/arm-mve-builtins-base.cc
> > +++ b/gcc/config/arm/arm-mve-builtins-base.cc
> > @@ -141,8 +141,17 @@ class vld1_impl : public full_width_access
> >  {
> >  public:
> >    unsigned int
> > -  call_properties (const function_instance &) const override
> > +  call_properties (const function_instance &instance) const override
> >    {
> > +    /* If the target does not support floating-point, we register FP vector
> > +       types as 'void'.  In this case, pretend we do not access memory to 
> > avoid
> > +       warnings about 'pure attribute on function returning void' when we
> > +       declare the intrinsics.  Such uses in user code are properly
> > +       diagnosed.  */
> > +    if (!TARGET_HAVE_MVE_FLOAT
> > +     && instance.type_suffix (0).float_p)
> > +      return 0;
> > +
> >      return CP_READ_MEMORY;
> >    }
> >
> > @@ -1141,8 +1150,17 @@ public:
> >    using full_width_access::full_width_access;
> >
> >    unsigned int
> > -  call_properties (const function_instance &) const override
> > +  call_properties (const function_instance &instance) const override
> >    {
> > +    /* If the target does not support floating-point, we register FP vector
> > +       types as 'void'.  In this case, pretend we do not access memory to 
> > avoid
> > +       warnings about 'pure attribute on function returning void' when we
> > +       declare the intrinsics.  Such uses in user code are properly
> > +       diagnosed.  */
> > +    if (!TARGET_HAVE_MVE_FLOAT
> > +     && instance.type_suffix (0).float_p)
> > +      return 0;
> > +
> >      return CP_READ_MEMORY;
> >    }
> >
> > diff --git a/gcc/config/arm/arm-mve-builtins-functions.h 
> > b/gcc/config/arm/arm-mve-builtins-functions.h
> > index 0ade2157e4a..1a9a347805c 100644
> > --- a/gcc/config/arm/arm-mve-builtins-functions.h
> > +++ b/gcc/config/arm/arm-mve-builtins-functions.h
> > @@ -986,8 +986,17 @@ public:
> >        m_float_memory_type (NUM_TYPE_SUFFIXES)
> >    {}
> >
> > -  unsigned int call_properties (const function_instance &) const override
> > +  unsigned int call_properties (const function_instance &instance) const 
> > override
> >    {
> > +    /* If the target does not support floating-point, we register FP vector
> > +       types as 'void'.  In this case, pretend we do not access memory to 
> > avoid
> > +       warnings about 'pure attribute on function returning void' when we
> > +       declare the intrinsics.  Such uses in user code are properly
> > +       diagnosed.  */
> > +    if (!TARGET_HAVE_MVE_FLOAT
> > +     && instance.type_suffix (0).float_p)
> > +      return 0;
> > +
> >      return CP_READ_MEMORY;
> >    }
> >
>

Reply via email to