[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:
parent
16e93e4b0b
commit
14555394f4
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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;
|
||||
}
|
Loading…
Reference in New Issue