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