Message ID | 20150109114503.GW1405@tucnak.redhat.com |
---|---|
State | New |
Headers | show |
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 > >
> 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: > > 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. This looks fine to me. Thanks for looking into this issue (that was mine, but I was quite busy last month) Honza
--- 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