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. --- 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; } -- 2.34.1