https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78102
--- Comment #7 from Uroš Bizjak <ubizjak at gmail dot com> --- (In reply to Uroš Bizjak from comment #4) > Let's see what breaks with the attached patch. The test compiles OK. As expected, fails following test with -msse4.1: --cut here-- typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__)); typedef long long __v2di __attribute__ ((__vector_size__ (16))); __m128i _mm_cmpeq_epi64 (__m128i __X, __m128i __Y) { return (__m128i) ((__v2di)__X == (__v2di)__Y); } __m128i _mm_cmpgt_epi64 (__m128i __X, __m128i __Y) { return (__m128i) ((__v2di)__X > (__v2di)__Y); } --cut here-- (In reply to Jakub Jelinek from comment #5) > I'm not sure it is a good idea. Then expand_vec_cond_expr_p will return > true, vectorizer will use them heavily etc. and the expander will just find > out it can't How about teaching these predicates to handle FAIL from the expander? Then we can change expanders to (e.g. vcond<VI8F_128:mode>v2di): diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index fde520f..4cd3bb2 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -11086,10 +11086,11 @@ (match_operand:V2DI 5 "general_operand")]) (match_operand:VI8F_128 1) (match_operand:VI8F_128 2)))] - "TARGET_SSE4_2" + "TARGET_SSE4_1" { - bool ok = ix86_expand_int_vcond (operands); - gcc_assert (ok); + if (!ix86_expand_int_vcond (operands)) + FAIL; + DONE; })