This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Fix compilation time problem in PR middle-end/37448
- From: "Richard Guenther" <richard dot guenther at gmail dot com>
- To: "Jan Hubicka" <jh at suse dot cz>
- Cc: gcc-patches at gcc dot gnu dot org, jakub at redhat dot com
- Date: Thu, 11 Sep 2008 14:29:04 +0200
- Subject: Re: Fix compilation time problem in PR middle-end/37448
- References: <20080911121929.GN3195@kam.mff.cuni.cz>
On Thu, Sep 11, 2008 at 2:19 PM, Jan Hubicka <jh@suse.cz> wrote:
> Hi,
> PR middle-end/37448 makes inliner to spend a lot of time in
> add_lexical_block that walks to the end of long block list.
> Since we don't keep blocksin any particular order, we can just
> insert instead.
> Bootstrapped/regtested i686-linux, OK?
Ok, but insert_lexical block is as unclear as add_lexical_block.
Maybe call it prepend_lexical_block instead.
Thanks,
Richard.
> Honza
>
> PR middle-end/37448
> * tree-inline.c (add_lexical_block): Replace with ...
> (insert_lexical_block): ... insert at begginig.
> (remap_blocks): Use it and reverse later.
> (expand_call_inline): Use insert_lexical_block.
> Index: tree-inline.c
> ===================================================================
> *** tree-inline.c (revision 140271)
> --- tree-inline.c (working copy)
> *************** static void unsave_expr_1 (tree);
> *** 129,135 ****
> static tree unsave_r (tree *, int *, void *);
> static void declare_inline_vars (tree, tree);
> static void remap_save_expr (tree *, void *, int *);
> ! static void add_lexical_block (tree current_block, tree new_block);
> static tree copy_decl_to_var (tree, copy_body_data *);
> static tree copy_result_decl_to_var (tree, copy_body_data *);
> static tree copy_decl_maybe_to_var (tree, copy_body_data *);
> --- 129,135 ----
> static tree unsave_r (tree *, int *, void *);
> static void declare_inline_vars (tree, tree);
> static void remap_save_expr (tree *, void *, int *);
> ! static void insert_lexical_block (tree current_block, tree new_block);
> static tree copy_decl_to_var (tree, copy_body_data *);
> static tree copy_result_decl_to_var (tree, copy_body_data *);
> static tree copy_decl_maybe_to_var (tree, copy_body_data *);
> *************** remap_blocks (tree block, copy_body_data
> *** 512,518 ****
> remap_block (&new_tree, id);
> gcc_assert (new_tree != block);
> for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t))
> ! add_lexical_block (new_tree, remap_blocks (t, id));
> return new_tree;
> }
>
> --- 512,521 ----
> remap_block (&new_tree, id);
> gcc_assert (new_tree != block);
> for (t = BLOCK_SUBBLOCKS (block); t ; t = BLOCK_CHAIN (t))
> ! insert_lexical_block (new_tree, remap_blocks (t, id));
> ! /* Blocks are in arbitrary order, but make things slightly prettier and do
> ! not swap order when producing a copy. */
> ! BLOCK_SUBBLOCKS (new_tree) = blocks_nreverse (BLOCK_SUBBLOCKS (new_tree));
> return new_tree;
> }
>
> *************** count_insns_seq (gimple_seq seq, eni_wei
> *** 3032,3047 ****
> /* Install new lexical TREE_BLOCK underneath 'current_block'. */
>
> static void
> ! add_lexical_block (tree current_block, tree new_block)
> {
> ! tree *blk_p;
> !
> ! /* Walk to the last sub-block. */
> ! for (blk_p = &BLOCK_SUBBLOCKS (current_block);
> ! *blk_p;
> ! blk_p = &BLOCK_CHAIN (*blk_p))
> ! ;
> ! *blk_p = new_block;
> BLOCK_SUPERCONTEXT (new_block) = current_block;
> }
>
> --- 3038,3047 ----
> /* Install new lexical TREE_BLOCK underneath 'current_block'. */
>
> static void
> ! insert_lexical_block (tree current_block, tree new_block)
> {
> ! BLOCK_CHAIN (new_block) = BLOCK_SUBBLOCKS (current_block);
> ! BLOCK_SUBBLOCKS (current_block) = new_block;
> BLOCK_SUPERCONTEXT (new_block) = current_block;
> }
>
> *************** expand_call_inline (basic_block bb, gimp
> *** 3222,3228 ****
> id->block = make_node (BLOCK);
> BLOCK_ABSTRACT_ORIGIN (id->block) = fn;
> BLOCK_SOURCE_LOCATION (id->block) = input_location;
> ! add_lexical_block (gimple_block (stmt), id->block);
>
> /* Local declarations will be replaced by their equivalents in this
> map. */
> --- 3222,3228 ----
> id->block = make_node (BLOCK);
> BLOCK_ABSTRACT_ORIGIN (id->block) = fn;
> BLOCK_SOURCE_LOCATION (id->block) = input_location;
> ! insert_lexical_block (gimple_block (stmt), id->block);
>
> /* Local declarations will be replaced by their equivalents in this
> map. */
> *************** expand_call_inline (basic_block bb, gimp
> *** 3248,3254 ****
> initialize_inlined_parameters (id, stmt, fn, bb);
>
> if (DECL_INITIAL (fn))
> ! add_lexical_block (id->block, remap_blocks (DECL_INITIAL (fn), id));
>
> /* Return statements in the function body will be replaced by jumps
> to the RET_LABEL. */
> --- 3248,3254 ----
> initialize_inlined_parameters (id, stmt, fn, bb);
>
> if (DECL_INITIAL (fn))
> ! insert_lexical_block (id->block, remap_blocks (DECL_INITIAL (fn), id));
>
> /* Return statements in the function body will be replaced by jumps
> to the RET_LABEL. */
>