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

Reply via email to