Ping: [PATCH, PR 60556] Fix ICE on platforms with signed pointer extension.
Steve Ellcey
sellcey@mips.com
Thu Apr 10 19:57:00 GMT 2014
Patch ping. This is not a regression as I can reproduce it on GCC 4.8.*
but it is an ICE on legal C code. Any chance of having it approved for
4.9?
Steve Ellcey
sellcey@mips.com
On Thu, 2014-03-20 at 09:48 -0700, Steve Ellcey wrote:
> This patch fixes pr60556, a GCC ICE. The problem is in convert_move where,
> if we are trying to put a 32 bit address into a 64 bit destination we
> can wind up calling emit_move_insn with NULL_RTX as a source.
>
> The problem comes when creating fill_value. If unsignedp is false
> then we call emit_store_flag to set fill_value. If lowfrom is a symbol
> reference then emit_store_flag returns NULL_RTX (because symbol references
> are constant) and we wind up calling emit_move_insn with NULL_RTX as a
> source and getting an ICE.
>
> My fix is to check for a symbol reference up where we are already
> checking for memory references and force the symbol into a register
> before calling emit_store_flag. This will prevent emit_store_flag
> from returning NULL_RTX. In theory we could force the symbol
> reference into a register only if unsignedp is false, but I think
> it is cleaner to always put the symbol reference into a register.
>
> Tested on mips-mti-linux-gnu with no regressions.
>
> OK for checkin?
>
> Steve Ellcey
> sellcey@mips.com
>
>
> 2014-03-20 Steve Ellcey <sellcey@mips.com>
>
> PR middle-end/60556
> * expr.c (convert_move): Force symbol references into register.
>
>
> diff --git a/gcc/expr.c b/gcc/expr.c
> index be62c53..d065588 100644
> --- a/gcc/expr.c
> +++ b/gcc/expr.c
> @@ -533,7 +533,8 @@ convert_move (rtx to, rtx from, int unsignedp)
> conversion sequence might require several references to it and we
> must ensure we're getting the same value every time. */
>
> - if (MEM_P (from) || reg_overlap_mentioned_p (to, from))
> + if (MEM_P (from) || GET_CODE (from) == SYMBOL_REF
> + || reg_overlap_mentioned_p (to, from))
> from = force_reg (from_mode, from);
>
> /* Get a copy of FROM widened to a word, if necessary. */
>
>
>
> 2014-03-20 Steve Ellcey <sellcey@mips.com>
>
> PR middle-end/60556
> gcc.dg/pr60556.c: New.
>
>
> diff --git a/gcc/testsuite/gcc.dg/pr60556.c b/gcc/testsuite/gcc.dg/pr60556.c
> new file mode 100644
> index 0000000..3b5bbe5
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr60556.c
> @@ -0,0 +1,7 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +int g (int);
> +unsigned long long f(void) {
> + return (unsigned long long)(long)&g;
> +}
More information about the Gcc-patches
mailing list