This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix ICE in expand_debug_expr on CONJ_EXPR (PR debug/41717, take 2)


On Fri, Oct 16, 2009 at 10:33 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Fri, Oct 16, 2009 at 01:23:58AM +0200, Jakub Jelinek wrote:
>> CONJ_EXPR wasn't handled by expand_debug_expr, this patch handles at least
>> the easy cases.
>
> Actually, it is not hard to handle even the rest of cases using
> ZERO_EXTRACT.
> And, while looking at how dwarf2out.c handles ZERO_EXTRACT I've noticed that
> it could avoid doing shifts by 0.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok.

Thanks,
Richard.

> 2009-10-16 ?Jakub Jelinek ?<jakub@redhat.com>
>
> ? ? ? ?PR debug/41717
> ? ? ? ?* cfgexpand.c (expand_debug_expr): Handle CONJ_EXPR.
> ? ? ? ?* dwarf2out.c (mem_loc_descriptor): Don't handle
> ? ? ? ?POST_INT/POST_DEC/POST_MODIFY like SUBREG. ?For SUBREG
> ? ? ? ?punt if it is not lowpart subreg or if inner mode isn't
> ? ? ? ?MODE_INT. ?Avoid shifts with count zero in
> ? ? ? ?ZERO_EXTRACT/SIGN_EXTRACT expansion.
>
> ? ? ? ?* gcc.dg/debug/pr41717.c: New test.
>
> --- gcc/cfgexpand.c ? ? 2009-10-15 23:14:21.000000000 +0200
> +++ gcc/cfgexpand.c ? ? 2009-10-16 01:45:11.000000000 +0200
> @@ -2869,6 +2869,46 @@
> ? ? ? ?op1 = gen_rtx_CONST (GET_MODE_INNER (mode), op1);
> ? ? ? return gen_rtx_CONCAT (mode, op0, op1);
>
> + ? ?case CONJ_EXPR:
> + ? ? ?if (GET_CODE (op0) == CONCAT)
> + ? ? ? return gen_rtx_CONCAT (mode, XEXP (op0, 0),
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?gen_rtx_NEG (GET_MODE_INNER (mode),
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? XEXP (op0, 1)));
> + ? ? ?else
> + ? ? ? {
> + ? ? ? ? enum machine_mode imode = GET_MODE_INNER (mode);
> + ? ? ? ? rtx re, im;
> +
> + ? ? ? ? if (MEM_P (op0))
> + ? ? ? ? ? {
> + ? ? ? ? ? ? re = adjust_address_nv (op0, imode, 0);
> + ? ? ? ? ? ? im = adjust_address_nv (op0, imode, GET_MODE_SIZE (imode));
> + ? ? ? ? ? }
> + ? ? ? ? else
> + ? ? ? ? ? {
> + ? ? ? ? ? ? enum machine_mode ifmode = int_mode_for_mode (mode);
> + ? ? ? ? ? ? enum machine_mode ihmode = int_mode_for_mode (imode);
> + ? ? ? ? ? ? rtx halfsize;
> + ? ? ? ? ? ? if (ifmode == BLKmode || ihmode == BLKmode)
> + ? ? ? ? ? ? ? return NULL;
> + ? ? ? ? ? ? halfsize = GEN_INT (GET_MODE_BITSIZE (ihmode));
> + ? ? ? ? ? ? re = op0;
> + ? ? ? ? ? ? if (mode != ifmode)
> + ? ? ? ? ? ? ? re = gen_rtx_SUBREG (ifmode, re, 0);
> + ? ? ? ? ? ? re = gen_rtx_ZERO_EXTRACT (ihmode, re, halfsize, const0_rtx);
> + ? ? ? ? ? ? if (imode != ihmode)
> + ? ? ? ? ? ? ? re = gen_rtx_SUBREG (imode, re, 0);
> + ? ? ? ? ? ? im = copy_rtx (op0);
> + ? ? ? ? ? ? if (mode != ifmode)
> + ? ? ? ? ? ? ? im = gen_rtx_SUBREG (ifmode, im, 0);
> + ? ? ? ? ? ? im = gen_rtx_ZERO_EXTRACT (ihmode, im, halfsize, halfsize);
> + ? ? ? ? ? ? if (imode != ihmode)
> + ? ? ? ? ? ? ? im = gen_rtx_SUBREG (imode, im, 0);
> + ? ? ? ? ? }
> + ? ? ? ? im = gen_rtx_NEG (imode, im);
> + ? ? ? ? return gen_rtx_CONCAT (mode, re, im);
> + ? ? ? }
> +
> ? ? case ADDR_EXPR:
> ? ? ? op0 = expand_debug_expr (TREE_OPERAND (exp, 0));
> ? ? ? if (!op0 || !MEM_P (op0))
> --- gcc/dwarf2out.c ? ? 2009-10-15 23:14:21.000000000 +0200
> +++ gcc/dwarf2out.c ? ? 2009-10-16 01:51:02.000000000 +0200
> @@ -12894,10 +12894,7 @@
> ? ? case POST_INC:
> ? ? case POST_DEC:
> ? ? case POST_MODIFY:
> - ? ? ?/* POST_INC and POST_DEC can be handled just like a SUBREG. ?So we
> - ? ? ? ?just fall into the SUBREG code. ?*/
> -
> - ? ? ?/* ... fall through ... ?*/
> + ? ? ?return mem_loc_descriptor (XEXP (rtl, 0), mode, initialized);
>
> ? ? case SUBREG:
> ? ? ? /* The case of a subreg may arise when we have a local (register)
> @@ -12905,9 +12902,13 @@
> ? ? ? ? up an entire register. ?For now, just assume that it is
> ? ? ? ? legitimate to make the Dwarf info refer to the whole register which
> ? ? ? ? contains the given subreg. ?*/
> - ? ? ?rtl = XEXP (rtl, 0);
> + ? ? ?if (!subreg_lowpart_p (rtl))
> + ? ? ? break;
> + ? ? ?rtl = SUBREG_REG (rtl);
> ? ? ? if (GET_MODE_SIZE (GET_MODE (rtl)) > DWARF2_ADDR_SIZE)
> ? ? ? ?break;
> + ? ? ?if (GET_MODE_CLASS (GET_MODE (rtl)) != MODE_INT)
> + ? ? ? break;
> ? ? ? mem_loc_result = mem_loc_descriptor (rtl, mode, initialized);
> ? ? ? break;
>
> @@ -13392,12 +13393,19 @@
> ? ? ? ? ?if (BITS_BIG_ENDIAN)
> ? ? ? ? ? ?shift = GET_MODE_BITSIZE (GET_MODE (XEXP (rtl, 0)))
> ? ? ? ? ? ? ? ? ? ?- shift - size;
> - ? ? ? ? add_loc_descr (&mem_loc_result,
> - ? ? ? ? ? ? ? ? ? ? ? ?int_loc_descriptor (DWARF2_ADDR_SIZE - shift - size));
> - ? ? ? ? add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_shl, 0, 0));
> - ? ? ? ? add_loc_descr (&mem_loc_result,
> - ? ? ? ? ? ? ? ? ? ? ? ?int_loc_descriptor (DWARF2_ADDR_SIZE - size));
> - ? ? ? ? add_loc_descr (&mem_loc_result, new_loc_descr (op, 0, 0));
> + ? ? ? ? if (shift + size != DWARF2_ADDR_SIZE)
> + ? ? ? ? ? {
> + ? ? ? ? ? ? add_loc_descr (&mem_loc_result,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ?int_loc_descriptor (DWARF2_ADDR_SIZE
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?- shift - size));
> + ? ? ? ? ? ? add_loc_descr (&mem_loc_result, new_loc_descr (DW_OP_shl, 0, 0));
> + ? ? ? ? ? }
> + ? ? ? ? if (size != DWARF2_ADDR_SIZE)
> + ? ? ? ? ? {
> + ? ? ? ? ? ? add_loc_descr (&mem_loc_result,
> + ? ? ? ? ? ? ? ? ? ? ? ? ? ?int_loc_descriptor (DWARF2_ADDR_SIZE - size));
> + ? ? ? ? ? ? add_loc_descr (&mem_loc_result, new_loc_descr (op, 0, 0));
> + ? ? ? ? ? }
> ? ? ? ?}
> ? ? ? break;
>
> --- gcc/testsuite/gcc.dg/debug/pr41717.c.jj ? ? 2009-10-15 23:13:24.000000000 +0200
> +++ gcc/testsuite/gcc.dg/debug/pr41717.c ? ? ? ?2009-10-15 23:12:52.000000000 +0200
> @@ -0,0 +1,10 @@
> +/* PR debug/41717 */
> +/* { dg-do compile } */
> +
> +void
> +foo (void)
> +{
> + ?_Complex float v[1], w;
> + ?v[1] = 0.0f + 0.8fi;
> + ?w = __builtin_conjf (v[1] * v[1]);
> +}
>
> ? ? ? ?Jakub
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]