diff options
author | Georg-Johann Lay <avr@gjlay.de> | 2024-08-08 18:31:16 +0200 |
---|---|---|
committer | Georg-Johann Lay <avr@gjlay.de> | 2024-08-08 18:39:45 +0200 |
commit | c4d3dba253b49fb0e8e32109783f76453bc53653 (patch) | |
tree | 87224820d9662e9ff7f0fe14393fe7a9d58dc9c3 | |
parent | f6a41ebb5b45be22959afba2fa2b5cf42450378a (diff) | |
download | gcc-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.cc | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/avr/torture/pr116295.c | 22 |
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; +} |