https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112458
Bug ID: 112458 Summary: SLP permute optimization issue Product: gcc Version: 14.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: rguenth at gcc dot gnu.org Target Milestone: --- I'm facing an ICE on the vect-slp-only branch when compiling gcc.target/i386/pr98928.c with --param vect-single-lane-slp=1, I get during GIMPLE pass: vect /space/rguenther/src/gcc-clean/gcc/testsuite/gcc.target/i386/pr98928.c: In function 'main': /space/rguenther/src/gcc-clean/gcc/testsuite/gcc.target/i386/pr98928.c:11:6: internal compiler error: in operator[], at vec.h:910 0x1a69a9e vec<slpg_partition_info, va_heap, vl_embed>::operator[](unsigned int) /space/rguenther/src/gcc-clean/gcc/vec.h:910 0x1a646f4 vec<slpg_partition_info, va_heap, vl_ptr>::operator[](unsigned int) /space/rguenther/src/gcc-clean/gcc/vec.h:1599 0x1a4e5b2 vect_optimize_slp_pass::change_vec_perm_layout(_slp_tree*, vec<std::pair<unsigned int, unsigned int>, va_heap, vl_ptr>&, int, unsigned int) /space/rguenther/src/gcc-clean/gcc/tree-vect-slp.cc:4779 0x1a4e746 vect_optimize_slp_pass::internal_node_cost(_slp_tree*, int, unsigned int) /space/rguenther/src/gcc-clean/gcc/tree-vect-slp.cc:4827 0x1a503c7 vect_optimize_slp_pass::forward_pass() /space/rguenther/src/gcc-clean/gcc/tree-vect-slp.cc:5419 0x1a527d5 vect_optimize_slp_pass::run() /space/rguenther/src/gcc-clean/gcc/tree-vect-slp.cc:5953 and the issue is we end up in change_vec_perm_layout for /space/rguenther/src/gcc-clean/gcc/testsuite/gcc.target/i386/pr98928.c:11:6: note: node 0x462f8d0 (max_nunits=1, refcnt=1) vector(8) float /space/rguenther/src/gcc-clean/gcc/testsuite/gcc.target/i386/pr98928.c:11:6: note: op: VEC_PERM_EXPR /space/rguenther/src/gcc-clean/gcc/testsuite/gcc.target/i386/pr98928.c:11:6: note: { } /space/rguenther/src/gcc-clean/gcc/testsuite/gcc.target/i386/pr98928.c:11:6: note: lane permutation { 0[0] 1[0] } /space/rguenther/src/gcc-clean/gcc/testsuite/gcc.target/i386/pr98928.c:11:6: note: children 0x462ee30 0x462ef40 where the first child is a constant def: /space/rguenther/src/gcc-clean/gcc/testsuite/gcc.target/i386/pr98928.c:11:6: note: node (constant) 0x462ee30 (max_nunits=1, refcnt=1) vector(8) float /space/rguenther/src/gcc-clean/gcc/testsuite/gcc.target/i386/pr98928.c:11:6: note: { 0.0 } and the second child is internal: /space/rguenther/src/gcc-clean/gcc/testsuite/gcc.target/i386/pr98928.c:11:6: note: node 0x462ef40 (max_nunits=16, refcnt=1) vector(8) float /space/rguenther/src/gcc-clean/gcc/testsuite/gcc.target/i386/pr98928.c:11:6: note: op template: patt_53 = patt_26 ? _93 : 0.0; /space/rguenther/src/gcc-clean/gcc/testsuite/gcc.target/i386/pr98928.c:11:6: note: stmt 0 patt_53 = patt_26 ? _93 : 0.0; /space/rguenther/src/gcc-clean/gcc/testsuite/gcc.target/i386/pr98928.c:11:6: note: children 0x462efc8 0x462f5a0 0x462f738 now, for the constant def child the partition number is -1 and thus 4777 slp_tree in_node = SLP_TREE_CHILDREN (node)[entry.first]; 4778 unsigned int in_partition_i = m_vertices[in_node->vertex].partition; 4779 this_in_layout_i = m_partitions[in_partition_i].layout; we crash here. I wonder where to fend this off or where exactly we assume all children of a VEC_PERM are either internal or not. I've seen /* Check that the child nodes support the chosen layout. Checking the first child is enough, since any second child would have the same shape. */ auto first_child = SLP_TREE_CHILDREN (node)[0]; if (in_layout_i > 0 && !is_compatible_layout (first_child, in_layout_i)) return -1; but it doesn't apply here since in_layout_i is -1.