On Fri, Mar 9, 2018 at 10:25 AM, Paul Hua <paul.hua...@gmail.com> wrote:
> It's looks fixed
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82965#c12  on mips64el.
Hmm, is it fixed? or is it exposed now on mips64el?  I read the latter
from the comment.
I think the issue is like explained, but haven't dug into when/why it
is triggered in vect_peeling only for some targets.
Honza asked couple questions about my patch offline, I will revisit
the patch, see how to address
his concern.

Thanks,
bin
>
> Thanks.
>
> On Mon, Feb 26, 2018 at 8:02 PM, Bin.Cheng <amker.ch...@gmail.com> wrote:
>> Ping^2
>>
>> Thanks,
>> bin
>>
>> On Mon, Feb 19, 2018 at 5:14 PM, Jakub Jelinek <ja...@redhat.com> wrote:
>>> Hi!
>>>
>>> Honza, do you think you could have a look at this P1 fix?
>>>
>>> Thanks.
>>>
>>> On Wed, Jan 31, 2018 at 10:03:51AM +0000, Bin Cheng wrote:
>>>> Hi,
>>>> This patch fixes invalid profile count information in vectorization 
>>>> peeling.
>>>> Current implementation is a bit confusing for me since it tries to compute
>>>> an overall probability based on scaling probability and change of estimated
>>>> niters.  This patch does it in two steps.  Firstly it does the scaling, 
>>>> then
>>>> it adjusts to new estimated niters by simply adjusting loop's latch count
>>>> information; scaling the loop's count information by the proportion
>>>> new_estimated_niters/old_estimate_niters.  Of course we have to adjust loop
>>>> latch's count information back after scaling.
>>>>
>>>> Bootstrap and test on x86_64 and AArch64.  gcc.dg/vect/pr79347.c is fixed
>>>> for both PR82965 and PR83991.  Is this OK?
>>>>
>>>> Thanks,
>>>> bin
>>>>
>>>> 2018-01-30  Bin Cheng  <bin.ch...@arm.com>
>>>>
>>>>       PR tree-optimization/82965
>>>>       PR tree-optimization/83991
>>>>       * cfgloopmanip.c (scale_loop_profile): Further scale loop's profile
>>>>       information if the loop was predicted to iterate too many times.
>>>
>>>> diff --git a/gcc/cfgloopmanip.c b/gcc/cfgloopmanip.c
>>>> index b9b76d8..1f560b8 100644
>>>> --- a/gcc/cfgloopmanip.c
>>>> +++ b/gcc/cfgloopmanip.c
>>>> @@ -509,7 +509,7 @@ scale_loop_profile (struct loop *loop, 
>>>> profile_probability p,
>>>>                   gcov_type iteration_bound)
>>>>  {
>>>>    gcov_type iterations = expected_loop_iterations_unbounded (loop);
>>>> -  edge e;
>>>> +  edge e, preheader_e;
>>>>    edge_iterator ei;
>>>>
>>>>    if (dump_file && (dump_flags & TDF_DETAILS))
>>>> @@ -521,77 +521,66 @@ scale_loop_profile (struct loop *loop, 
>>>> profile_probability p,
>>>>              (int)iteration_bound, (int)iterations);
>>>>      }
>>>>
>>>> +  /* Scale the probabilities.  */
>>>> +  scale_loop_frequencies (loop, p);
>>>> +
>>>>    /* See if loop is predicted to iterate too many times.  */
>>>> -  if (iteration_bound && iterations > 0
>>>> -      && p.apply (iterations) > iteration_bound)
>>>> +  if (iteration_bound == 0 || iterations <= 0
>>>> +      || p.apply (iterations) <= iteration_bound)
>>>> +    return;
>>>> +
>>>> +  e = single_exit (loop);
>>>> +  preheader_e = loop_preheader_edge (loop);
>>>> +  profile_count count_in = preheader_e->count ();
>>>> +  if (e && preheader_e
>>>> +      && count_in > profile_count::zero ()
>>>> +      && loop->header->count.initialized_p ())
>>>>      {
>>>> -      /* Fixing loop profile for different trip count is not trivial; the 
>>>> exit
>>>> -      probabilities has to be updated to match and frequencies propagated 
>>>> down
>>>> -      to the loop body.
>>>> -
>>>> -      We fully update only the simple case of loop with single exit that 
>>>> is
>>>> -      either from the latch or BB just before latch and leads from BB with
>>>> -      simple conditional jump.   This is OK for use in vectorizer.  */
>>>> -      e = single_exit (loop);
>>>> -      if (e)
>>>> -     {
>>>> -       edge other_e;
>>>> -       profile_count count_delta;
>>>> +      edge other_e;
>>>> +      profile_count count_delta;
>>>>
>>>> -          FOR_EACH_EDGE (other_e, ei, e->src->succs)
>>>> -         if (!(other_e->flags & (EDGE_ABNORMAL | EDGE_FAKE))
>>>> -             && e != other_e)
>>>> -           break;
>>>> +      FOR_EACH_EDGE (other_e, ei, e->src->succs)
>>>> +     if (!(other_e->flags & (EDGE_ABNORMAL | EDGE_FAKE))
>>>> +         && e != other_e)
>>>> +       break;
>>>>
>>>> -       /* Probability of exit must be 1/iterations.  */
>>>> -       count_delta = e->count ();
>>>> -       e->probability = profile_probability::always ()
>>>> +      /* Probability of exit must be 1/iterations.  */
>>>> +      count_delta = e->count ();
>>>> +      e->probability = profile_probability::always ()
>>>>                               .apply_scale (1, iteration_bound);
>>>> -       other_e->probability = e->probability.invert ();
>>>> -       count_delta -= e->count ();
>>>> -
>>>> -       /* If latch exists, change its count, since we changed
>>>> -          probability of exit.  Theoretically we should update everything 
>>>> from
>>>> -          source of exit edge to latch, but for vectorizer this is 
>>>> enough.  */
>>>> -       if (loop->latch
>>>> -           && loop->latch != e->src)
>>>> -         {
>>>> -           loop->latch->count += count_delta;
>>>> -         }
>>>> -     }
>>>> +      other_e->probability = e->probability.invert ();
>>>>
>>>>        /* Roughly speaking we want to reduce the loop body profile by the
>>>>        difference of loop iterations.  We however can do better if
>>>>        we look at the actual profile, if it is available.  */
>>>> -      p = p.apply_scale (iteration_bound, iterations);
>>>> -
>>>> -      if (loop->header->count.initialized_p ())
>>>> -     {
>>>> -       profile_count count_in = profile_count::zero ();
>>>> +      p = profile_probability::always ();
>>>>
>>>> -       FOR_EACH_EDGE (e, ei, loop->header->preds)
>>>> -         if (e->src != loop->latch)
>>>> -           count_in += e->count ();
>>>> -
>>>> -       if (count_in > profile_count::zero () )
>>>> -         {
>>>> -           p = count_in.probability_in (loop->header->count.apply_scale
>>>> -                                              (iteration_bound, 1));
>>>> -         }
>>>> -     }
>>>> +      count_in = count_in.apply_scale (iteration_bound, 1);
>>>> +      p = count_in.probability_in (loop->header->count);
>>>>        if (!(p > profile_probability::never ()))
>>>>       p = profile_probability::very_unlikely ();
>>>> -    }
>>>>
>>>> -  if (p >= profile_probability::always ()
>>>> -      || !p.initialized_p ())
>>>> -    return;
>>>> +      if (p >= profile_probability::always ()
>>>> +       || !p.initialized_p ())
>>>> +     return;
>>>>
>>>> -  /* Scale the actual probabilities.  */
>>>> -  scale_loop_frequencies (loop, p);
>>>> -  if (dump_file && (dump_flags & TDF_DETAILS))
>>>> -    fprintf (dump_file, ";; guessed iterations are now %i\n",
>>>> -          (int)expected_loop_iterations_unbounded (loop));
>>>> +      /* If latch exists, change its count, since we changed
>>>> +      probability of exit.  Theoretically we should update everything from
>>>> +      source of exit edge to latch, but for vectorizer this is enough.  */
>>>> +      if (loop->latch && loop->latch != e->src)
>>>> +     loop->latch->count += count_delta;
>>>> +
>>>> +      /* Scale the probabilities.  */
>>>> +      scale_loop_frequencies (loop, p);
>>>> +
>>>> +      /* Change latch's count back.  */
>>>> +      if (loop->latch && loop->latch != e->src)
>>>> +     loop->latch->count -= count_delta;
>>>> +
>>>> +      if (dump_file && (dump_flags & TDF_DETAILS))
>>>> +     fprintf (dump_file, ";; guessed iterations are now %i\n",
>>>> +              (int)expected_loop_iterations_unbounded (loop));
>>>> +    }
>>>>  }
>>>>
>>>>  /* Recompute dominance information for basic blocks outside LOOP.  */
>>>
>>>
>>>         Jakub

Reply via email to