aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudiu Zissulescu <claziss@synopsys.com>2017-11-30 15:41:49 +0100
committerClaudiu Zissulescu <claziss@gcc.gnu.org>2017-11-30 15:41:49 +0100
commit31e72f4f37b9ed02cd5e28a30c7c4b46b96ac913 (patch)
tree94f57267b8c30942a3250e1ee99deb3db573c34f
parente47b37ca827cd694e17b8688205cb889751b528d (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/config/arc/arc.c12
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/arc/lra-1.c17
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;
+}