On Thu, Jan 26, 2012 at 10:03 PM, Jakub Jelinek <ja...@redhat.com> wrote: > Hi! > > When a VALUE contains already some constant location, it will be always > preferable to expressing it by some other expression - const (or some > similar reverse operation), so we just should point at adding the > reverse_op. > > This fixes the testcase from the PR on mips64-linux, bootstrapped/regtested > on x86_64-linux and i686-linux, ok for trunk?
Ok. Thanks, Richard. > 2012-01-26 Jakub Jelinek <ja...@redhat.com> > > PR debug/52001 > * var-tracking.c (reverse_op): Don't add any reverse operation > if V already has any constant locations. > > --- gcc/var-tracking.c.jj 2012-01-23 18:23:45.000000000 +0100 > +++ gcc/var-tracking.c 2012-01-26 16:37:20.110049563 +0100 > @@ -5298,6 +5298,7 @@ reverse_op (rtx val, const_rtx expr, rtx > { > rtx src, arg, ret; > cselib_val *v; > + struct elt_loc_list *l; > enum rtx_code code; > > if (GET_CODE (expr) != SET) > @@ -5333,6 +5334,14 @@ reverse_op (rtx val, const_rtx expr, rtx > if (!v || !cselib_preserved_value_p (v)) > return; > > + /* Adding a reverse op isn't useful if V already has an always valid > + location. Ignore ENTRY_VALUE, while it is always constant, we should > + prefer non-ENTRY_VALUE locations whenever possible. */ > + for (l = v->locs; l; l = l->next) > + if (CONSTANT_P (l->loc) > + && (GET_CODE (l->loc) != CONST || !references_value_p (l->loc, 0))) > + return; > + > switch (GET_CODE (src)) > { > case NOT: > > Jakub