On Fri, 9 Jan 2015, Jakub Jelinek wrote:

> On Fri, Jan 09, 2015 at 12:07:26PM +0100, Thomas Schwinge wrote:
> > On Thu, 8 Jan 2015 15:11:49 +0100, Jakub Jelinek <ja...@redhat.com> wrote:
> > > On Thu, Nov 20, 2014 at 01:27:08PM +0100, Bernd Schmidt wrote:
> > > > On 11/13/2014 05:06 AM, Jan Hubicka wrote:
> > > > >this patch adds infrastructure for proper streaming and merging of
> > > > >TREE_TARGET_OPTION.
> > > > 
> > > > This breaks the offloading path via LTO since it introduces an
> > > > incompatibility in LTO format between host and offload machine.
> > > > 
> > > > A very quick patch to fix it is below - the OpenACC testcase I was using
> > > > seems to be working again with this. Thoughts, suggestions?
> > > 
> > > I actually think
> > 
> > Thanks for picking up this issue!
> 
> Richard said on IRC he doesn't like the string comparisons, so here is
> untested modification of the patch.  If it looks good, I'll test it today:

Looks good to me.

Richard.

> 2015-01-09  Bernd Schmidt  <ber...@codesourcery.com>
>           Jakub Jelinek  <ja...@redhat.com>
> 
>       PR middle-end/64412
>       * lto-streamer.h (lto_stream_offload_p): New declaration.
>       * lto-streamer.c (lto_stream_offload_p): New variable.
>       * cgraphunit.c (ipa_passes): Set lto_stream_offload_p
>       at the same time as section_name_prefix.
>       * lto-streamer-out.c (hash_tree): Don't hash TREE_TARGET_OPTION
>       if lto_stream_offload_p.
>       * tree-streamer-out.c (streamer_pack_tree_bitfields): Don't
>       stream TREE_TARGET_OPTION if lto_stream_offload_p.
>       (write_ts_function_decl_tree_pointers): Don't
>       stream DECL_FUNCTION_SPECIFIC_TARGET if lto_stream_offload_p.
>       * tree-streamer-in.c (unpack_value_fields): Don't stream
>       TREE_TARGET_OPTION in if ACCEL_COMPILER.
>       (lto_input_ts_function_decl_tree_pointers): Don't stream
>       DECL_FUNCTION_SPECIFIC_TARGET in if ACCEL_COMPILER.
>       * lto-opts.c (lto_write_options): Use lto_stream_offload_p
>       instead of section_name_prefix string comparisons.
> lto/
>       * lto.c (read_cgraph_and_symbols): Set lto_stream_offload_p
>       if ACCEL_COMPILER.
> 
> --- gcc/lto-streamer.h.jj     2015-01-05 13:07:13.000000000 +0100
> +++ gcc/lto-streamer.h        2015-01-09 12:18:26.199842482 +0100
> @@ -744,6 +744,10 @@ extern void lto_append_block (struct lto
>  
>  
>  /* In lto-streamer.c.  */
> +
> +/* Set when streaming LTO for offloading compiler.  */
> +extern bool lto_stream_offload_p;
> +
>  extern const char *lto_tag_name (enum LTO_tags);
>  extern bitmap lto_bitmap_alloc (void);
>  extern void lto_bitmap_free (bitmap);
> --- gcc/lto-streamer.c.jj     2015-01-05 13:07:13.000000000 +0100
> +++ gcc/lto-streamer.c        2015-01-09 12:16:04.909269917 +0100
> @@ -61,6 +61,8 @@ static bitmap_obstack lto_obstack;
>  static bool lto_obstack_initialized;
>  
>  const char *section_name_prefix = LTO_SECTION_NAME_PREFIX;
> +/* Set when streaming LTO for offloading compiler.  */
> +bool lto_stream_offload_p;
>  
>  /* Return a string representing LTO tag TAG.  */
>  
> --- gcc/cgraphunit.c.jj       2015-01-09 12:01:33.000000000 +0100
> +++ gcc/cgraphunit.c  2015-01-09 12:22:27.742692667 +0100
> @@ -2108,11 +2108,14 @@ ipa_passes (void)
>        if (g->have_offload)
>       {
>         section_name_prefix = OFFLOAD_SECTION_NAME_PREFIX;
> +       lto_stream_offload_p = true;
>         ipa_write_summaries (true);
> +       lto_stream_offload_p = false;
>       }
>        if (flag_lto)
>       {
>         section_name_prefix = LTO_SECTION_NAME_PREFIX;
> +       lto_stream_offload_p = false;
>         ipa_write_summaries (false);
>       }
>      }
> --- gcc/lto-streamer-out.c.jj 2015-01-08 18:10:23.633598629 +0100
> +++ gcc/lto-streamer-out.c    2015-01-09 12:14:41.017711211 +0100
> @@ -944,7 +944,9 @@ hash_tree (struct streamer_tree_cache_d
>      hstate.add (TRANSLATION_UNIT_LANGUAGE (t),
>                       strlen (TRANSLATION_UNIT_LANGUAGE (t)));
>  
> -  if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
> +  if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
> +      /* We don't stream these when passing things to a different target.  */
> +      && !lto_stream_offload_p)
>      hstate.add_wide_int (cl_target_option_hash (TREE_TARGET_OPTION (t)));
>  
>    if (CODE_CONTAINS_STRUCT (code, TS_OPTIMIZATION))
> --- gcc/tree-streamer-out.c.jj        2015-01-08 18:10:23.631598663 +0100
> +++ gcc/tree-streamer-out.c   2015-01-09 12:14:41.018711194 +0100
> @@ -472,7 +472,9 @@ streamer_pack_tree_bitfields (struct out
>    if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
>      bp_pack_var_len_unsigned (bp, CONSTRUCTOR_NELTS (expr));
>  
> -  if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
> +  if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION)
> +      /* Don't stream these when passing things to a different target.  */
> +      && !lto_stream_offload_p)
>      cl_target_option_stream_out (ob, bp, TREE_TARGET_OPTION (expr));
>  
>    if (code == OMP_CLAUSE)
> @@ -687,7 +689,9 @@ write_ts_function_decl_tree_pointers (st
>    stream_write_tree (ob, DECL_VINDEX (expr), ref_p);
>    /* DECL_STRUCT_FUNCTION is handled by lto_output_function.  */
>    stream_write_tree (ob, DECL_FUNCTION_PERSONALITY (expr), ref_p);
> -  stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
> +  /* Don't stream these when passing things to a different target.  */
> +  if (!lto_stream_offload_p)
> +    stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_TARGET (expr), ref_p);
>    stream_write_tree (ob, DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr), ref_p);
>  }
>  
> --- gcc/tree-streamer-in.c.jj 2015-01-08 18:10:23.561599843 +0100
> +++ gcc/tree-streamer-in.c    2015-01-09 12:14:41.017711211 +0100
> @@ -520,8 +520,10 @@ unpack_value_fields (struct data_in *dat
>       vec_safe_grow (CONSTRUCTOR_ELTS (expr), length);
>      }
>  
> +#ifndef ACCEL_COMPILER
>    if (CODE_CONTAINS_STRUCT (code, TS_TARGET_OPTION))
>      cl_target_option_stream_in (data_in, bp, TREE_TARGET_OPTION (expr));
> +#endif
>  
>    if (code == OMP_CLAUSE)
>      unpack_ts_omp_clause_value_fields (data_in, bp, expr);
> @@ -785,7 +787,9 @@ lto_input_ts_function_decl_tree_pointers
>    DECL_VINDEX (expr) = stream_read_tree (ib, data_in);
>    /* DECL_STRUCT_FUNCTION is loaded on demand by cgraph_get_body.  */
>    DECL_FUNCTION_PERSONALITY (expr) = stream_read_tree (ib, data_in);
> +#ifndef ACCEL_COMPILER
>    DECL_FUNCTION_SPECIFIC_TARGET (expr) = stream_read_tree (ib, data_in);
> +#endif
>    DECL_FUNCTION_SPECIFIC_OPTIMIZATION (expr) = stream_read_tree (ib, 
> data_in);
>  
>    /* If the file contains a function with an EH personality set,
> --- gcc/lto-opts.c.jj 2015-01-05 13:07:12.000000000 +0100
> +++ gcc/lto-opts.c    2015-01-09 12:21:04.203127914 +0100
> @@ -160,7 +160,7 @@ lto_write_options (void)
>                              "-fno-strict-overflow");
>  
>    /* Append options from target hook and store them to offload_lto section.  
> */
> -  if (strcmp (section_name_prefix, OFFLOAD_SECTION_NAME_PREFIX) == 0)
> +  if (lto_stream_offload_p)
>      {
>        char *offload_opts = targetm.offload_options ();
>        char *offload_ptr = offload_opts;
> @@ -201,7 +201,7 @@ lto_write_options (void)
>  
>        /* Do not store target-specific options in offload_lto section.  */
>        if ((cl_options[option->opt_index].flags & CL_TARGET)
> -      && strcmp (section_name_prefix, OFFLOAD_SECTION_NAME_PREFIX) == 0)
> +       && lto_stream_offload_p)
>         continue;
>  
>        /* Drop options created from the gcc driver that will be rejected
> @@ -214,8 +214,7 @@ lto_write_options (void)
>        We do not need those.  The only exception is -foffload option, if we
>        write it in offload_lto section.  Also drop all diagnostic options.  */
>        if ((cl_options[option->opt_index].flags & (CL_DRIVER|CL_WARNING))
> -       && (strcmp (section_name_prefix, OFFLOAD_SECTION_NAME_PREFIX) != 0
> -           || option->opt_index != OPT_foffload_))
> +       && (!lto_stream_offload_p || option->opt_index != OPT_foffload_))
>       continue;
>  
>        for (j = 0; j < option->canonical_option_num_elements; ++j)
> --- gcc/lto/lto.c.jj  2015-01-05 13:07:19.000000000 +0100
> +++ gcc/lto/lto.c     2015-01-09 12:21:50.479332868 +0100
> @@ -2900,7 +2900,8 @@ read_cgraph_and_symbols (unsigned nfiles
>    timevar_push (TV_IPA_LTO_DECL_IN);
>  
>  #ifdef ACCEL_COMPILER
> -    section_name_prefix = OFFLOAD_SECTION_NAME_PREFIX;
> +  section_name_prefix = OFFLOAD_SECTION_NAME_PREFIX;
> +  lto_stream_offload_p = true;
>  #endif
>  
>    real_file_decl_data
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Jennifer Guild,
Dilip Upmanyu, Graham Norton HRB 21284 (AG Nuernberg)

Reply via email to