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

            Bug ID: 63168
           Summary: not vectorized: latch block not empty
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: glisse at gcc dot gnu.org

Consider the 2 codes below.

int mymax1(int *it, int *end)
{
  int max = *it++;
  for (; it != end; it++)
    if (*it > max)
      max = *it;
  return max;
}
int mymax2(int *it, int *end)
{
  int max = *it;
  while (++it != end)
    if (*it > max)
      max = *it;
  return max;
}

Compiled with g++ -Ofast, the first one is vectorized but not the second one.
It gives up immediately because of "latch block not empty". That seems rather
fragile :-(

  <bb 3>:
  max_8 = *it_6;
  max_10 = MAX_EXPR <max_2, max_8>;

  <bb 4>:
  # it_1 = PHI <it_6(3), it_4(D)(2)>
  # max_2 = PHI <max_10(3), max_5(2)>
  it_6 = it_1 + 4;
  if (it_6 != end_7(D))
    goto <bb 3>;
  else
    goto <bb 5>;


There are several related bugs (like PR 33447), feel free to mark as a dup if
you can identify one for sure.

(code taken from http://stackoverflow.com/q/25622109/1918193 apparently there
may be other issues with what gcc produces)

Reply via email to