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

--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
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.  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.

Reply via email to