An assertion check meant to verify that var loc expansions that didn't involve VALUEs (say constants, REGs, etc) didn't push values onto the dependency stack failed in an expansion of the argp reg, because equivalences for it are preserved at cselib table resets, and cselib later tries to expand it to equivalent expressions.
It's not profitable to expand it within var-tracking, and that's the only user of the CFA-base special-casing in cselib, so I arranged for argp to be preserved in expansions, just like other stack base registers. While debugging it, I noticed it was theoretically possible for the expression depth to remain uninitialized, and added an initialization and an assertion check to make sure it only remains zero when no location is found. Regstrapped on x86_64-linux-gnu and i686-linux-gnu. Ok to install?
for gcc/ChangeLog from Alexandre Oliva <aol...@redhat.com> PR debug/50869 * cselib.c (cfa_base_preserved_regno): Initialize. (cselib_expand_value_rtx_1): Don't expand it. * var-tracking.c (vt_expand_var_loc_chain): Initialize depth. Check it's only zero if result is NULL. Index: gcc/cselib.c =================================================================== --- gcc/cselib.c.orig 2011-10-27 18:32:20.137366314 -0200 +++ gcc/cselib.c 2011-10-27 18:27:05.387597000 -0200 @@ -185,7 +185,7 @@ static cselib_val dummy_val; that is constant through the whole function and should never be eliminated. */ static cselib_val *cfa_base_preserved_val; -static unsigned int cfa_base_preserved_regno; +static unsigned int cfa_base_preserved_regno = INVALID_REGNUM; /* Used to list all values that contain memory reference. May or may not contain the useless values - the list is compacted @@ -1451,7 +1451,7 @@ cselib_expand_value_rtx_1 (rtx orig, str if (GET_MODE (l->elt->val_rtx) == GET_MODE (orig)) { rtx result; - int regno = REGNO (orig); + unsigned regno = REGNO (orig); /* The only thing that we are not willing to do (this is requirement of dse and if others potential uses @@ -1471,7 +1471,8 @@ cselib_expand_value_rtx_1 (rtx orig, str make the frame assumptions. */ if (regno == STACK_POINTER_REGNUM || regno == FRAME_POINTER_REGNUM - || regno == HARD_FRAME_POINTER_REGNUM) + || regno == HARD_FRAME_POINTER_REGNUM + || regno == cfa_base_preserved_regno) return orig; bitmap_set_bit (evd->regs_active, regno); Index: gcc/var-tracking.c =================================================================== --- gcc/var-tracking.c.orig 2011-10-27 18:32:20.141366261 -0200 +++ gcc/var-tracking.c 2011-10-27 18:28:03.823813000 -0200 @@ -7764,7 +7764,7 @@ vt_expand_var_loc_chain (variable var, b bool pending_recursion; rtx loc_from = NULL; struct elt_loc_list *cloc = NULL; - int depth, saved_depth = elcd->depth; + int depth = 0, saved_depth = elcd->depth; /* Clear all backlinks pointing at this, so that we're not notified while we're active. */ @@ -7842,6 +7842,8 @@ vt_expand_var_loc_chain (variable var, b VAR_LOC_FROM (var) = loc_from; VAR_LOC_DEPTH (var) = depth; + gcc_checking_assert (!depth == !result); + elcd->depth = update_depth (saved_depth, depth); /* Indicate whether any of the dependencies are pending recursion
-- Alexandre Oliva, freedom fighter http://FSFLA.org/~lxoliva/ You must be the change you wish to see in the world. -- Gandhi Be Free! -- http://FSFLA.org/ FSF Latin America board member Free Software Evangelist Red Hat Brazil Compiler Engineer