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

Andi Kleen <andi-gcc at firstfloor dot org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Summary|incorrect                   |Multiple condition lead to
                   |                            |missing vectorization due
                   |                            |to missing early break

--- Comment #1 from Andi Kleen <andi-gcc at firstfloor dot org> ---
const unsigned char *search_line_fast2 (const unsigned char *s,
                                        const unsigned char *end)
{
  while (s < end) {
    if (*s == '\n' || *s == '\r' || *s == '\\' || *s == '?')
      break;
    s++;
  }
  return s;
}

compiled with -march=skylake-avx512 -fopt-info-all gives 

../gcc/gcc/testsuite/gcc.dg/vect/vect-switch-search-line-fast.c:9:12: missed:
couldn't vectorize loop
../gcc/gcc/testsuite/gcc.dg/vect/vect-switch-search-line-fast.c:9:12: missed:
not vectorized: unsupported control flow in loop.


due to this:

 /* Check if we have any control flow that doesn't leave the loop.  */
  class loop *v_loop = loop->inner ? loop->inner : loop;
  basic_block *bbs = get_loop_body (v_loop);
  for (unsigned i = 0; i < v_loop->num_nodes; i++)
    if (EDGE_COUNT (bbs[i]->succs) != 1
        && (EDGE_COUNT (bbs[i]->succs) != 2
            || !loop_exits_from_bb_p (bbs[i]->loop_father, bbs[i])))
      {
        free (bbs);
        return opt_result::failure_at (vect_location,
                                       "not vectorized:"
                                       " unsupported control flow in loop.\n");
      }


But the control flow clearly leaves the loop.

At the gimple level it gives code like


 <bb 8> [local count: 110211694]:

  <bb 3> [local count: 1044213920]:
  # s_15 = PHI <s_9(9), s_6(D)(8)>
  _1 = *s_15;
  if (_1 > 63)
    goto <bb 11>; [50.00%]
  else
    goto <bb 4>; [50.00%]

  <bb 11> [local count: 522106960]:
  goto <bb 5>; [100.00%]

  <bb 4> [local count: 522106960]:
  _14 = (int) _1;
  _17 = 9223372036854785024 >> _14;
  _18 = _17 & 1;
  _19 = _18 == 0;
  _12 = ~_19;

  <bb 5> [local count: 1044213920]:
  # prephitmp_4 = PHI <_12(4), 0(11)>
  _10 = _1 == 92;
  _13 = prephitmp_4 | _10;
  if (_13 != 0)
    goto <bb 12>; [8.03%]
  else
    goto <bb 6>; [91.97%]

 <bb 12> [local count: 83800317]:
  # s_5 = PHI <s_15(5)>
  goto <bb 7>; [100.00%]

  <bb 6> [local count: 960413605]:
  s_9 = s_15 + 1;
  if (end_7(D) > s_9)
    goto <bb 9>; [97.25%]
  else
    goto <bb 13>; [2.75%]

  <bb 13> [local count: 26411378]:
  # s_20 = PHI <s_9(6)>
  goto <bb 7>; [100.00%]

  <bb 9> [local count: 934002227]:
  goto <bb 3>; [100.00%]



which seems to come from if to switch and then switch expansion?

Reply via email to