On Mon, May 30, 2011 at 07:35:58AM -0300, Alexandre Oliva wrote:
> 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?

I support this, after all I had to bump it from 8 to 10 already in
my http://gcc.gnu.org/ml/gcc-patches/2011-05/msg01182.html pending review.

> 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;

        Jakub

Reply via email to