]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
arm: [MVE intrinsics] Fix support for loads [PR target/114323]
authorChristophe Lyon <christophe.lyon@linaro.org>
Fri, 15 Mar 2024 19:55:43 +0000 (19:55 +0000)
committerChristophe Lyon <christophe.lyon@linaro.org>
Tue, 19 Mar 2024 08:19:08 +0000 (08:19 +0000)
The testcase in this PR shows that we would load from an uninitialized
location, because the vld1 instrinsics are reported as "const". This
is because function_instance::reads_global_state_p() does not take
CP_READ_MEMORY into account.  Fixing this gives vld1 the "pure"
attribute instead, and solves the problem.

2024-03-15  Christophe Lyon  <christophe.lyon@linaro.org>

PR target/114323
gcc/
* config/arm/arm-mve-builtins.cc
(function_instance::reads_global_state_p): Take CP_READ_MEMORY
into account.

gcc/testsuite/
* gcc.target/arm/mve/pr114323.c: New.

gcc/config/arm/arm-mve-builtins.cc
gcc/testsuite/gcc.target/arm/mve/pr114323.c [new file with mode: 0644]

index c533d0e93ae3f8df8820506befbaa0254192ea17..7e8217666feedf3b27326c4f90736f0e61f68c69 100644 (file)
@@ -657,7 +657,7 @@ function_instance::reads_global_state_p () const
   if (flags & CP_READ_FPCR)
     return true;
 
-  return false;
+  return flags & CP_READ_MEMORY;
 }
 
 /* Return true if calls to the function could modify some form of
diff --git a/gcc/testsuite/gcc.target/arm/mve/pr114323.c b/gcc/testsuite/gcc.target/arm/mve/pr114323.c
new file mode 100644 (file)
index 0000000..bd9127b
--- /dev/null
@@ -0,0 +1,22 @@
+/* { dg-do run } */
+/* { dg-require-effective-target arm_mve_hw } */
+/* { dg-options "-O2" } */
+/* { dg-add-options arm_v8_1m_mve_fp } */
+
+#include <arm_mve.h>
+
+__attribute__((noipa))
+uint32x4_t foo (void) {
+  uint32x4_t V0 = vld1q_u32(((const uint32_t[4]){1, 2, 3, 4}));
+  return V0;
+}
+
+int main(void)
+{
+  uint32_t buf[4];
+ vst1q_u32 (buf, foo());
+
+  for (int i = 0; i < 4; i++)
+    if (buf[i] != i+1)
+      __builtin_abort ();
+}