bash-3.1$ cat pmaxsw.c
typedef short vec_t;

extern __attribute__((aligned(16))) vec_t x [64];
extern __attribute__((aligned(16))) vec_t y [64];
extern __attribute__((aligned(16))) vec_t m [64];

void
foo ()
{
  int i;

  for (i = 0; i < 20; i++)
#if 0
    m [i] = (x [i] < y [i]) ? y [i] : x[i];
#else
    if (x [i] < y [i])
      m [i] = y [i];
    else
      m [i] = x[i];
#endif
}
bash-3.1$ make
/usr/gcc-4.3/bin/gcc -O2 -mssse3 -ftree-vectorize -ftree-vectorizer-verbose=1
-S pmaxsw.c

pmaxsw.c:9: note: for a in pmaxsw.s; do \
          insn=`basename $a .s`; \
          echo Check vectorizer on $insn.c:; \
          grep $insn $a | grep xmm; \
        done
Check vectorizer on pmaxsw.c:
make: *** [all] Error 1
bash-3.1$ 

bash-3.1$ cat pmaxsw.c
typedef short vec_t;

extern __attribute__((aligned(16))) vec_t x [64];
extern __attribute__((aligned(16))) vec_t y [64];
extern __attribute__((aligned(16))) vec_t m [64];

void
foo ()
{
  int i;

  for (i = 0; i < 20; i++)
#if 1
    m [i] = (x [i] < y [i]) ? y [i] : x[i];
#else
    if (x [i] < y [i])
      m [i] = y [i];
    else
      m [i] = x[i];
#endif
}
bash-3.1$ make
/usr/gcc-4.3/bin/gcc -O2 -mssse3 -ftree-vectorize -ftree-vectorizer-verbose=1
-S pmaxsw.c

pmaxsw.c:12: note: LOOP VECTORIZED.
pmaxsw.c:9: note: vectorized 1 loops in function.
for a in pmaxsw.s; do \
          insn=`basename $a .s`; \
          echo Check vectorizer on $insn.c:; \
          grep $insn $a | grep xmm; \
        done
Check vectorizer on pmaxsw.c:
        pmaxsw  x(%rip), %xmm0
        pmaxsw  x+16(%rip), %xmm0
bash-3.1$ 

Why can't vectorizer recognize

    if (x [i] < y [i])
      m [i] = y [i];
    else
      m [i] = x[i];

is the same as

    m [i] = (x [i] < y [i]) ? y [i] : x[i];


-- 
           Summary: vectorizer failed to work on simple loop
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: hjl at lucon dot org
GCC target triplet: x86_64-unknown-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31460

Reply via email to