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