One of my patches for PR 48866 regressed guality/asm-1.c on x86_64-linux-gnu because what used to be a single complex debug value expression became a chain of debug temps holding simpler expressions, and this chain exceeded the default recursion depth in resolving location expressions.
This patch introduces a param to control this depth, so that one can trade compile time for better debug info, and bumps up the default depth a bit, avoiding the regression. Regstrapped on x86_64-linux-gnu and i686-linux-gnu. Ok to install?
for gcc/ChangeLog from Alexandre Oliva <aol...@redhat.com> * params.def (PARAM_MAX_VARTRACK_EXPR_DEPTH): New. * doc/invoke.texi: Document max-vartrack-expr-depth. * var-tracking.c (EXPR_DEPTH): New. (reverse_op, vt_expand_loc, vt_expand_loc_dummy): Use it. Index: gcc/params.def =================================================================== --- gcc/params.def.orig 2011-05-30 03:16:26.496342009 -0300 +++ gcc/params.def 2011-05-30 03:35:17.852414343 -0300 @@ -839,6 +839,14 @@ DEFPARAM (PARAM_MAX_VARTRACK_SIZE, "Max. size of var tracking hash tables", 50000000, 0, 0) +/* Set maximum recursion depth for var tracking expression expansion + and resolution. */ + +DEFPARAM (PARAM_MAX_VARTRACK_EXPR_DEPTH, + "max-vartrack-expr-depth", + "Max. recursion depth for expanding var tracking expressions", + 10, 0, 0) + /* Set minimum insn uid for non-debug insns. */ DEFPARAM (PARAM_MIN_NONDEBUG_INSN_UID, Index: gcc/doc/invoke.texi =================================================================== --- gcc/doc/invoke.texi.orig 2011-05-30 03:40:14.716854423 -0300 +++ gcc/doc/invoke.texi 2011-05-30 03:46:29.349288790 -0300 @@ -8866,6 +8866,16 @@ the function. If the limit is exceeded tracking analysis is completely disabled for the function. Setting the parameter to zero makes it unlimited. +@item max-vartrack-expr-depth +Sets a maximum number of recursion levels when attempting to map +variable names or debug temporaries to value expressions. This trades +compile time for more complete debug information. If this is set too +low, value expressions that are available and could be represented in +debug information may end up not being used; setting this higher may +enable the compiler to find more complex debug expressions, but compile +time may grow exponentially, and even then, it may fail to find more +usable expressions. The default is 10. + @item min-nondebug-insn-uid Use uids starting at this parameter for nondebug insns. The range below the parameter is reserved exclusively for debug insns created by Index: gcc/var-tracking.c =================================================================== --- gcc/var-tracking.c.orig 2011-05-30 03:40:46.135898766 -0300 +++ gcc/var-tracking.c 2011-05-30 03:39:35.745798000 -0300 @@ -5215,6 +5215,8 @@ add_uses_1 (rtx *x, void *cui) for_each_rtx (x, add_uses, cui); } +#define EXPR_DEPTH (PARAM_VALUE (PARAM_MAX_VARTRACK_EXPR_DEPTH)) + /* Attempt to reverse the EXPR operation in the debug info. Say for reg1 = reg2 + 6 even when reg2 is no longer live we can express its value as VAL - 6. */ @@ -5286,7 +5288,7 @@ reverse_op (rtx val, const_rtx expr) arg = XEXP (src, 1); if (!CONST_INT_P (arg) && GET_CODE (arg) != SYMBOL_REF) { - arg = cselib_expand_value_rtx (arg, scratch_regs, 5); + arg = cselib_expand_value_rtx (arg, scratch_regs, EXPR_DEPTH); if (arg == NULL_RTX) return NULL_RTX; if (!CONST_INT_P (arg) && GET_CODE (arg) != SYMBOL_REF) @@ -7416,7 +7418,7 @@ vt_expand_loc (rtx loc, htab_t vars, boo data.dummy = false; data.cur_loc_changed = false; data.ignore_cur_loc = ignore_cur_loc; - loc = cselib_expand_value_rtx_cb (loc, scratch_regs, 8, + loc = cselib_expand_value_rtx_cb (loc, scratch_regs, EXPR_DEPTH, vt_expand_loc_callback, &data); if (loc && MEM_P (loc)) @@ -7438,7 +7440,7 @@ vt_expand_loc_dummy (rtx loc, htab_t var data.dummy = true; data.cur_loc_changed = false; data.ignore_cur_loc = false; - ret = cselib_dummy_expand_value_rtx_cb (loc, scratch_regs, 8, + ret = cselib_dummy_expand_value_rtx_cb (loc, scratch_regs, EXPR_DEPTH, vt_expand_loc_callback, &data); *pcur_loc_changed = data.cur_loc_changed; return ret;
-- 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