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

            Bug ID: 69489
           Summary: missed vectorization for boolean loop
           Product: gcc
           Version: 5.2.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jtaylor.debian at googlemail dot com
  Target Milestone: ---

following (abbreviated) code does not vectorize with gcc 5.2.1:

gcc file.c -O2 -ftree-vectorize -c

double
yule_bool_distance_char2(const char *u, const char *v, long n)
{
    long i;
    long ntt = 0, nff = 0, nft = 0, ntf = 0;

    for (i = 0; i < n; i++) {
        ntf += (u[i] && !v[i]);
        nft += (!u[i] && v[i]);
    }   
    return (2.0 * ntf * nft);
} 

but if one replaces the loop body with this:

        char x = u[i], y = v[i];
        ntf += x && (!y);
        nft += (!x) && y;

gcc will vectorize it.
As I understand it both code is equivalent, so it would be great if gcc could
vectorize both variants.

Reply via email to