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

--- Comment #8 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-09-07 
08:25:44 UTC ---
(In reply to comment #1)
> While this exact testcase is a recent regression, caused by
> http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=178480
> 
> double s1[4], s2[4], s3[4];
> 
> void
> foo (void)
> {
>   int i;
>   for (i = 0; i < 4; i++)
>     s3[i] = !__builtin_isunordered (s1[i], s2[i]) && s1[i] != s2[i] ? -1.0 :
> 0.0;
> }
> 
> ICEd for some time already (e.g. with -O3 -mavx or on powerpc64 with -O3
> -mvsx).
> The problem is that vcond isn't supported for all possible conditions (LTGT in
> this case) on all targets, the sse.md pattern just ICEs if the expanding
> routine fails, on powerpc64 it ICEs in the middle end because it FAILed.  So,
> to fix this either vcond conditions would need to test for the unsupported
> condition codes and the vectorizer would need to use the condition, or all
> targets that provide vcond* patterns would need to support all possible
> condition codes.

We could for now strip the number of supported comparison codes down
and remove the irregular ones, giving expand_vec_cond_expr_p a
comparison code argument.

Or split the vcond<mode><mode> pattern into different ones for each
comparison code (ugh).

Reply via email to