diff options
author | Claudiu Zissulescu <claziss@synopsys.com> | 2017-11-30 15:41:49 +0100 |
---|---|---|
committer | Claudiu Zissulescu <claziss@gcc.gnu.org> | 2017-11-30 15:41:49 +0100 |
commit | 31e72f4f37b9ed02cd5e28a30c7c4b46b96ac913 (patch) | |
tree | 94f57267b8c30942a3250e1ee99deb3db573c34f | |
parent | e47b37ca827cd694e17b8688205cb889751b528d (diff) | |
download | gcc-31e72f4f37b9ed02cd5e28a30c7c4b46b96ac913.zip gcc-31e72f4f37b9ed02cd5e28a30c7c4b46b96ac913.tar.gz gcc-31e72f4f37b9ed02cd5e28a30c7c4b46b96ac913.tar.bz2 |
[ARC] Use TARGET_CANNOT_SUBSTITUTE_MEM_EQUIV.
Sometimes the memory equivalent is not valid due to a large offset.
For example replacing the ap register with its fp/sp-equivalent during
LRA step. To solve this we introduced TARGET_CANNOT_SUBSTITUTE_MEM_EQUIV.
gcc/
2017-08-08 Claudiu Zissulescu <claziss@synopsys.com>
* config/arc/arc.c (arc_cannot_substitute_mem_equiv_p): New function.
(TARGET_CANNOT_SUBSTITUTE_MEM_EQUIV_P): Define.
gcc/testsuite
2017-08-08 Claudiu Zissulescu <claziss@synopsys.com>
* gcc.target/arc/lra-1.c: New test.
From-SVN: r255273
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/arc/arc.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arc/lra-1.c | 17 |
4 files changed, 39 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 776508a..ddcd983 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-11-30 Claudiu Zissulescu <claziss@synopsys.com> + + * config/arc/arc.c (arc_cannot_substitue_mem_equiv_p): New + function. + (TARGET_CANNOT_SUBSTITUTE_MEM_EQUIV_P): Define. + 2017-11-30 Jakub Jelinek <jakub@redhat.com> PR target/83210 diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c index 55265cb..e739d60 100644 --- a/gcc/config/arc/arc.c +++ b/gcc/config/arc/arc.c @@ -10805,12 +10805,24 @@ arc_use_anchors_for_symbol_p (const_rtx symbol) return default_use_anchors_for_symbol_p (symbol); } +/* Return true if SUBST can't safely replace its equivalent during RA. */ +static bool +arc_cannot_substitute_mem_equiv_p (rtx) +{ + /* If SUBST is mem[base+index], the address may not fit ISA, + thus return true. */ + return true; +} + #undef TARGET_USE_ANCHORS_FOR_SYMBOL_P #define TARGET_USE_ANCHORS_FOR_SYMBOL_P arc_use_anchors_for_symbol_p #undef TARGET_CONSTANT_ALIGNMENT #define TARGET_CONSTANT_ALIGNMENT constant_alignment_word_strings +#undef TARGET_CANNOT_SUBSTITUTE_MEM_EQUIV_P +#define TARGET_CANNOT_SUBSTITUTE_MEM_EQUIV_P arc_cannot_substitute_mem_equiv_p + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-arc.h" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d1425a5..f12d075 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2017-11-30 Claudiu Zissulescu <claziss@synopsys.com> + + * gcc.target/arc/lra-1.c: New test. + 2017-11-30 Will Schmidt <will_schmidt@vnet.ibm.com> * gcc.target/powerpc/fold-vec-abs-char-fwrapv.c: Add xxspltib insn diff --git a/gcc/testsuite/gcc.target/arc/lra-1.c b/gcc/testsuite/gcc.target/arc/lra-1.c new file mode 100644 index 0000000..27336d1 --- /dev/null +++ b/gcc/testsuite/gcc.target/arc/lra-1.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-options "-Os -w -mlra" } */ + +/* ap is replaced with an address like base+offset by lra, + where offset is larger than s9, resulting into an ICE. */ + +typedef struct { char a[500] } b; +c; +struct d { + short e; + b f +} g(int h, int i, int j, int k, char l, int m, int n, char *p) { +again:; + struct d o; + *p = c = ({ q(o); }); + goto again; +} |