Fix handling of DECL_EXTERNAL in partitioning

Richard Guenther richard.guenther@gmail.com
Tue May 11 14:57:00 GMT 2010


On Tue, May 11, 2010 at 4:14 PM, Jan Hubicka <hubicka@ucw.cz> wrote:
> Hi,
> eon and xalanbmk breaks with -fwhopr because we incorrectly decide to bring
> hidden DECL_EXTERNAL functions.  This patch also fixes some of confused checks
> in lto_1_to_1_map I noticed while looking into the problem and unifies common
> code in reachable_from_other_partition_p (there was other confused check
> concerning inline clones in lto_output_node).
>
> We are still wrong WRT attribute ((used)) and asm statements.  I will try to
> look into that next, that one should be even possible to write simple testcase
> for :)
>
> Bootstrapped/regtested x86_64-linux, OK?

Ok.

Thanks,
Richard.

>        * lto-cgraph.c (reachable_from_other_partition_p): Export; do not assume
>        that if function is needed it is reachable.
>        (lto_output_node): See if it the function is reachable or referenced.
>        (output_cgraph): Update call of lto_output_node.
>        * lto-streamer.h (reachable_from_other_partition_p): Declare.
>
>        * lto.c (lto_1_to_1_map): Remove some no longer needed checks.
>        (lto_promote_cross_file_statics): Never promote DECL_EXTERNAL;
>        use reachable_from_other_partition_p and
>        referenced_from_other_partition_p test.
>
> Index: lto-cgraph.c
> ===================================================================
> --- lto-cgraph.c        (revision 159269)
> +++ lto-cgraph.c        (working copy)
> @@ -312,12 +327,10 @@ referenced_from_other_partition_p (struc
>
>  /* Return true when node is reachable from other partition.  */
>
> -static bool
> +bool
>  reachable_from_other_partition_p (struct cgraph_node *node, cgraph_node_set set)
>  {
>   struct cgraph_edge *e;
> -  if (node->needed)
> -    return true;
>   if (!node->analyzed)
>     return false;
>   if (node->global.inlined_to)
> @@ -339,6 +352,7 @@ reachable_from_other_partition_p (struct
>  static void
>  lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
>                 lto_cgraph_encoder_t encoder, cgraph_node_set set,
> +                varpool_node_set vset,
>                 bitmap written_decls)
>  {
>   unsigned int tag;
> @@ -400,7 +414,9 @@ lto_output_node (struct lto_simple_outpu
>   bp_pack_value (bp, node->address_taken, 1);
>   bp_pack_value (bp, node->abstract_and_needed, 1);
>   bp_pack_value (bp, tag == LTO_cgraph_analyzed_node
> -                && reachable_from_other_partition_p (node, set), 1);
> +                && !DECL_EXTERNAL (node->decl)
> +                && (reachable_from_other_partition_p (node, set)
> +                    || referenced_from_other_partition_p (&node->ref_list, set, vset)), 1);
>   bp_pack_value (bp, node->lowered, 1);
>   bp_pack_value (bp, in_other_partition, 1);
>   bp_pack_value (bp, node->alias, 1);
> @@ -767,7 +783,7 @@ output_cgraph (cgraph_node_set set, varp
>   for (i = 0; i < n_nodes; i++)
>     {
>       node = lto_cgraph_encoder_deref (encoder, i);
> -      lto_output_node (ob, node, encoder, set, written_decls);
> +      lto_output_node (ob, node, encoder, set, vset, written_decls);
>     }
>
>   lto_bitmap_free (written_decls);
> Index: lto/lto.c
> ===================================================================
> --- lto/lto.c   (revision 159269)
> +++ lto/lto.c   (working copy)
> @@ -556,13 +556,11 @@ lto_1_to_1_map (void)
>       if (node->global.inlined_to || node->clone_of)
>        continue;
>       /* Nodes without a body do not need partitioning.  */
> -      if (!node->analyzed || node->same_body_alias)
> +      if (!node->analyzed)
>        continue;
> -      /* We only need to partition the nodes that we read from the
> -        gimple bytecode files.  */
> +
>       file_data = node->local.lto_file_data;
> -      if (file_data == NULL)
> -       continue;
> +      gcc_assert (!node->same_body_alias && file_data);
>
>       slot = pointer_map_contains (pmap, file_data);
>       if (slot)
> @@ -735,22 +733,13 @@ lto_promote_cross_file_statics (void)
>       for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
>        {
>          struct cgraph_node *node = csi_node (csi);
> -         bool globalize = node->local.vtable_method;
> -         struct cgraph_edge *e;
>          if (node->local.externally_visible)
>            continue;
> -         if (!globalize
> -             && referenced_from_other_partition_p (&node->ref_list, set, vset))
> -           globalize = true;
> -         for (e = node->callers; e && !globalize; e = e->next_caller)
> -           {
> -             struct cgraph_node *caller = e->caller;
> -             if (caller->global.inlined_to)
> -               caller = caller->global.inlined_to;
> -             if (!cgraph_node_in_set_p (caller, set))
> -               globalize = true;
> -           }
> -         if (globalize)
> +         if (node->clone_of || node->global.inlined_to)
> +           continue;
> +         if (!DECL_EXTERNAL (node->decl)
> +             && (referenced_from_other_partition_p (&node->ref_list, set, vset)
> +                 || reachable_from_other_partition_p (node, set)))
>             {
>                gcc_assert (flag_wpa);
>                TREE_PUBLIC (node->decl) = 1;
> Index: lto-streamer.h
> ===================================================================
> --- lto-streamer.h      (revision 159269)
> +++ lto-streamer.h      (working copy)
> @@ -863,6 +863,8 @@ void input_cgraph (void);
>  bool referenced_from_other_partition_p (struct ipa_ref_list *,
>                                        cgraph_node_set,
>                                        varpool_node_set vset);
> +bool reachable_from_other_partition_p (struct cgraph_node *,
> +                                      cgraph_node_set);
>
>
>  /* In lto-symtab.c.  */
>



More information about the Gcc-patches mailing list