From 07c5a154bb3d23948235bd9481fecca779b1f62d Mon Sep 17 00:00:00 2001 From: Steven Bosscher <steven@gcc.gnu.org> Date: Wed, 8 Aug 2012 17:39:46 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 13 ++++++++++++- gcc/gimplify.c | 2 ++ gcc/tree-into-ssa.c | 25 +++++++++++++------------ gcc/tree-ssa-loop-manip.c | 8 +++----- 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 60f75a3d8443..4bd66d6d0bfe 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +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> * tree-ssa-operands.h (virtual_operand_p): Declare. @@ -36,7 +47,7 @@ * combine.c (gen_lowpart_for_combine): Don't return identity 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. (OPTION_MASK_ISA_ADX_UNSET): Likewise. diff --git a/gcc/gimplify.c b/gcc/gimplify.c index c704010436b4..03f7c9ece821 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -8200,8 +8200,10 @@ gimplify_body (tree fndecl, bool do_parms) pop_gimplify_context (outer_bind); gcc_assert (gimplify_ctxp == NULL); +#ifdef ENABLE_CHECKING if (!seen_error ()) verify_gimple_in_seq (gimple_bind_body (outer_bind)); +#endif timevar_pop (TV_TREE_GIMPLIFY); input_location = saved_location; diff --git a/gcc/tree-into-ssa.c b/gcc/tree-into-ssa.c index eb1ef6c1c9a7..52f0bdc71a91 100644 --- a/gcc/tree-into-ssa.c +++ b/gcc/tree-into-ssa.c @@ -408,26 +408,28 @@ set_current_def (tree var, tree def) for LIVEIN). */ 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; bitmap_iterator bi; + VEC (basic_block, heap) *worklist; - tos = worklist - = (basic_block *) xmalloc (sizeof (basic_block) * (last_basic_block + 1)); + /* Normally the work list size is bounded by the number of basic + 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) - *tos++ = BASIC_BLOCK (i); + VEC_safe_push (basic_block, heap, worklist, BASIC_BLOCK (i)); /* Iterate until the worklist is empty. */ - while (tos != worklist) + while (! VEC_empty (basic_block, worklist)) { edge e; edge_iterator ei; /* Pull a block off the worklist. */ - bb = *--tos; + basic_block bb = VEC_pop (basic_block, worklist); /* For each predecessor block. */ FOR_EACH_EDGE (e, ei, bb->preds) @@ -437,16 +439,15 @@ compute_global_livein (bitmap livein ATTRIBUTE_UNUSED, bitmap def_blocks ATTRIBU /* None of this is necessary for the entry block. */ 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; - bitmap_set_bit (livein, pred_index); + VEC_safe_push (basic_block, heap, worklist, pred); } } } - free (worklist); + VEC_free (basic_block, heap, worklist); } diff --git a/gcc/tree-ssa-loop-manip.c b/gcc/tree-ssa-loop-manip.c index 0ddc56f832a4..19a8eca268e6 100644 --- a/gcc/tree-ssa-loop-manip.c +++ b/gcc/tree-ssa-loop-manip.c @@ -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)); bitmap_iterator bi; - if (is_gimple_reg (var)) - bitmap_clear_bit (livein, def_bb->index); - else - bitmap_set_bit (livein, def_bb->index); + gcc_checking_assert (is_gimple_reg (var)); + bitmap_clear_bit (livein, def_bb->index); def = BITMAP_ALLOC (NULL); bitmap_set_bit (def, def_bb->index); @@ -272,7 +270,7 @@ find_uses_to_rename_stmt (gimple stmt, bitmap *use_blocks, bitmap need_phis) if (is_gimple_debug (stmt)) 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); } -- GitLab