https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80634

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Target|                            |x86_64-*-*, i?86-*-*
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2017-05-05
                 CC|                            |rguenth at gcc dot gnu.org
             Blocks|                            |53947
     Ever confirmed|0                           |1

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed.  Yet another example where the alingment peeling is confused by the
vectorizer cost model of the target (well -- not entirely so but clearly that's
part of the story).

There's some niter-based cost modeling going on as well that's very
conservative
at the moment:

      /* Cost model #2 - if peeling may result in a remaining loop not
         iterating enough to be vectorized then do not peel.  */
      if (do_peeling
          && LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo))
        {
          unsigned max_peel
            = npeel == 0 ? LOOP_VINFO_VECT_FACTOR (loop_vinfo) - 1 : npeel;
          if (LOOP_VINFO_INT_NITERS (loop_vinfo)
              < LOOP_VINFO_VECT_FACTOR (loop_vinfo) + max_peel)
            do_peeling = false;
        }

so it just ensures the remaining vector loop would iterate at least once.  But
in reality it should use the full cost model, thus looking at the peeling cost,
esp. if we need to add a epilogue.  That's not easily possible right now so
some better heuristic is needed here, like pessimizing the case where
niter is a multiple of VF.


Referenced Bugs:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53947
[Bug 53947] [meta-bug] vectorizer missed-optimizations

Reply via email to