LTO streaming of TARGET_OPTIMIZE_NODE
Richard Biener
rguenther@suse.de
Fri Jan 9 12:12:00 GMT 2015
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 <jakub@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 <bernds@codesourcery.com>
> Jakub Jelinek <jakub@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 <rguenther@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Jennifer Guild,
Dilip Upmanyu, Graham Norton HRB 21284 (AG Nuernberg)
More information about the Gcc-patches
mailing list