Ping.

On 09 Oct 19:12, Ilya Tocar wrote:
> Ping.
> 
> On 03 Oct 20:05, Ilya Tocar wrote:
> > On 26 Sep 21:21, Ilya Tocar wrote:
> > > On 25 Sep 15:48, Richard Biener wrote:
> > > > On Wed, Sep 25, 2013 at 3:29 PM, Ilya Tocar <tocarip.in...@gmail.com> 
> > > > wrote:
> > > > > On 24 Sep 11:02, Richard Biener wrote:
> > > > >> On Mon, Sep 23, 2013 at 3:29 PM, Ilya Tocar 
> > > > >> <tocarip.in...@gmail.com> wrote:
> > > > >>  thus consider assigning the section
> > > > >> name in a different place.
> > > > >>
> > > > >> Richard.
> > > > >
> > > > > What do you mean  by different place?
> > > > > I can add global dumping_omp_target variable to choose correct name,
> > > > > depending on it's value (patch below). Is it better?
> > > > 
> > > > More like passing down a different abstraction, like for
> > > > 
> > > > > @@ -907,9 +907,15 @@ output_symtab (void)
> > > > >      {
> > > > >        symtab_node node = lto_symtab_encoder_deref (encoder, i);
> > > > >        if (cgraph_node *cnode = dyn_cast <cgraph_node> (node))
> > > > > -        lto_output_node (ob, cnode, encoder);
> > > > > +       {
> > > > > +         if (!dumping_omp_target || lookup_attribute ("omp declare 
> > > > > target",
> > > > > +                                         DECL_ATTRIBUTES 
> > > > > (node->symbol.decl)))
> > > > > +           lto_output_node (ob, cnode, encoder);
> > > > > +       }
> > > > >        else
> > > > > -        lto_output_varpool_node (ob, varpool (node), encoder);
> > > > > +         if (!dumping_omp_target || lookup_attribute ("omp declare 
> > > > > target",
> > > > > +                                         DECL_ATTRIBUTES 
> > > > > (node->symbol.decl)))
> > > > > +           lto_output_varpool_node (ob, varpool (node), encoder);
> > > > >
> > > > >      }
> > > > 
> > > > have the symtab encoder already not contain the varpool nodes you
> > > > don't need.
> > > > 
> > > > And instead of looking up attributes, mark the symtab node with a flag.
> > > 
> > > Good idea!
> > > I've tried creating 2 encoders, and adding only nodes with
> > > "omp declare target" attribute in omp case. There is still some is_omp
> > > passing to control  lto_set_symtab_encoder_in_partition behaivor, 
> > > because i think it's better than global var.
> > > What do you think?
> > >
> > Updated version of the patch. I've checked that it doesn't break lto on
> > SPEC 2006. Streaming for omp is enabled by -fopnemp flag. Works with and
> > without enabled lto. Ok for gomp4 branch?
> > 
> > 
> > ---
> >  gcc/cgraphunit.c          | 15 +++++++++++++--
> >  gcc/ipa-inline-analysis.c |  2 +-
> >  gcc/lto-cgraph.c          | 15 ++++++++++-----
> >  gcc/lto-streamer.c        |  5 +++--
> >  gcc/lto-streamer.h        | 10 ++++++++--
> >  gcc/lto/lto-partition.c   |  4 ++--
> >  gcc/passes.c              | 12 ++++++------
> >  gcc/tree-pass.h           |  2 +-
> >  8 files changed, 44 insertions(+), 21 deletions(-)
> > 
> > diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
> > index 1644ca9..d595475 100644
> > --- a/gcc/cgraphunit.c
> > +++ b/gcc/cgraphunit.c
> > @@ -2016,7 +2016,18 @@ ipa_passes (void)
> >                           passes->all_lto_gen_passes);
> >  
> >    if (!in_lto_p)
> > -    ipa_write_summaries ();
> > +    {
> > +      if (flag_openmp)
> > +   {
> > +     section_name_prefix = OMP_SECTION_NAME_PREFIX;
> > +     ipa_write_summaries (true);
> > +   }
> > +      if (flag_lto)
> > +   {
> > +     section_name_prefix = LTO_SECTION_NAME_PREFIX;
> > +     ipa_write_summaries (false);
> > +   }
> > +    }
> >  
> >    if (flag_generate_lto)
> >      targetm.asm_out.lto_end ();
> > @@ -2107,7 +2118,7 @@ compile (void)
> >    cgraph_state = CGRAPH_STATE_IPA;
> >  
> >    /* If LTO is enabled, initialize the streamer hooks needed by GIMPLE.  */
> > -  if (flag_lto)
> > +  if (flag_lto || flag_openmp)
> >      lto_streamer_hooks_init ();
> >  
> >    /* Don't run the IPA passes if there was any error or sorry messages.  */
> > diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c
> > index ba6221e..4420213 100644
> > --- a/gcc/ipa-inline-analysis.c
> > +++ b/gcc/ipa-inline-analysis.c
> > @@ -3721,7 +3721,7 @@ inline_generate_summary (void)
> >  
> >    /* When not optimizing, do not bother to analyze.  Inlining is still done
> >       because edge redirection needs to happen there.  */
> > -  if (!optimize && !flag_lto && !flag_wpa)
> > +  if (!optimize && !flag_lto && !flag_wpa && !flag_openmp)
> >      return;
> >  
> >    function_insertion_hook_holder =
> > diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
> > index 952588d..4a7d179 100644
> > --- a/gcc/lto-cgraph.c
> > +++ b/gcc/lto-cgraph.c
> > @@ -236,8 +236,13 @@ lto_symtab_encoder_in_partition_p 
> > (lto_symtab_encoder_t encoder,
> >  
> >  void
> >  lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t encoder,
> > -                                symtab_node node)
> > +                                symtab_node node, bool is_omp)
> >  {
> > +  /* Ignore non omp target nodes for omp case.  */
> > +  if (is_omp && !lookup_attribute ("omp declare target",
> > +                              DECL_ATTRIBUTES (node->symbol.decl)))
> > +    return;
> > +
> >    int index = lto_symtab_encoder_encode (encoder, (symtab_node)node);
> >    encoder->nodes[index].in_partition = true;
> >  }
> > @@ -760,7 +765,7 @@ add_references (lto_symtab_encoder_t encoder,
> >     ignored by the partitioning logic earlier.  */
> >  
> >  lto_symtab_encoder_t 
> > -compute_ltrans_boundary (lto_symtab_encoder_t in_encoder)
> > +compute_ltrans_boundary (lto_symtab_encoder_t in_encoder, bool is_omp)
> >  {
> >    struct cgraph_node *node;
> >    struct cgraph_edge *edge;
> > @@ -779,7 +784,7 @@ compute_ltrans_boundary (lto_symtab_encoder_t 
> > in_encoder)
> >      {
> >        node = lsei_cgraph_node (lsei);
> >        add_node_to (encoder, node, true);
> > -      lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node);
> > +      lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node, 
> > is_omp);
> >        add_references (encoder, &node->symbol.ref_list);
> >        /* For proper debug info, we need to ship the origins, too.  */
> >        if (DECL_ABSTRACT_ORIGIN (node->symbol.decl))
> > @@ -794,7 +799,7 @@ compute_ltrans_boundary (lto_symtab_encoder_t 
> > in_encoder)
> >      {
> >        struct varpool_node *vnode = lsei_varpool_node (lsei);
> >  
> > -      lto_set_symtab_encoder_in_partition (encoder, (symtab_node)vnode);
> > +      lto_set_symtab_encoder_in_partition (encoder, (symtab_node)vnode, 
> > is_omp);
> >        lto_set_symtab_encoder_encode_initializer (encoder, vnode);
> >        add_references (encoder, &vnode->symbol.ref_list);
> >        /* For proper debug info, we need to ship the origins, too.  */
> > @@ -802,7 +807,7 @@ compute_ltrans_boundary (lto_symtab_encoder_t 
> > in_encoder)
> >     {
> >       struct varpool_node *origin_node
> >       = varpool_get_node (DECL_ABSTRACT_ORIGIN (node->symbol.decl));
> > -     lto_set_symtab_encoder_in_partition (encoder, 
> > (symtab_node)origin_node);
> > +     lto_set_symtab_encoder_in_partition (encoder, 
> > (symtab_node)origin_node, is_omp);
> >     }
> >      }
> >    /* Pickle in also the initializer of all referenced readonly variables
> > diff --git a/gcc/lto-streamer.c b/gcc/lto-streamer.c
> > index cdc75de..34f93a0 100644
> > --- a/gcc/lto-streamer.c
> > +++ b/gcc/lto-streamer.c
> > @@ -44,6 +44,7 @@ struct lto_stats_d lto_stats;
> >  static bitmap_obstack lto_obstack;
> >  static bool lto_obstack_initialized;
> >  
> > +const char *section_name_prefix = LTO_SECTION_NAME_PREFIX;
> >  
> >  /* Return a string representing LTO tag TAG.  */
> >  
> > @@ -173,7 +174,7 @@ lto_get_section_name (int section_type, const char 
> > *name, struct lto_file_decl_d
> >      sprintf (post, "." HOST_WIDE_INT_PRINT_HEX_PURE, f->id);
> >    else
> >      sprintf (post, "." HOST_WIDE_INT_PRINT_HEX_PURE, get_random_seed 
> > (false)); 
> > -  return concat (LTO_SECTION_NAME_PREFIX, sep, add, post, NULL);
> > +  return concat (section_name_prefix, sep, add, post, NULL);
> >  }
> >  
> >  
> > @@ -311,7 +312,7 @@ lto_streamer_init (void)
> >  bool
> >  gate_lto_out (void)
> >  {
> > -  return ((flag_generate_lto || in_lto_p)
> > +  return ((flag_generate_lto || in_lto_p || flag_openmp)
> >       /* Don't bother doing anything if the program has errors.  */
> >       && !seen_error ());
> >  }
> > diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
> > index 13a9593..7cd7514 100644
> > --- a/gcc/lto-streamer.h
> > +++ b/gcc/lto-streamer.h
> > @@ -141,6 +141,11 @@ along with GCC; see the file COPYING3.  If not see
> >     name for the functions and static_initializers.  For other types of
> >     sections a '.' and the section type are appended.  */
> >  #define LTO_SECTION_NAME_PREFIX         ".gnu.lto_"
> > +#define OMP_SECTION_NAME_PREFIX         ".gnu.target_lto_"
> > +
> > +/* Can be either OMP_SECTION_NAME_PREFIX when we stream pragma omp target
> > +   stuff, or LTO_SECTION_NAME_PREFIX for lto case.  */
> > +extern const char  *section_name_prefix;
> >  
> >  #define LTO_major_version 2
> >  #define LTO_minor_version 2
> > @@ -882,7 +887,7 @@ bool lto_symtab_encoder_encode_body_p 
> > (lto_symtab_encoder_t,
> >  bool lto_symtab_encoder_in_partition_p (lto_symtab_encoder_t,
> >                                     symtab_node);
> >  void lto_set_symtab_encoder_in_partition (lto_symtab_encoder_t,
> > -                                     symtab_node);
> > +                                     symtab_node, bool is_omp);
> >  
> >  bool lto_symtab_encoder_encode_initializer_p (lto_symtab_encoder_t,
> >                                           struct varpool_node *);
> > @@ -896,7 +901,8 @@ bool referenced_from_this_partition_p (struct 
> > ipa_ref_list *,
> >                                     lto_symtab_encoder_t);
> >  bool reachable_from_this_partition_p (struct cgraph_node *,
> >                                   lto_symtab_encoder_t);
> > -lto_symtab_encoder_t compute_ltrans_boundary (lto_symtab_encoder_t 
> > encoder);
> > +lto_symtab_encoder_t compute_ltrans_boundary (lto_symtab_encoder_t encoder,
> > +                                         bool is_omp);
> >  
> >  
> >  /* In lto-symtab.c.  */
> > diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c
> > index e05f805..83b3eba 100644
> > --- a/gcc/lto/lto-partition.c
> > +++ b/gcc/lto/lto-partition.c
> > @@ -189,7 +189,7 @@ add_symbol_to_partition_1 (ltrans_partition part, 
> > symtab_node node)
> >    gcc_assert (c != SYMBOL_EXTERNAL
> >           && (c == SYMBOL_DUPLICATE || !symbol_partitioned_p (node)));
> >  
> > -  lto_set_symtab_encoder_in_partition (part->encoder, (symtab_node) node);
> > +  lto_set_symtab_encoder_in_partition (part->encoder, (symtab_node) node, 
> > false);
> >  
> >    if (symbol_partitioned_p (node))
> >      {
> > @@ -922,7 +922,7 @@ lto_promote_cross_file_statics (void)
> >      {
> >        ltrans_partition part
> >     = ltrans_partitions[i];
> > -      part->encoder = compute_ltrans_boundary (part->encoder);
> > +      part->encoder = compute_ltrans_boundary (part->encoder, false);
> >      }
> >  
> >    /* Look at boundaries and promote symbols as needed.  */
> > diff --git a/gcc/passes.c b/gcc/passes.c
> > index f3f85fd..8a788ed 100644
> > --- a/gcc/passes.c
> > +++ b/gcc/passes.c
> > @@ -2321,7 +2321,7 @@ ipa_write_summaries_1 (lto_symtab_encoder_t encoder)
> >  /* Write out summaries for all the nodes in the callgraph.  */
> >  
> >  void
> > -ipa_write_summaries (void)
> > +ipa_write_summaries (bool is_omp)
> >  {
> >    lto_symtab_encoder_t encoder;
> >    int i, order_pos;
> > @@ -2329,7 +2329,7 @@ ipa_write_summaries (void)
> >    struct cgraph_node *node;
> >    struct cgraph_node **order;
> >  
> > -  if (!flag_generate_lto || seen_error ())
> > +  if (!(flag_generate_lto || flag_openmp) || seen_error () )
> >      return;
> >  
> >    encoder = lto_symtab_encoder_new (false);
> > @@ -2359,16 +2359,16 @@ ipa_write_summaries (void)
> >       pop_cfun ();
> >     }
> >        if (node->symbol.definition)
> > -        lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node);
> > +        lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node, 
> > is_omp);
> >      }
> >  
> >    FOR_EACH_DEFINED_FUNCTION (node)
> >      if (node->symbol.alias)
> > -      lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node);
> > +      lto_set_symtab_encoder_in_partition (encoder, (symtab_node)node, 
> > is_omp);
> >    FOR_EACH_DEFINED_VARIABLE (vnode)
> > -    lto_set_symtab_encoder_in_partition (encoder, (symtab_node)vnode);
> > +    lto_set_symtab_encoder_in_partition (encoder, (symtab_node)vnode, 
> > is_omp);
> >  
> > -  ipa_write_summaries_1 (compute_ltrans_boundary (encoder));
> > +  ipa_write_summaries_1 (compute_ltrans_boundary (encoder, is_omp));
> >  
> >    free (order);
> >  }
> > diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h
> > index ea1a62f..40e1882 100644
> > --- a/gcc/tree-pass.h
> > +++ b/gcc/tree-pass.h
> > @@ -598,7 +598,7 @@ extern void pass_fini_dump_file (struct opt_pass *);
> >  extern const char *get_current_pass_name (void);
> >  extern void print_current_pass (FILE *);
> >  extern void debug_pass (void);
> > -extern void ipa_write_summaries (void);
> > +extern void ipa_write_summaries (bool is_omp);
> >  extern void ipa_write_optimization_summaries (struct lto_symtab_encoder_d 
> > *);
> >  extern void ipa_read_summaries (void);
> >  extern void ipa_read_optimization_summaries (void);
> > -- 
> > 1.7.11.7
> > 

Reply via email to