https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98218
--- Comment #3 from Uroš Bizjak <ubizjak at gmail dot com> --- Testcase 1: --cut here-- typedef short vec __attribute__((vector_size(8))); typedef unsigned short uvec __attribute__((vector_size(8))); vec lt (vec a, vec b) { return a < b; } vec le (vec a, vec b) { return a <= b; } vec eq (vec a, vec b) { return a == b; } vec ne (vec a, vec b) { return a != b; } vec ge (vec a, vec b) { return a >= b; } vec gt (vec a, vec b) { return a > b; } vec ltu (uvec a, uvec b) { return a < b; } vec leu (uvec a, uvec b) { return a <= b; } vec geu (uvec a, uvec b) { return a >= b; } vec gtu (uvec a, uvec b) { return a > b; } --cut here-- Testcase 2: --cut here-- typedef short T; #define M 4 T a[M]; T b[M]; T s1[M]; T s2[M]; T r[M]; void foo (void) { int j; for (j = 0; j < M; j++) r[j] = (a[j] < b[j]) ? s1[j] : s2[j]; } --cut here-- gcc -O3: foo: movq a(%rip), %xmm1 movq b(%rip), %xmm0 movq s2(%rip), %xmm2 pcmpgtw %xmm1, %xmm0 movq s1(%rip), %xmm1 pand %xmm0, %xmm1 pandn %xmm2, %xmm0 por %xmm1, %xmm0 movq %xmm0, r(%rip) ret