https://gcc.gnu.org/g:c4d3dba253b49fb0e8e32109783f76453bc53653

commit r15-2838-gc4d3dba253b49fb0e8e32109783f76453bc53653
Author: Georg-Johann Lay <a...@gjlay.de>
Date:   Thu Aug 8 18:31:16 2024 +0200

    AVR: target/116295 - Fix unrecognizable insn with __flash read.
    
    Some loads from non-generic address-spaces are performed by
    libgcc calls, and they don't have a POST_INC form.  Don't consider
    such insns when running -mfuse-add.
    
         PR target/116295
    gcc/
            * config/avr/avr.cc (Mem_Insn::Mem_Insn): Don't consider MEMs
            that are avr_mem_memx_p or avr_load_libgcc_p.
    
    gcc/testsuite/
            * gcc.target/avr/torture/pr116295.c: New test.

Diff:
---
 gcc/config/avr/avr.cc                           |  4 ++++
 gcc/testsuite/gcc.target/avr/torture/pr116295.c | 22 ++++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc
index 0b3fd7a36d00..5cfd67a8e742 100644
--- a/gcc/config/avr/avr.cc
+++ b/gcc/config/avr/avr.cc
@@ -2121,6 +2121,10 @@ avr_pass_fuse_add::Mem_Insn::Mem_Insn (rtx_insn *insn)
   else
     return;
 
+  if (avr_mem_memx_p (mem)
+      || avr_load_libgcc_p (mem))
+    return;
+
   addr = XEXP (mem, 0);
   addr_code = GET_CODE (addr);
 
diff --git a/gcc/testsuite/gcc.target/avr/torture/pr116295.c 
b/gcc/testsuite/gcc.target/avr/torture/pr116295.c
new file mode 100644
index 000000000000..0b3d380ff147
--- /dev/null
+++ b/gcc/testsuite/gcc.target/avr/torture/pr116295.c
@@ -0,0 +1,22 @@
+/* { dg-do link } */
+/* { dg-additional-options "-std=gnu99" } */
+
+#ifdef __FLASH
+
+long val;
+
+__attribute__((used))
+const __flash long*
+load4_flash (const __flash long *p)
+{
+    val += *p++;
+    val += *p++;
+    return p;
+}
+
+#endif
+
+int main (void)
+{
+       return 0;
+}

Reply via email to