This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] [ARC] Handle complex PIC move patterns.
- From: Andrew Burgess <andrew dot burgess at embecosm dot com>
- To: Claudiu Zissulescu <Claudiu dot Zissulescu at synopsys dot com>
- Cc: gcc-patches at gcc dot gnu dot org, Francois dot Bedard at synopsys dot com
- Date: Fri, 3 Mar 2017 17:22:50 +0000
- Subject: Re: [PATCH] [ARC] Handle complex PIC move patterns.
- Authentication-results: sourceware.org; auth=none
- References: <1488297598-1887-1-git-send-email-claziss@synopsys.com>
* Claudiu Zissulescu <Claudiu.Zissulescu@synopsys.com> [2017-02-28 16:59:58 +0100]:
> Hi,
>
> 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.
>
> Ok to apply?
> Claudiu
There's a couple of spelling mistakes I've marked inline, but
otherwise, this seems sensible.
Thanks,
Andrew
>
> gcc/
> 2017-02-28 Claudiu Zissulescu <claziss@synopsys.com>
>
> * config/arc/arc.c (arc_legitimize_pic_address): Handle PIC
> expressions with MINUS and UNARY ops.
>
> gcc/testsuite
> 2017-02-28 Claudiu Zissulescu <claziss@synopsys.com>
>
> * gcc.target/arc/pr9001090948.c: New file.
> ---
> gcc/config/arc/arc.c | 49 ++++++++++++++++++++++++++++-
> gcc/testsuite/gcc.target/arc/pr9001090948.c | 25 +++++++++++++++
> 2 files changed, 73 insertions(+), 1 deletion(-)
> create mode 100644 gcc/testsuite/gcc.target/arc/pr9001090948.c
>
> diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
> index 508a9a6..3b94d7c 100644
> --- a/gcc/config/arc/arc.c
> +++ b/gcc/config/arc/arc.c
> @@ -5024,8 +5024,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 rezulting in complex patterns that are not
s/rezulting/resulting/
> + supported by the current implementation. The following
> + two if-cases are simplifying the complex patters in
s/patters in/patterns 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)
> diff --git a/gcc/testsuite/gcc.target/arc/pr9001090948.c b/gcc/testsuite/gcc.target/arc/pr9001090948.c
> new file mode 100644
> index 0000000..103f4ae
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/arc/pr9001090948.c
> @@ -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;
> +}
> --
> 1.9.1
>