Commit 6cfa417f by Jakub Jelinek

re PR debug/56510 (More var-tracking scalability problems)

	PR debug/56510
	* cfgexpand.c (expand_debug_parm_decl): Call copy_rtx on incoming.
	(avoid_complex_debug_insns): New function.
	(expand_debug_locations): Call it.

	* gcc.dg/pr56510.c: New test.

From-SVN: r196479
parent 7ead14d4
2013-03-05 David Holsgrove <david.holsgrove@xilinx.com> 2013-03-05 Jakub Jelinek <jakub@redhat.com>
PR debug/56510
* cfgexpand.c (expand_debug_parm_decl): Call copy_rtx on incoming.
(avoid_complex_debug_insns): New function.
(expand_debug_locations): Call it.
PR rtl-optimization/56484
* ifcvt.c (noce_process_if_block): If else_bb is NULL, avoid extending
lifetimes of hard registers on small register class machines.
2013-03-05 David Holsgrove <david.holsgrove@xilinx.com>
* config/microblaze/microblaze-protos.h: Rename * config/microblaze/microblaze-protos.h: Rename
microblaze_is_interrupt_handler to microblaze_is_interrupt_variant. microblaze_is_interrupt_handler to microblaze_is_interrupt_variant.
* config/microblaze/microblaze.c (microblaze_attribute_table): Add * config/microblaze/microblaze.c (microblaze_attribute_table): Add
fast_interrupt. fast_interrupt.
(microblaze_fast_interrupt_function_p): New function. (microblaze_fast_interrupt_function_p): New function.
(microblaze_is_interrupt_handler): Rename to (microblaze_is_interrupt_handler): Rename to
...@@ -12,8 +23,8 @@ ...@@ -12,8 +23,8 @@
(compute_frame_size): Likewise. (compute_frame_size): Likewise.
(microblaze_function_prologue): Add FAST_INTERRUPT_NAME. (microblaze_function_prologue): Add FAST_INTERRUPT_NAME.
(microblaze_globalize_label): Likewise. (microblaze_globalize_label): Likewise.
* config/microblaze/microblaze.h: Define FAST_INTERRUPT_NAME. * config/microblaze/microblaze.h: Define FAST_INTERRUPT_NAME.
* config/microblaze/microblaze.md: Use wrapper * config/microblaze/microblaze.md: Use wrapper
microblaze_is_interrupt_variant. microblaze_is_interrupt_variant.
2013-03-05 Kai Tietz <ktietz@redhat.com> 2013-03-05 Kai Tietz <ktietz@redhat.com>
......
...@@ -2622,6 +2622,8 @@ expand_debug_parm_decl (tree decl) ...@@ -2622,6 +2622,8 @@ expand_debug_parm_decl (tree decl)
reg = gen_raw_REG (GET_MODE (reg), OUTGOING_REGNO (REGNO (reg))); reg = gen_raw_REG (GET_MODE (reg), OUTGOING_REGNO (REGNO (reg)));
incoming = replace_equiv_address_nv (incoming, reg); incoming = replace_equiv_address_nv (incoming, reg);
} }
else
incoming = copy_rtx (incoming);
} }
#endif #endif
...@@ -2637,7 +2639,7 @@ expand_debug_parm_decl (tree decl) ...@@ -2637,7 +2639,7 @@ expand_debug_parm_decl (tree decl)
|| (GET_CODE (XEXP (incoming, 0)) == PLUS || (GET_CODE (XEXP (incoming, 0)) == PLUS
&& XEXP (XEXP (incoming, 0), 0) == virtual_incoming_args_rtx && XEXP (XEXP (incoming, 0), 0) == virtual_incoming_args_rtx
&& CONST_INT_P (XEXP (XEXP (incoming, 0), 1))))) && CONST_INT_P (XEXP (XEXP (incoming, 0), 1)))))
return incoming; return copy_rtx (incoming);
return NULL_RTX; return NULL_RTX;
} }
...@@ -3704,6 +3706,56 @@ expand_debug_source_expr (tree exp) ...@@ -3704,6 +3706,56 @@ expand_debug_source_expr (tree exp)
return op0; return op0;
} }
/* Ensure INSN_VAR_LOCATION_LOC (insn) doesn't have unbound complexity.
Allow 4 levels of rtl nesting for most rtl codes, and if we see anything
deeper than that, create DEBUG_EXPRs and emit DEBUG_INSNs before INSN. */
static void
avoid_complex_debug_insns (rtx insn, rtx *exp_p, int depth)
{
rtx exp = *exp_p;
if (exp == NULL_RTX)
return;
if ((OBJECT_P (exp) && !MEM_P (exp)) || GET_CODE (exp) == CLOBBER)
return;
if (depth == 4)
{
/* Create DEBUG_EXPR (and DEBUG_EXPR_DECL). */
rtx dval = make_debug_expr_from_rtl (exp);
/* Emit a debug bind insn before INSN. */
rtx bind = gen_rtx_VAR_LOCATION (GET_MODE (exp),
DEBUG_EXPR_TREE_DECL (dval), exp,
VAR_INIT_STATUS_INITIALIZED);
emit_debug_insn_before (bind, insn);
*exp_p = dval;
return;
}
const char *format_ptr = GET_RTX_FORMAT (GET_CODE (exp));
int i, j;
for (i = 0; i < GET_RTX_LENGTH (GET_CODE (exp)); i++)
switch (*format_ptr++)
{
case 'e':
avoid_complex_debug_insns (insn, &XEXP (exp, i), depth + 1);
break;
case 'E':
case 'V':
for (j = 0; j < XVECLEN (exp, i); j++)
avoid_complex_debug_insns (insn, &XVECEXP (exp, i, j), depth + 1);
break;
default:
break;
}
}
/* Expand the _LOCs in debug insns. We run this after expanding all /* Expand the _LOCs in debug insns. We run this after expanding all
regular insns, so that any variables referenced in the function regular insns, so that any variables referenced in the function
will have their DECL_RTLs set. */ will have their DECL_RTLs set. */
...@@ -3724,7 +3776,7 @@ expand_debug_locations (void) ...@@ -3724,7 +3776,7 @@ expand_debug_locations (void)
if (DEBUG_INSN_P (insn)) if (DEBUG_INSN_P (insn))
{ {
tree value = (tree)INSN_VAR_LOCATION_LOC (insn); tree value = (tree)INSN_VAR_LOCATION_LOC (insn);
rtx val; rtx val, prev_insn, insn2;
enum machine_mode mode; enum machine_mode mode;
if (value == NULL_TREE) if (value == NULL_TREE)
...@@ -3753,6 +3805,9 @@ expand_debug_locations (void) ...@@ -3753,6 +3805,9 @@ expand_debug_locations (void)
} }
INSN_VAR_LOCATION_LOC (insn) = val; INSN_VAR_LOCATION_LOC (insn) = val;
prev_insn = PREV_INSN (insn);
for (insn2 = insn; insn2 != prev_insn; insn2 = PREV_INSN (insn2))
avoid_complex_debug_insns (insn2, &INSN_VAR_LOCATION_LOC (insn2), 0);
} }
flag_strict_aliasing = save_strict_alias; flag_strict_aliasing = save_strict_alias;
......
2013-03-05 Jakub Jelinek <jakub@redhat.com>
PR debug/56510
* gcc.dg/pr56510.c: New test.
PR rtl-optimization/56484
* gcc.c-torture/compile/pr56484.c: New test.
2013-03-05 Paolo Carlini <paolo.carlini@oracle.com> 2013-03-05 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/56530 PR c++/56530
......
/* PR debug/56510 */
/* { dg-do compile } */
/* { dg-options "-O2 -g" } */
struct S { unsigned long s1; void **s2[0]; };
void **a, **b, **c, **d, **e, **f;
static void **
baz (long x, long y)
{
void **s = f;
*f = (void **) (y << 8 | (x & 0xff));
f += y + 1;
return s;
}
void bar (void);
void
foo (void)
{
void **g = b[4];
a = b[2];
b = b[1];
g[2] = e;
void **h
= ((void **************************)
a)[1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][1][66];
void **i = ((struct S *) h)->s2[4];
d = baz (4, 3);
d[1] = b;
d[2] = a;
d[3] = bar;
b = d;
g[1] = i[2];
a = g;
((void (*) (void)) (i[1])) ();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment