On Thu, 23 Apr 2015, Richard Biener wrote: > On Thu, 23 Apr 2015, Jan Hubicka wrote: > > > > > > > It looks like when transitioning to using target and optimization > > > option nodes for compile-time to link-time option streaming you > > > didn't adjust lto-opts.c nor lto-wrapper.c. The following fixes > > > > Yep, I assumed that lto-wrapper's merging is now redundant for optimization > > options, while it is still needed for global functions (-fPIC) that was > > not covered by my changes and since this was all bit late, it seemed I can > > just keep it for next stage1. > > > > > the target option side (for SWITCHABLE_TARGET). Do not record > > > any target options in the lto_opts section. > > > > > > Honza - I suppose we don't have any testcase that this works, I'll > > > try to come up with sth. This also looks like a correctness issue > > > to me. > > > > Thanks, that would be a good idea. So with SWITCHABLE_TARGET > > we have problem that after switching the options are misinterpretted?
Ok, so with t.c --- extern int have_fma; extern double x, y, z; void do_fma (void); int main() { if (have_fma) do_fma (); else x = x + y * z; } t2.c --- int have_fma; volatile double x, y, z; void do_fma (void) { x = x + y * z; } and doing gcc -c -Ofast -flto t.c gcc -c -Ofast -mfma -flto t2.c gcc t.o t2.o I get -mfma on the lto1 command-line for the link. But I also get for main() <target_option_node 0x7ffff6ac40d8 ix86_isa_flags (0x1800220000012) ix86_fpmath (0x2) target_flags (0xa0004c3) arch = 18 (k8) tune = 0 (generic) branch_cost = 3 -m64 -msse2 -msse -mmmx -mfxsr -m128bit-long-double -m80387 -mfp-ret-in-387 -mtls-direct-seg-refs -mvzeroupper -mavx256-split-unaligned-load -mavx256-split-unaligned-store -mfpmath=sse > while for do_fma() <target_option_node 0x7ffff6ac2e58 ix86_isa_flags (0x117809224000112) ix86_fpmath (0x2) target_flags (0xa0004c3) arch = 18 (k8) tune = 0 (generic) branch_cost = 3 -m64 -mfma -msse4.2 -msse4.1 -mssse3 -msse3 -msse2 -msse -mmmx -mfxsr -mpopcnt -mxsave -m128bit-long-double -m80387 -mfp-ret-in-387 -mtls-direct-seg-refs -mvzeroupper -mavx256-split-unaligned-load -mavx256-split-unaligned-store -mfpmath=sse > and for some reason main () ends up _not_ having -mfma enabled. I'm not sure what disables it or how we arrive at the above set of options in the first place... does the TARGET_OPTION_NODE store the complete state of all target options? I had the impression it only stores "modification"? So it seems to work (and simply ignore the global -mfma flag). Not sure on whether by design or by luck ;) Richard. > > I think Jakub made patch to simply skip target-option-node streaming here, > > how this is supposed to work. > > Not all targets support target attributes and I think those that > support them are those that are SWITCHABLE_TARGET - but maybe I am > mistaken? > > > > > > > We can do similar changes for optimize options, now, for all targets, no? > > > > I am not quite sure about this; not all options are per-function nature. > > I need to audit all the target options for LTO safety, I did some work > > on this for optimization options, but the target options are still very > > wild. > > For example I am not quite convinced mixing -malign-double > > -mno-align-double units > > will work as expected. > > Well, but once types are laid out specifying sth else at link time > won't help. But yes, if we don't stream the option we have no chance > to complain in lto-wrapper. It's just that we seem to not enter > the merging machinery for single-file testcases so I chose to "fix" > lto option streaming rather than lto-wrapper ... I'll have a closer > look to lto-wrapper. But to complain about target option mismatches > we'd have to call a target hook from lto-wrapper (or finally re-structure > all this and merge options in lto1 itself). > > Richard. > > > Honza > > > > > > Thanks, > > > Richard. > > > > > > 2015-04-23 Richard Biener <rguent...@suse.de> > > > > > > * lto-opts.c (lto_write_options): Do not record target options > > > if we are targeting a SWITCHABLE_TARGET target. We use target > > > options on functions to transfer target flags from compile to > > > link time. > > > > > > Index: gcc/lto-opts.c > > > =================================================================== > > > *** gcc/lto-opts.c (revision 222360) > > > --- gcc/lto-opts.c (working copy) > > > *************** lto_write_options (void) > > > *** 219,224 **** > > > --- 219,230 ---- > > > && lto_stream_offload_p) > > > continue; > > > > > > + /* Do not store target-specific options if we target a > > > + SWITCHABLE_TARGET target. */ > > > + if ((cl_options[option->opt_index].flags & CL_TARGET) > > > + && SWITCHABLE_TARGET) > > > + continue; > > > + > > > /* Drop options created from the gcc driver that will be rejected > > > when passed on to the driver again. */ > > > if (cl_options[option->opt_index].cl_reject_driver) > > > > > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Jennifer Guild, Dilip Upmanyu, Graham Norton HRB 21284 (AG Nuernberg)