On Sun, Oct 6, 2013 at 6:51 AM, Jan Hubicka <hubi...@ucw.cz> wrote:
>> The second part ensures that frequencies are correctly updated after
>> inlining. The problem is that after inlining the frequencies were
>> being recomputed directly from the corresponding bb counts in
>> rebuild_frequencies. If the counts had been truncated to 0, then the
>> recomputed frequencies would become 0 as well (often leading to
>> inconsistencies in the frequencies between blocks). Then the above
>> change to probably_never_executed would not help identify these blocks
>> as non-cold from the frequencies. The fix was to use the existing
>> logic used during static profile rebuilding to also
>> recompute/propagate the frequencies from the branch probabilities in
>> the profile feedback case. I also renamed a number of estimate_*
>> routines to compute_* and updated the comments to reflect the fact
>> that these routines are not doing estimation (from a static profile),
>> but in fact recomputing/propagating frequencies from the existing
>> (either guessed or profile-feedback-based) probabilities.
>
> I see where your plan - you want frequencies to be computed purely on
> probabilities that are there.  This however will lead to unnecesary loss of
> precisions for functions with large counts: probabilities are truncated in
> precision and the propagation won't give correct answers and has serious
> truncating issues.
>
> So perhaps we want to execute this only if maximal count in function is low?
> (i.e. less than REG_BR_PROB_BASE or even REG_BR_PROB_BASE/10 - if counts
> are close enough the roundoff errors of count updating should be less terrible
> than errors introduced by the propagation).

Yes, I think that is a better approach.

>
>> -/* Estimate probabilities of loopback edges in loops at same nest level.  */
>> +/* Compute frequencies in loops at same nest level.  */
>>
>>  static void
>> -estimate_loops_at_level (struct loop *first_loop)
>> +compute_loops_at_level (struct loop *first_loop)
>
> I would keep "estimate".  The whole logic is not safe and it will lead to
> mistakes for irreducible loops and many other cases...

Ok

>
>> @@ -3027,18 +3042,16 @@ void
>>  rebuild_frequencies (void)
>>  {
>>    timevar_push (TV_REBUILD_FREQUENCIES);
>> -  if (profile_status == PROFILE_GUESSED)
>> +  if (profile_status == PROFILE_GUESSED || profile_status == PROFILE_READ)
>>      {
>>        loop_optimizer_init (0);
>>        add_noreturn_fake_exit_edges ();
>>        mark_irreducible_loops ();
>>        connect_infinite_loops_to_exit ();
>> -      estimate_bb_frequencies ();
>> +      compute_bb_frequencies (true);
>
> Here please add the check about maximal count in functiona and commnet
> (especially for case we will remember to remove this hack if we switch to 
> sreal
> based counts/frequencies/probabilities)
>
> OK, with those changes (if it fixes the problem)

Ok thanks.
Teresa

>
> Thanks,
> Honza



-- 
Teresa Johnson | Software Engineer | tejohn...@google.com | 408-460-2413

Reply via email to