aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorg-Johann Lay <avr@gjlay.de>2024-08-08 18:31:16 +0200
committerGeorg-Johann Lay <avr@gjlay.de>2024-08-08 18:39:45 +0200
commitc4d3dba253b49fb0e8e32109783f76453bc53653 (patch)
tree87224820d9662e9ff7f0fe14393fe7a9d58dc9c3
parentf6a41ebb5b45be22959afba2fa2b5cf42450378a (diff)
downloadgcc-c4d3dba253b49fb0e8e32109783f76453bc53653.zip
gcc-c4d3dba253b49fb0e8e32109783f76453bc53653.tar.gz
gcc-c4d3dba253b49fb0e8e32109783f76453bc53653.tar.bz2
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.
-rw-r--r--gcc/config/avr/avr.cc4
-rw-r--r--gcc/testsuite/gcc.target/avr/torture/pr116295.c22
2 files changed, 26 insertions, 0 deletions
diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc
index 0b3fd7a..5cfd67a 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 0000000..0b3d380
--- /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;
+}