Commit fe77e0ed by Alexandre Oliva Committed by Alexandre Oliva

re PR debug/54693 (VTA guality issues with loops)

PR debug/54693
* tree-ssa-threadedge.c (propagate_threaded_block_debug_into):
Use a stack vector before allocating a pointer set.

From-SVN: r193251
parent d044dd17
2012-11-06 Alexandre Oliva <aoliva@redhat.com>
PR debug/54693
* tree-ssa-threadedge.c (propagate_threaded_block_debug_into):
Use a stack vector before allocating a pointer set.
2012-11-06 Martin Jambor <mjambor@suse.cz> 2012-11-06 Martin Jambor <mjambor@suse.cz>
* ipa-prop.c (ipa_get_param_decl_index_1): New function. * ipa-prop.c (ipa_get_param_decl_index_1): New function.
...@@ -610,6 +610,10 @@ cond_arg_set_in_bb (edge e, basic_block bb) ...@@ -610,6 +610,10 @@ cond_arg_set_in_bb (edge e, basic_block bb)
return false; return false;
} }
DEF_VEC_O(tree);
DEF_VEC_ALLOC_O_STACK(tree);
#define VEC_tree_stack_alloc(alloc) VEC_stack_alloc (tree, alloc)
/* Copy debug stmts from DEST's chain of single predecessors up to /* Copy debug stmts from DEST's chain of single predecessors up to
SRC, so that we don't lose the bindings as PHI nodes are introduced SRC, so that we don't lose the bindings as PHI nodes are introduced
when DEST gains new predecessors. */ when DEST gains new predecessors. */
...@@ -625,10 +629,35 @@ propagate_threaded_block_debug_into (basic_block dest, basic_block src) ...@@ -625,10 +629,35 @@ propagate_threaded_block_debug_into (basic_block dest, basic_block src)
gcc_checking_assert (dest != src); gcc_checking_assert (dest != src);
gimple_stmt_iterator gsi = gsi_after_labels (dest); gimple_stmt_iterator gsi = gsi_after_labels (dest);
pointer_set_t *vars = pointer_set_create (); int i = 0;
const int alloc_count = 16; // ?? Should this be a PARAM?
/* Estimate the number of debug vars overridden in the beginning of
DEST, to tell how many we're going to need to begin with. */
for (gimple_stmt_iterator si = gsi; for (gimple_stmt_iterator si = gsi;
!gsi_end_p (si); gsi_next (&si)) i * 4 <= alloc_count * 3 && !gsi_end_p (si); gsi_next (&si))
{
gimple stmt = gsi_stmt (si);
if (!is_gimple_debug (stmt))
break;
i++;
}
VEC(tree, stack) *fewvars = NULL;
pointer_set_t *vars = NULL;
/* If we're already starting with 3/4 of alloc_count, go for a
pointer_set, otherwise start with an unordered stack-allocated
VEC. */
if (i * 4 > alloc_count * 3)
vars = pointer_set_create ();
else if (alloc_count)
fewvars = VEC_alloc (tree, stack, alloc_count);
/* Now go through the initial debug stmts in DEST again, this time
actually inserting in VARS or FEWVARS. Don't bother checking for
duplicates in FEWVARS. */
for (gimple_stmt_iterator si = gsi; !gsi_end_p (si); gsi_next (&si))
{ {
gimple stmt = gsi_stmt (si); gimple stmt = gsi_stmt (si);
if (!is_gimple_debug (stmt)) if (!is_gimple_debug (stmt))
...@@ -643,7 +672,10 @@ propagate_threaded_block_debug_into (basic_block dest, basic_block src) ...@@ -643,7 +672,10 @@ propagate_threaded_block_debug_into (basic_block dest, basic_block src)
else else
gcc_unreachable (); gcc_unreachable ();
if (vars)
pointer_set_insert (vars, var); pointer_set_insert (vars, var);
else
VEC_quick_push (tree, fewvars, var);
} }
basic_block bb = dest; basic_block bb = dest;
...@@ -675,8 +707,28 @@ propagate_threaded_block_debug_into (basic_block dest, basic_block src) ...@@ -675,8 +707,28 @@ propagate_threaded_block_debug_into (basic_block dest, basic_block src)
or somesuch. Adding `&& bb == src' to the condition or somesuch. Adding `&& bb == src' to the condition
below will preserve all potentially relevant debug below will preserve all potentially relevant debug
notes. */ notes. */
if (pointer_set_insert (vars, var)) if (vars && pointer_set_insert (vars, var))
continue; continue;
else if (!vars)
{
int i = VEC_length (tree, fewvars);
while (i--)
if (VEC_index (tree, fewvars, i) == var)
break;
if (i >= 0)
continue;
if (VEC_length (tree, fewvars) < alloc_count)
VEC_quick_push (tree, fewvars, var);
else
{
vars = pointer_set_create ();
for (i = 0; i < alloc_count; i++)
pointer_set_insert (vars, VEC_index (tree, fewvars, i));
VEC_free (tree, stack, fewvars);
pointer_set_insert (vars, var);
}
}
stmt = gimple_copy (stmt); stmt = gimple_copy (stmt);
/* ??? Should we drop the location of the copy to denote /* ??? Should we drop the location of the copy to denote
...@@ -686,7 +738,10 @@ propagate_threaded_block_debug_into (basic_block dest, basic_block src) ...@@ -686,7 +738,10 @@ propagate_threaded_block_debug_into (basic_block dest, basic_block src)
} }
while (bb != src && single_pred_p (bb)); while (bb != src && single_pred_p (bb));
if (vars)
pointer_set_destroy (vars); pointer_set_destroy (vars);
else if (fewvars)
VEC_free (tree, stack, fewvars);
} }
/* TAKEN_EDGE represents the an edge taken as a result of jump threading. /* TAKEN_EDGE represents the an edge taken as a result of jump threading.
......
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