Message ID | 20101111152851.GE29412@tyan-ft48-01.lab.bos.redhat.com |
---|---|
State | New |
Headers | show |
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 >
--- 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; +}