> > This addresses miscompilations caused by improperly mixing > -f[no-]strict-overflow units (and thus optimize <= 1 and optimize >= 2 > units!). It does so by merging -f[no-]strict-overflow and the > related -f[no-]wrapv and -f[no-]trapv conservatively, that is, > if any unit uses (implicitely) -fno-strict-overflow, -fwrapv > or -fno-trapv then force that upon the compilation in and after > WPA stage. > > I know honza wants to eventually handle this via optimize attributes > but currently at least -fstrict-overflow is not suitable for that > (it's not marked 'Optimization'). Nor do we even check for > -f[no-]wrapv mismatch in can_inline_edge_p.
Yep, we need to fix all that for 4.10 > > LTO bootstrap & test ongoing on x86_64-unknown-linux-gnu, ok for trunk? > > Any other "obvious" candidates for conservative merging? > > Note that this makes it quite harmful (well - maybe?) if your > LTO compile contains a single non-optimized TU ... but you > at least know if you inspect the lto_opts section of one of the > ltrans files. Indeed, i think we should at least mention that in news.html and perhsps have short section on LTO and flags in the doc/invoke.texi? Users generally get wrong the fact that they need -flto and optimization flags at command line and we do crazy things behind their back. Like last week I noticed that we build a static binary of Firefox's shell with -fpic just because they manage to merge in an object file copiled -fPIC. (while LLVM give non-PIC binary) -fno-pic helps there, what will bebehaviour with -fstrict-overflow? > > Eventually this asks for a diagnostic by lto-wrapper (but that > gets delayed until very late ...). I am definitely trying to push myself to make command line options an priority for 4.10 stage1. Lets try to wrok on it, I think it is one of main sowstoppers for LTO at the moment. (along with debug info and fun with ASM statements definitng symbols I suppose) Honza > > Thanks, > Richard. > > 2014-02-24 Richard Biener <rguent...@suse.de> > > PR lto/60319 > * lto-opts.c (lto_write_options): Output non-explicit conservative > -fwrapv, -fno-trapv and -fno-strict-overflow. > * lto-wrapper.c (merge_and_complain): Handle merging those options. > (run_gcc): And pass them through. > > Index: gcc/lto-opts.c > =================================================================== > *** gcc/lto-opts.c (revision 208077) > --- gcc/lto-opts.c (working copy) > *************** lto_write_options (void) > *** 117,122 **** > --- 117,134 ---- > default: > gcc_unreachable (); > } > + /* We need to merge -f[no-]strict-overflow, -f[no-]wrapv and -f[no-]trapv > + conservatively, so stream out their defaults. */ > + if (!global_options_set.x_flag_wrapv > + && global_options.x_flag_wrapv) > + append_to_collect_gcc_options (&temporary_obstack, &first_p, "-fwrapv"); > + if (!global_options_set.x_flag_trapv > + && !global_options.x_flag_trapv) > + append_to_collect_gcc_options (&temporary_obstack, &first_p, > "-fno-trapv"); > + if (!global_options_set.x_flag_strict_overflow > + && !global_options.x_flag_strict_overflow) > + append_to_collect_gcc_options (&temporary_obstack, &first_p, > + "-fno-strict-overflow"); > > /* Output explicitly passed options. */ > for (i = 1; i < save_decoded_options_count; ++i) > Index: gcc/lto-wrapper.c > =================================================================== > *** gcc/lto-wrapper.c (revision 208077) > --- gcc/lto-wrapper.c (working copy) > *************** merge_and_complain (struct cl_decoded_op > *** 422,427 **** > --- 422,429 ---- > append_option (decoded_options, decoded_options_count, foption); > break; > > + case OPT_ftrapv: > + case OPT_fstrict_overflow: > case OPT_ffp_contract_: > /* For selected options we can merge conservatively. */ > for (j = 0; j < *decoded_options_count; ++j) > *************** merge_and_complain (struct cl_decoded_op > *** 429,439 **** > break; > if (j == *decoded_options_count) > append_option (decoded_options, decoded_options_count, foption); > ! /* FP_CONTRACT_OFF < FP_CONTRACT_ON < FP_CONTRACT_FAST. */ > else if (foption->value < (*decoded_options)[j].value) > (*decoded_options)[j] = *foption; > break; > > case OPT_freg_struct_return: > case OPT_fpcc_struct_return: > for (j = 0; j < *decoded_options_count; ++j) > --- 431,455 ---- > break; > if (j == *decoded_options_count) > append_option (decoded_options, decoded_options_count, foption); > ! /* FP_CONTRACT_OFF < FP_CONTRACT_ON < FP_CONTRACT_FAST, > ! -fno-trapv < -ftrapv, > ! -fno-strict-overflow < -fstrict-overflow */ > else if (foption->value < (*decoded_options)[j].value) > (*decoded_options)[j] = *foption; > break; > > + case OPT_fwrapv: > + /* For selected options we can merge conservatively. */ > + for (j = 0; j < *decoded_options_count; ++j) > + if ((*decoded_options)[j].opt_index == foption->opt_index) > + break; > + if (j == *decoded_options_count) > + append_option (decoded_options, decoded_options_count, foption); > + /* -fwrapv > -fno-wrapv. */ > + else if (foption->value > (*decoded_options)[j].value) > + (*decoded_options)[j] = *foption; > + break; > + > case OPT_freg_struct_return: > case OPT_fpcc_struct_return: > for (j = 0; j < *decoded_options_count; ++j) > *************** run_gcc (unsigned argc, char *argv[]) > *** 591,596 **** > --- 607,615 ---- > case OPT_freg_struct_return: > case OPT_fpcc_struct_return: > case OPT_ffp_contract_: > + case OPT_fwrapv: > + case OPT_ftrapv: > + case OPT_fstrict_overflow: > break; > > default: