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


Reply via email to