https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106841
Martin Liška <marxin at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|ice in |[12/13 Regression] ICE in |vect_get_vec_defs_for_opera |vect_get_vec_defs_for_opera |nd, at |nd, at |tree-vect-stmts.cc:1509 |tree-vect-stmts.cc:1509 | |since | |r12-2733-g31855ba6b16cd138 Status|UNCONFIRMED |NEW Target Milestone|--- |12.3 Last reconfirmed| |2022-09-06 CC| |marxin at gcc dot gnu.org, | |rguenth at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #3 from Martin Liška <marxin at gcc dot gnu.org> --- Thanks for the report! Reduced to: $ cat pr106841.C struct R3 { double z; R3(R3 A, R3 B) : z(B.z - A.z) {} double norme() { return z; } }; struct TBoundaryEdge { int *vertices[2]; int &operator[](int i) { return *vertices[i]; } }; struct Mesh { int vertices; TBoundaryEdge *bedges; int operator()(int &vv) { return &vv - &vertices; } TBoundaryEdge be(int i) { return bedges[i]; } }; template <typename Data> struct GenericElement { typedef typename Data::V Vertex; static const int nv = Data::NbOfVertices; Vertex *vertices[nv]; double mes; void set(int *iv) { Vertex *v0; for (int i = 0; i < nv; ++i) vertices[i] = v0 + iv[i]; mes = Data::mesure(vertices); } }; struct DataSeg3 { static const int NbOfVertices = 2; typedef R3 V; static double mesure(V *pv[]) { return R3(*pv[0], *pv[1]).norme(); } }; struct MeshS { MeshS(); }; template <class> struct Movemesh_Op { int operator()() const; }; template <> int Movemesh_Op<int>::operator()() const { Mesh pTh; GenericElement<DataSeg3> *bS = new GenericElement<DataSeg3>; for (int ibe; ibe; ibe++) { TBoundaryEdge K(pTh.be(ibe)); int iv[2]; for (int i = 0; i < 2; i++) { int &__trans_tmp_2 = K[i]; iv[i] = pTh(__trans_tmp_2); } bS[ibe].set(iv); } MeshS T_Th; } $ g++ pr106841.C -c -w -O3 -ffast-math -march=bdver2 during GIMPLE pass: vect pr106841.C: In member function ‘int Movemesh_Op< <template-parameter-1-1> >::operator()() const [with <template-parameter-1-1> = int]’: pr106841.C:37:17: internal compiler error: in vect_get_vec_defs_for_operand, at tree-vect-stmts.cc:1509 37 | template <> int Movemesh_Op<int>::operator()() const { | ^~~~~~~~~~~~~~~~ 0x9ea8b8 vect_get_vec_defs_for_operand(vec_info*, _stmt_vec_info*, unsigned int, tree_node*, vec<tree_node*, va_heap, vl_ptr>*, tree_node*) /home/marxin/Programming/gcc/gcc/tree-vect-stmts.cc:1509 0x2236ade vect_get_gather_scatter_ops /home/marxin/Programming/gcc/gcc/tree-vect-stmts.cc:3066 0x2247d85 vectorizable_load /home/marxin/Programming/gcc/gcc/tree-vect-stmts.cc:9627 0x2250120 vect_transform_stmt(vec_info*, _stmt_vec_info*, gimple_stmt_iterator*, _slp_tree*, _slp_instance*) /home/marxin/Programming/gcc/gcc/tree-vect-stmts.cc:11344 0x15081f1 vect_transform_loop_stmt /home/marxin/Programming/gcc/gcc/tree-vect-loop.cc:9606 0x1523202 vect_transform_loop(_loop_vec_info*, gimple*) /home/marxin/Programming/gcc/gcc/tree-vect-loop.cc:10042 0x15649de vect_transform_loops /home/marxin/Programming/gcc/gcc/tree-vectorizer.cc:1007 0x1564fbf try_vectorize_loop_1 /home/marxin/Programming/gcc/gcc/tree-vectorizer.cc:1153 0x1564fbf try_vectorize_loop /home/marxin/Programming/gcc/gcc/tree-vectorizer.cc:1183 0x1565354 execute /home/marxin/Programming/gcc/gcc/tree-vectorizer.cc:1299 Please submit a full bug report, with preprocessed source (by using -freport-bug). Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions. And it started with r12-2733-g31855ba6b16cd138