https://gcc.gnu.org/g:90f2f90d2b5c3a2f156b649d717c7dad0ebf1bf0
commit r17-596-g90f2f90d2b5c3a2f156b649d717c7dad0ebf1bf0 Author: Christophe Lyon <[email protected]> Date: Fri Apr 24 13:14:47 2026 +0000 arm: Fix MVE load/store with writeback intrinsics [PR124870] These intrinsics (vldr*_gather_base_wb, vstr*_scatter_base_wb) lacked modelling of memory accesses corresponding to writeback: in this case, they both read and write memory. 2024-04-24 Christophe Lyon <[email protected]> PR target/124870 gcc/ * config/arm/arm-mve-builtins-base.cc (vstrq_scatter_base_impl) (vldrq_gather_base_impl): Fix call_properties. gcc/testsuite/ * gcc.target/arm/mve/intrinsics/pr124870.c: New test. Diff: --- gcc/config/arm/arm-mve-builtins-base.cc | 15 +++++++++-- .../gcc.target/arm/mve/intrinsics/pr124870.c | 31 ++++++++++++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/gcc/config/arm/arm-mve-builtins-base.cc b/gcc/config/arm/arm-mve-builtins-base.cc index b344aca3f55d..eaac4316d6b8 100644 --- a/gcc/config/arm/arm-mve-builtins-base.cc +++ b/gcc/config/arm/arm-mve-builtins-base.cc @@ -294,9 +294,12 @@ public: : m_to_int_mode (to_int_mode) {} - unsigned int call_properties (const function_instance &) const override + unsigned int call_properties (const function_instance &fi) const override { - return CP_WRITE_MEMORY; + if (fi.mode_suffix_id == MODE_wb) + return CP_WRITE_MEMORY | CP_READ_MEMORY; + else + return CP_WRITE_MEMORY; } machine_mode memory_vector_mode (const function_instance &fi) const override @@ -480,6 +483,14 @@ public: return type_suffixes[suffix].vector_mode; } + unsigned int call_properties (const function_instance &fi) const override + { + if (fi.mode_suffix_id == MODE_wb) + return CP_WRITE_MEMORY | CP_READ_MEMORY; + else + return CP_READ_MEMORY; + } + rtx expand (function_expander &e) const override { insn_code icode; diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/pr124870.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/pr124870.c new file mode 100644 index 000000000000..cfb41da8039c --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/pr124870.c @@ -0,0 +1,31 @@ +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */ +/* { dg-add-options arm_v8_1m_mve_fp } */ +/* { dg-additional-options "-O2" } */ + +/* PR target/124870. */ + +#include <arm_mve.h> + +#ifdef __cplusplus +extern "C" { +#endif + +void fn (int n, uint32_t *strides, float32_t *f) +{ + uint32x4_t vecScGathAddr = vld1q_u32(strides); + float32x4_t vecA = vldrwq_gather_base_wb_f32(&vecScGathAddr, 64); + float32x4_t vecB = vecA; + int i; + for (i = 0; i < n; ++i) + { + vecA = vldrwq_gather_base_wb_f32(&vecScGathAddr, 64); + vecB = vaddq_f32 (vecB, vecA); + } + vstrwq_f32 (f, vecB); +} + +#ifdef __cplusplus +} +#endif + +/* { dg-final { scan-assembler-times "vadd.f32\tq\[0-9\]+, q\[0-9\]+, q\[0-9\]+" 1 } } */
