https://gcc.gnu.org/g:5dde4aa27ecfefcebc0a0d7dfbf336e321ec6ea1
commit r17-3893-g5dde4aa27ecfefcebc0a0d7dfbf336e321ec6ea1 Author: Richard Biener <[email protected]> Date: Thu Sep 3 09:53:19 2026 +0200 tree-optimization/127195 - ICE with vect_create_constant_vectors With excess lanes present we miscount the number of copies of the SLP elements which eventually results in ctor_seq stmts not being emitted. PR tree-optimization/127195 * tree-vect-slp.cc (vect_create_constant_vectors): Properly compute number_of_copies, assert we end up on a vector boundary. * gcc.dg/vect/vect-pr127195.c: New testcase. Diff: --- gcc/testsuite/gcc.dg/vect/vect-pr127195.c | 21 +++++++++++++++++++++ gcc/tree-vect-slp.cc | 4 +++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/gcc/testsuite/gcc.dg/vect/vect-pr127195.c b/gcc/testsuite/gcc.dg/vect/vect-pr127195.c new file mode 100644 index 000000000000..57da05e48379 --- /dev/null +++ b/gcc/testsuite/gcc.dg/vect/vect-pr127195.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ + +typedef struct { + unsigned bold : 1; + unsigned : 16; +} vbi_char; +typedef struct { + vbi_char text[]; +} vbi_page; +vbi_page enhance_pg; +vbi_char *enhance_acp = &enhance_pg.text[1]; +int enhance_col, enhance_column; +void enhance() +{ + for (;;) { + int bold; + enhance_col = enhance_column; + for (; enhance_col; enhance_col++) + enhance_acp[enhance_col].bold = bold; + } +} diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc index ae6511cb19db..3cfc36fd5349 100644 --- a/gcc/tree-vect-slp.cc +++ b/gcc/tree-vect-slp.cc @@ -10969,7 +10969,7 @@ vect_create_constant_vectors (vec_info *vinfo, slp_tree op_node) if (!TYPE_VECTOR_SUBPARTS (vector_type).is_constant (&nunits)) nunits = group_size; - number_of_copies = nunits * number_of_vectors / group_size; + number_of_copies = (nunits * number_of_vectors - excess_elts) / group_size; constant_p = true; tree uniform_elt = NULL_TREE; @@ -11121,6 +11121,8 @@ vect_create_constant_vectors (vec_info *vinfo, slp_tree op_node) } } + gcc_assert (number_of_places_left_in_vector == nunits); + /* Since the vectors are created in the reverse order, we should invert them. */ vec_num = voprnds.length ();
