Jan Hubicka <hubi...@ucw.cz> wrote: >> If -fprofile-use is specified, but no .gcda file is found, reset all >> the flags back to the values they would have had if -fprofile-use was >> not specified. Since the code path where -fprofile-use is on and >> .gcda files are not found is not a well tested pass, this will >> increase the robustness of FDO. Further, in the event an ICE is >found >> when doing FDO, this allows users to delete .gcda files as a work >> around without having to implement complex modifications to the build >> system. To ensure the testsuite still passes (and is relevant), some >> tests which used -fprofile-use but had no .gcda file had to be moved >> so that they would have a .gcda file generated. This also involved >> adding a main to these unit tests. >> >> Bootstrapped and regtested on x86_64. Ok for trunk? >> >> 2009-09-29 Neil Vachharajani <nvach...@google.com> >> * coverage.c (read_counts_file): Disable profile use if no .gcda >> file is found. >> * opts.c (common_handle_option): Call set_profile_use instead of >> directly setting parameters in -fprofile-use. >> (set_profile_use): New function. >> * opts.h (set_profile_use): New function. >> * testsuite/g++.dg/tree-ssa/dom-invalid.C: Moved to >> testsuite/g++.dg/tree-prof. >> * testsuite/g++.dg/tree-prof/dom-invalid.C: See above. >> * testsuite/gcc.dg/pr26570.c: Moved to >> testsuite/gcc.dg/tree-prof. >> * testsuite/gcc.dg/tree-prof/pr26570.c: See above. main added. >> * testsuite/gcc.dg/pr32773.c: Moved to >> testsuite/gcc.dg/tree-prof. >> * testsuite/gcc.dg/tree-prof/pr32773.c: See above. main added. >> > >> + >> +/* Set FLAG_PROFILE_USE and dependent flags based on VALUE. This >> + function is used to handle the -f(no)profile-use option as well >as >> + to reset flags if a .gcda file is not found. */ >> + >> +void >> +set_profile_use (bool value, bool force) >> +{ >> + flag_profile_use = value; >> + if (!flag_branch_probabilities_set || force) >> + flag_branch_probabilities = value; >> + if (!flag_profile_values_set || force) >> + flag_profile_values = value; >> + if (!flag_unroll_loops_set) >> + flag_unroll_loops = value; >> + if (!flag_peel_loops_set) >> + flag_peel_loops = value; >> + if (!flag_tracer_set) >> + flag_tracer = value; >> + if (!flag_value_profile_transformations_set || force) >> + flag_value_profile_transformations = value; >> + if (!flag_inline_functions_set) >> + flag_inline_functions = value; >> + if (!flag_ipa_cp_set) >> + flag_ipa_cp = value; >> + if (!flag_ipa_cp_clone_set) >> + { >> + if (!flag_ipa_cp_set || flag_ipa_cp) >> + flag_ipa_cp_clone = value; >> + } >> + if (!flag_predictive_commoning_set) >> + flag_predictive_commoning = value; >> + if (!flag_unswitch_loops_set) >> + flag_unswitch_loops = value; >> + if (!flag_gcse_after_reload_set) >> + flag_gcse_after_reload = value; >> +} > >It seems to make sense to disable profile feedback when GCDA is >missing. However I wonder if we can't >figure out before finishing of parsing of flags? >Machine descriptions may want to alter options depending on profile-use >so this approach seems fragile.
You'd have to move handling of fprofile-use to the driver then. And think about what to do with lto. Btw, why bother to reset any flags besides of those controlling profile computation at all? Richard. >Honza