From: Alexandre Oliva Date: Tue, 31 May 2011 16:25:50 +0000 (+0000) Subject: params.def (PARAM_MAX_VARTRACK_EXPR_DEPTH): New. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=f0686e7897527411f7d0d68b723789f294ecf73a;p=gcc.git params.def (PARAM_MAX_VARTRACK_EXPR_DEPTH): New. * 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. From-SVN: r174494 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e4aa9074081..e1e32af417c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-05-31 Alexandre Oliva + + * 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. + 2011-05-31 Alexandre Oliva * config/i386/i386.c (ix86_rtx_costs): Drop NEG from sub for FMA. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 4b54c4abdae..20ee33bb16a 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -8940,6 +8940,16 @@ the function. If the limit is exceeded even without debug insns, var 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 diff --git a/gcc/params.def b/gcc/params.def index fa89a5221ec..2ed0acac36c 100644 --- a/gcc/params.def +++ b/gcc/params.def @@ -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, diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 2c16d08e02c..488635d7f64 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -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, bool ignore_cur_loc) 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 vars, bool *pcur_loc_changed) 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;