Commit 14555394 by Claudiu Zissulescu Committed by Claudiu Zissulescu

[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
parent 16e93e4b
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> 2017-03-13 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR target/79911 PR target/79911
......
...@@ -4900,8 +4900,55 @@ arc_legitimize_pic_address (rtx orig, rtx oldx) ...@@ -4900,8 +4900,55 @@ arc_legitimize_pic_address (rtx orig, rtx oldx)
/* Check that the unspec is one of the ones we generate? */ /* Check that the unspec is one of the ones we generate? */
return orig; 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 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) if (GET_CODE (addr) == PLUS)
......
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> 2017-03-11 Segher Boessenkool <segher@kernel.crashing.org>
* lib/target-supports.exp (check_effective_target_broken_cplxf_arg): * lib/target-supports.exp (check_effective_target_broken_cplxf_arg):
......
/* { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment