Commit 07c5a154 by Steven Bosscher

re PR middle-end/54146 (Very slow compile with attribute((flatten)))

	PR middle-end/54146
	* gimpify.c (gimplify_body): Only verify_gimple_in_seq with
	checking enabled.
	* tree-ssa-loop-manip.c (add_exit_phis_var): Assert that var is
	a gimple_reg if checking is enabled.
	(find_uses_to_rename_stmt): Only look at non-virtual USE operands.
	* tree-into-ssa (compute_global_livein): Change the worklist
	type from an array to a VEC.

From-SVN: r190235
parent a471762f
2012-08-08 Steven Bosscher <steven@gcc.gnu.org>
PR middle-end/54146
* gimpify.c (gimplify_body): Only verify_gimple_in_seq with
checking enabled.
* tree-ssa-loop-manip.c (add_exit_phis_var): Assert that var is
a gimple_reg if checking is enabled.
(find_uses_to_rename_stmt): Only look at non-virtual USE operands.
* tree-into-ssa (compute_global_livein): Change the worklist
type from an array to a VEC.
2012-08-08 Richard Guenther <rguenther@suse.de> 2012-08-08 Richard Guenther <rguenther@suse.de>
* tree-ssa-operands.h (virtual_operand_p): Declare. * tree-ssa-operands.h (virtual_operand_p): Declare.
...@@ -36,7 +47,7 @@ ...@@ -36,7 +47,7 @@
* combine.c (gen_lowpart_for_combine): Don't return identity * combine.c (gen_lowpart_for_combine): Don't return identity
for CONST or symbolic reference. for CONST or symbolic reference.
2012-08-08 Michael Zolotukhin <michael.v.zolotukhin@intel.com> 2012-08-08 Michael Zolotukhin <michael.v.zolotukhin@intel.com>
* common/config/i386/i386-common.c (OPTION_MASK_ISA_ADX_SET): New. * common/config/i386/i386-common.c (OPTION_MASK_ISA_ADX_SET): New.
(OPTION_MASK_ISA_ADX_UNSET): Likewise. (OPTION_MASK_ISA_ADX_UNSET): Likewise.
......
...@@ -8200,8 +8200,10 @@ gimplify_body (tree fndecl, bool do_parms) ...@@ -8200,8 +8200,10 @@ gimplify_body (tree fndecl, bool do_parms)
pop_gimplify_context (outer_bind); pop_gimplify_context (outer_bind);
gcc_assert (gimplify_ctxp == NULL); gcc_assert (gimplify_ctxp == NULL);
#ifdef ENABLE_CHECKING
if (!seen_error ()) if (!seen_error ())
verify_gimple_in_seq (gimple_bind_body (outer_bind)); verify_gimple_in_seq (gimple_bind_body (outer_bind));
#endif
timevar_pop (TV_TREE_GIMPLIFY); timevar_pop (TV_TREE_GIMPLIFY);
input_location = saved_location; input_location = saved_location;
......
...@@ -408,26 +408,28 @@ set_current_def (tree var, tree def) ...@@ -408,26 +408,28 @@ set_current_def (tree var, tree def)
for LIVEIN). */ for LIVEIN). */
void void
compute_global_livein (bitmap livein ATTRIBUTE_UNUSED, bitmap def_blocks ATTRIBUTE_UNUSED) compute_global_livein (bitmap livein, bitmap def_blocks)
{ {
basic_block bb, *worklist, *tos;
unsigned i; unsigned i;
bitmap_iterator bi; bitmap_iterator bi;
VEC (basic_block, heap) *worklist;
tos = worklist /* Normally the work list size is bounded by the number of basic
= (basic_block *) xmalloc (sizeof (basic_block) * (last_basic_block + 1)); blocks in the largest loop. We don't know this number, but we
can be fairly sure that it will be relatively small. */
worklist = VEC_alloc (basic_block, heap, MAX (8, n_basic_blocks / 128));
EXECUTE_IF_SET_IN_BITMAP (livein, 0, i, bi) EXECUTE_IF_SET_IN_BITMAP (livein, 0, i, bi)
*tos++ = BASIC_BLOCK (i); VEC_safe_push (basic_block, heap, worklist, BASIC_BLOCK (i));
/* Iterate until the worklist is empty. */ /* Iterate until the worklist is empty. */
while (tos != worklist) while (! VEC_empty (basic_block, worklist))
{ {
edge e; edge e;
edge_iterator ei; edge_iterator ei;
/* Pull a block off the worklist. */ /* Pull a block off the worklist. */
bb = *--tos; basic_block bb = VEC_pop (basic_block, worklist);
/* For each predecessor block. */ /* For each predecessor block. */
FOR_EACH_EDGE (e, ei, bb->preds) FOR_EACH_EDGE (e, ei, bb->preds)
...@@ -437,16 +439,15 @@ compute_global_livein (bitmap livein ATTRIBUTE_UNUSED, bitmap def_blocks ATTRIBU ...@@ -437,16 +439,15 @@ compute_global_livein (bitmap livein ATTRIBUTE_UNUSED, bitmap def_blocks ATTRIBU
/* None of this is necessary for the entry block. */ /* None of this is necessary for the entry block. */
if (pred != ENTRY_BLOCK_PTR if (pred != ENTRY_BLOCK_PTR
&& ! bitmap_bit_p (livein, pred_index) && ! bitmap_bit_p (def_blocks, pred_index)
&& ! bitmap_bit_p (def_blocks, pred_index)) && bitmap_set_bit (livein, pred_index))
{ {
*tos++ = pred; VEC_safe_push (basic_block, heap, worklist, pred);
bitmap_set_bit (livein, pred_index);
} }
} }
} }
free (worklist); VEC_free (basic_block, heap, worklist);
} }
......
...@@ -160,10 +160,8 @@ add_exit_phis_var (tree var, bitmap livein, bitmap exits) ...@@ -160,10 +160,8 @@ add_exit_phis_var (tree var, bitmap livein, bitmap exits)
basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (var)); basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (var));
bitmap_iterator bi; bitmap_iterator bi;
if (is_gimple_reg (var)) gcc_checking_assert (is_gimple_reg (var));
bitmap_clear_bit (livein, def_bb->index); bitmap_clear_bit (livein, def_bb->index);
else
bitmap_set_bit (livein, def_bb->index);
def = BITMAP_ALLOC (NULL); def = BITMAP_ALLOC (NULL);
bitmap_set_bit (def, def_bb->index); bitmap_set_bit (def, def_bb->index);
...@@ -272,7 +270,7 @@ find_uses_to_rename_stmt (gimple stmt, bitmap *use_blocks, bitmap need_phis) ...@@ -272,7 +270,7 @@ find_uses_to_rename_stmt (gimple stmt, bitmap *use_blocks, bitmap need_phis)
if (is_gimple_debug (stmt)) if (is_gimple_debug (stmt))
return; return;
FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_ALL_USES) FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE)
find_uses_to_rename_use (bb, var, use_blocks, need_phis); find_uses_to_rename_use (bb, var, use_blocks, need_phis);
} }
......
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