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 var-tracking ICE (PR debug/46387)


On Thu, Nov 11, 2010 at 4:28 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Thu, Nov 11, 2010 at 11:45:50AM +0100, Richard Guenther wrote:
>> I see. ?I'm not sure I like the special just-for-vartracking function in alias.c
>> too much (in fact I hoped we can share it for selsched).
>
> Ok, here is a simpler version where it can't be reverted (except for
> init_alias_analysis) and var-tracking doesn't try to revert it.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, tested on the
> testcase with ia64-linux cross, ok for trunk?

After much discussion and no real solution to commonize all needs
I think this patch is ok if you add a comment to the function comment
that the function is private to var-tracking (and maybe rename it
to vt_equate_reg_base_value).

Thanks,
Richard.

> 2010-11-11 ?Jakub Jelinek ?<jakub@redhat.com>
>
> ? ? ? ?PR debug/46387
> ? ? ? ?* rtl.h (equate_reg_base_value): New prototype.
> ? ? ? ?* alias.c (equate_reg_base_value): New function.
> ? ? ? ?* var-tracking.c (vt_init_cfa_base): Use it.
>
> ? ? ? ?* gcc.dg/pr46387.c: New test.
>
> --- gcc/rtl.h.jj ? ? ? ?2010-11-10 13:14:41.000000000 +0100
> +++ gcc/rtl.h ? 2010-11-11 12:52:52.000000000 +0100
> @@ -2503,6 +2503,7 @@ extern int may_alias_p (const_rtx, const
> ?extern void init_alias_target (void);
> ?extern void init_alias_analysis (void);
> ?extern void end_alias_analysis (void);
> +extern void equate_reg_base_value (const_rtx, const_rtx);
> ?extern bool memory_modified_in_insn_p (const_rtx, const_rtx);
> ?extern rtx find_base_term (rtx);
> ?extern rtx gen_hard_reg_clobber (enum machine_mode, unsigned int);
> --- gcc/alias.c.jj ? ? ?2010-11-10 13:14:41.000000000 +0100
> +++ gcc/alias.c 2010-11-11 12:54:01.000000000 +0100
> @@ -2906,6 +2906,14 @@ init_alias_analysis (void)
> ? timevar_pop (TV_ALIAS_ANALYSIS);
> ?}
>
> +/* Equate REG_BASE_VALUE (reg1) to REG_BASE_VALUE (reg2). ?*/
> +
> +void
> +equate_reg_base_value (const_rtx reg1, const_rtx reg2)
> +{
> + ?VEC_replace (rtx, reg_base_value, REGNO (reg1), REG_BASE_VALUE (reg2));
> +}
> +
> ?void
> ?end_alias_analysis (void)
> ?{
> --- gcc/var-tracking.c.jj ? ? ? 2010-11-10 13:14:41.000000000 +0100
> +++ gcc/var-tracking.c ?2010-11-11 12:53:27.000000000 +0100
> @@ -8229,6 +8229,11 @@ vt_init_cfa_base (void)
> ? if (!MAY_HAVE_DEBUG_INSNS)
> ? ? return;
>
> + ?/* Tell alias analysis that cfa_base_rtx should share
> + ? ? find_base_term value with stack pointer or hard frame pointer. ?*/
> + ?equate_reg_base_value (cfa_base_rtx,
> + ? ? ? ? ? ? ? ? ? ? ? ?frame_pointer_needed
> + ? ? ? ? ? ? ? ? ? ? ? ?? hard_frame_pointer_rtx : stack_pointer_rtx);
> ? val = cselib_lookup_from_insn (cfa_base_rtx, GET_MODE (cfa_base_rtx), 1,
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? get_insns ());
> ? preserve_value (val);
> --- gcc/testsuite/gcc.dg/pr46387.c.jj ? 2010-11-11 12:52:52.000000000 +0100
> +++ gcc/testsuite/gcc.dg/pr46387.c ? ? ?2010-11-11 12:52:52.000000000 +0100
> @@ -0,0 +1,32 @@
> +/* PR debug/46387 */
> +/* { dg-do compile } */
> +/* { dg-options "-g -O2" } */
> +
> +struct S { double x; double y; short z; };
> +int a = 0, b = 0, c;
> +void bar (int, int, int);
> +void baz (int *, int *, int *);
> +
> +void
> +foo (struct S *v)
> +{
> + ?int x, y, z;
> + ?if (!a && b != 0)
> + ? ?return;
> + ?if (v->z)
> + ? ?baz (&x, &y, &z);
> + ?else
> + ? ?{
> + ? ? ?x = v->x;
> + ? ? ?y = v->y;
> + ? ?}
> + ?x = x / (5 + 1);
> + ?y = y / (5 + 1);
> + ?if (x < 0)
> + ? ?x = 0;
> + ?if (x > c - 1)
> + ? ?x = c - 1;
> + ?if (b == 0)
> + ? ?bar (x, y, 1);
> + ?return;
> +}
>
>
> ? ? ? ?Jakub
>


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