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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Priority|P3                          |P1
   Last reconfirmed|2023-09-07 00:00:00         |2023-10-17

--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> ---
Re-confirmed.

during GIMPLE pass: slp
t.c: In function 'f':
t.c:3:6: internal compiler error: in to_constant, at poly-int.h:588
    3 | void f(unsigned long *expected, svuint64_t values) {
      |      ^
0xe915f8 poly_int<2u, unsigned long>::to_constant() const
        /space/rguenther/src/gcc/gcc/poly-int.h:588
0x1aedf84 vectorizable_slp_permutation_1
        /space/rguenther/src/gcc/gcc/tree-vect-slp.cc:8766
0x1aeee54 vectorizable_slp_permutation
        /space/rguenther/src/gcc/gcc/tree-vect-slp.cc:8931
0x1ae4321 vect_slp_analyze_node_operations_1
        /space/rguenther/src/gcc/gcc/tree-vect-slp.cc:6049

the comment is outdated, we check

  unsigned olanes = ncopies * SLP_TREE_LANES (node);
  gcc_assert (repeating_p || multiple_p (olanes, nunits));

but then we have to adjust the following to poly arith somehow:

          if (repeating_p)
            vperm.quick_push ({{p.first, 0}, p.second + active_lane[p.first]});
          else
            {
              /* We checked above that the vectors are constant-length.  */
              unsigned vnunits = TYPE_VECTOR_SUBPARTS (vtype).to_constant ();
              unsigned vi = (active_lane[p.first] + p.second) / vnunits;
              unsigned vl = (active_lane[p.first] + p.second) % vnunits;
              vperm.quick_push ({{p.first, vi}, vl});

Reply via email to