https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98211

--- Comment #8 from rsandifo at gcc dot gnu.org <rsandifo at gcc dot gnu.org> 
---
(In reply to Richard Biener from comment #7)
> Hmm, OK, so besides the incomplete bool pattern matching the issue seems to
> be that while we reject the problematic conversion in
> vectorizable_conversion it slips through via vectorizable_assignment because
> it does
> 
>       /* Conversion between boolean types of different sizes is
>          a simple assignment in case their vectypes are same
>          boolean vectors.  */
>       && (!VECTOR_BOOLEAN_TYPE_P (vectype)
>           || !VECTOR_BOOLEAN_TYPE_P (vectype_in)))
> 
> as opposed to vectorizable_conversions
> 
>   if (VECTOR_BOOLEAN_TYPE_P (vectype_out)
>       && !VECTOR_BOOLEAN_TYPE_P (vectype_in))
> 
> that was added by g:2dab46d5fc9f95de16bd9bf0f219be5e64324d1f without a
> testcase
> or PR reference so it's difficult to tell what it was supposed to allow. 
Agree that looks odd…

> Now,
> for the case in question the conversion would have slipped though anyway
> since
> the only difference in the types is the sign and that one is BOOLEAN_TYPE
> and the other INTEGER_TYPE.  So the exception above seems to intent to allow
> conversions with different precisions (note we now have precision 1 for all
> vector bools).
> 
> So I'm going to just copy the vectorizable_conversion condition into
> vectorizable_assignment as well.
Shouldn't it instead be:

  VECTOR_BOOLEAN_TYPE_P (vectype) != VECTOR_BOOLEAN_TYPE_P (vectype_in)

as is used in some other places (sometimes with ^ instead of !=)?
AFAIK using VCE would break in both directions.

Reply via email to