[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
This commit is contained in:
Claudiu Zissulescu 2017-11-30 15:41:49 +01:00 committed by Claudiu Zissulescu
parent e47b37ca82
commit 31e72f4f37
4 changed files with 39 additions and 0 deletions

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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;
}