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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rsandifo at gcc dot gnu.org

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
We somehow compute res_nelts to 12, coming via

  /* (1) If SEL is a suitable mask as determined by
     valid_mask_for_fold_vec_perm_cst_p, then:
     res_npatterns = max of npatterns between ARG0, ARG1, and SEL
     res_nelts_per_pattern = max of nelts_per_pattern between
                             ARG0, ARG1 and SEL.
     (2) If SEL is not a suitable mask, and TYPE is VLS then:
     res_npatterns = nelts in result vector.
     res_nelts_per_pattern = 1.
     This exception is made so that VLS ARG0, ARG1 and SEL work as before.  */
  if (valid_mask_for_fold_vec_perm_cst_p (arg0, arg1, sel, reason))
    {

I suppose doing

  else if (TYPE_VECTOR_SUBPARTS (type).is_constant (&res_nelts))

first would fix this, but then the above looks wrong?

I'm going to test & push the "obvious" to fix x86_64, but I suppose you should
double-check your logic that goes wrong for non-VLA vectors.

Reply via email to