https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98535
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org Ever confirmed|0 |1 Last reconfirmed| |2021-01-19 Status|UNCONFIRMED |ASSIGNED --- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Richard Biener from comment #4) > guess 'pieces' is accessed in uninitialized parts. Using quick_grow_cleared > to init it might more reliably "crash" things rather than ending up with > strange 'niters' entry ;) Indeed. > ./cc1 -quiet t.c -I include -O3 -mcpu=neoverse-v1 during GIMPLE pass: vect t.c: In function 'i': t.c:12:1: internal compiler error: in duplicate_and_interleave, at tree-vect-slp.c:5115 12 | i() { | ^ 0x1778d9b duplicate_and_interleave(vec_info*, gimple**, tree_node*, vec<tree_node*, va_heap, vl_ptr>, unsigned int, vec<tree_node*, va_heap, vl_ptr>&) ../../src/trunk/gcc/tree-vect-slp.c:5115 with diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 1787ad74268..f4b2b69a6eb 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -5063,7 +5063,7 @@ duplicate_and_interleave (vec_info *vinfo, gimple_seq *seq, tree vector_type, tree_vector_builder partial_elts; auto_vec<tree, 32> pieces (nvectors * 2); - pieces.quick_grow (nvectors * 2); + pieces.quick_grow_cleared (nvectors * 2); for (unsigned int i = 0; i < nvectors; ++i) { /* (2) Replace ELTS[0:NELTS] with ELTS'[0:NELTS'], where each element of @@ -5112,6 +5112,7 @@ duplicate_and_interleave (vec_info *vinfo, gimple_seq *seq, tree vector_type, tree output = make_ssa_name (new_vector_type); tree input1 = pieces[in_start + (i / 2)]; tree input2 = pieces[in_start + (i / 2) + hi_start]; + gcc_assert (input1 && input2); gassign *stmt = gimple_build_assign (output, VEC_PERM_EXPR, input1, input2, permutes[i & 1]); I'll see what happens.