[ARC] Handle complex PIC move patterns.

fwprop step is placing in the REG_EQUIV notes constant pic unspecs
expressions.  Then, loop may use these notes for optimizations
rezulting in complex patterns that are not supported by the current
implementation.

The patch adds handling of complex PIC addresses having MINUS or UNARY
operations.

gcc/
2017-03-13  Claudiu Zissulescu  <claziss@synopsys.com>

	* config/arc/arc.c (arc_legitimize_pic_address): Handle PIC
	expressions with MINUS and UNARY ops.

gcc/testsuite
2017-03-13  Claudiu Zissulescu  <claziss@synopsys.com>

	* gcc.target/arc/pr9001090948.c: New file.

From-SVN: r246087
This commit is contained in:
Claudiu Zissulescu 2017-03-13 13:55:38 +01:00 committed by Claudiu Zissulescu
parent 16e93e4b0b
commit 14555394f4
4 changed files with 82 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2017-03-13 Claudiu Zissulescu <claziss@synopsys.com>
* config/arc/arc.c (arc_legitimize_pic_address): Handle PIC
expressions with MINUS and UNARY ops.
2017-03-13 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/79911

View File

@ -4900,8 +4900,55 @@ arc_legitimize_pic_address (rtx orig, rtx oldx)
/* Check that the unspec is one of the ones we generate? */
return orig;
}
/* fwprop is placing in the REG_EQUIV notes constant pic
unspecs expressions. Then, loop may use these notes for
optimizations resulting in complex patterns that are not
supported by the current implementation. The following
two if-cases are simplifying the complex patters to
simpler ones. */
else if (GET_CODE (addr) == MINUS)
{
rtx op0 = XEXP (addr, 0);
rtx op1 = XEXP (addr, 1);
gcc_assert (oldx);
gcc_assert (GET_CODE (op1) == UNSPEC);
emit_move_insn (oldx,
gen_rtx_CONST (SImode,
arc_legitimize_pic_address (op1,
NULL_RTX)));
emit_insn (gen_rtx_SET (oldx, gen_rtx_MINUS (SImode, op0, oldx)));
return oldx;
}
else if (GET_CODE (addr) != PLUS)
{
rtx tmp = XEXP (addr, 0);
enum rtx_code code = GET_CODE (addr);
/* It only works for UNARY operations. */
gcc_assert (UNARY_P (addr));
gcc_assert (GET_CODE (tmp) == UNSPEC);
gcc_assert (oldx);
emit_move_insn
(oldx,
gen_rtx_CONST (SImode,
arc_legitimize_pic_address (tmp,
NULL_RTX)));
emit_insn (gen_rtx_SET (oldx,
gen_rtx_fmt_ee (code, SImode,
oldx, const0_rtx)));
return oldx;
}
else
gcc_assert (GET_CODE (addr) == PLUS);
{
gcc_assert (GET_CODE (addr) == PLUS);
if (GET_CODE (XEXP (addr, 0)) == UNSPEC)
return orig;
}
}
if (GET_CODE (addr) == PLUS)

View File

@ -1,3 +1,7 @@
2017-03-13 Claudiu Zissulescu <claziss@synopsys.com>
* testsuite/gcc.target/arc/pr9001090948.c: New file.
2017-03-11 Segher Boessenkool <segher@kernel.crashing.org>
* lib/target-supports.exp (check_effective_target_broken_cplxf_arg):

View File

@ -0,0 +1,25 @@
/* { dg-do compile } */
/* { dg-skip-if "ARC600 doesn't support pic" { arc6xx } } */
/* { dg-options "-Os -fPIC" } */
#include <stdio.h>
#include <string.h>
char *
strip_trail (const char str[], size_t n)
{
static char buf[1025];
int j;
strncpy (buf, str, n);
buf[n] = '\0';
for (j = strlen (buf) - 1; j >= 0; j--)
{
if (buf[j] != ' ')
break;
buf[j] = '\0';
}
return buf;
}