On 2014.01.31 at 07:22 +0100, Jan Hubicka wrote: > +tree > +vtable_pointer_value_to_binfo (tree t) > +{ > + /* We expect &MEM[(void *)&virtual_table + 16B]. > + We obtain object's BINFO from the context of the virtual table. > + This one contains pointer to virtual table represented via > + POINTER_PLUS_EXPR. Verify that this pointer match to what > + we propagated through. > + > + In the case of virtual inheritance, the virtual tables may > + be nested, i.e. the offset may be different from 16 and we may > + need to dive into the type representation. */ > + if (t && TREE_CODE (t) == ADDR_EXPR > + && TREE_CODE (TREE_OPERAND (t, 0)) == MEM_REF > + && TREE_CODE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)) == ADDR_EXPR > + && TREE_CODE (TREE_OPERAND (TREE_OPERAND (t, 0), 1)) == INTEGER_CST > + && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 0), 0), 0)) > + == VAR_DECL) > + && DECL_VIRTUAL_P (TREE_OPERAND (TREE_OPERAND > + (TREE_OPERAND (t, 0), 0), 0))) > + { > + tree vtable = TREE_OPERAND (TREE_OPERAND (TREE_OPERAND (t, 0), 0), 0); > + tree offset = TREE_OPERAND (TREE_OPERAND (t, 0), 1); > + tree binfo = TYPE_BINFO (DECL_CONTEXT (vtable)); > + > + binfo = subbinfo_with_vtable_at_offset (binfo, offset, vtable); > + gcc_assert (binfo); > + return binfo; > + } > + return NULL; > +}
I've tested your patch a little bit and hit the gcc_assert above: markus@x4 tmp % cat test.ii class A { public: unsigned length; }; class B {}; class MultiTermDocs : public virtual B { protected: A readerTermDocs; A subReaders; virtual B *m_fn1(int *); virtual ~MultiTermDocs(); }; class C : MultiTermDocs { B *m_fn1(int *); }; MultiTermDocs::~MultiTermDocs() { if (&readerTermDocs) { B *a; for (unsigned i = 0; i < subReaders.length; i++) (a != 0); } } B *C::m_fn1(int *) { return 0; } markus@x4 tmp % g++ -O2 test.ii test.ii: In destructor ‘virtual C::~C()’: test.ii:24:32: internal compiler error: in vtable_pointer_value_to_binfo, at ipa-devirt.c:1082 B *C::m_fn1(int *) { return 0; } ^ 0x9ca774 vtable_pointer_value_to_binfo(tree_node*) ../../gcc/gcc/ipa-devirt.c:1082 0x9e22b9 extr_type_from_vtbl_ptr_store ../../gcc/gcc/ipa-prop.c:606 0x9e22b9 check_stmt_for_type_change ../../gcc/gcc/ipa-prop.c:648 0xc18343 walk_aliased_vdefs_1 ../../gcc/gcc/tree-ssa-alias.c:2472 0xc1846d walk_aliased_vdefs(ao_ref*, tree_node*, bool (*)(ao_ref*, tree_node*, void*), void*, bitmap_head**) ../../gcc/gcc/tree-ssa-alias.c:2491 0x9e1cba detect_type_change ../../gcc/gcc/ipa-prop.c:702 0x9e8b63 compute_complex_assign_jump_func ../../gcc/gcc/ipa-prop.c:1089 0x9e8b63 ipa_compute_jump_functions_for_edge ../../gcc/gcc/ipa-prop.c:1635 0x9eb882 ipa_compute_jump_functions ../../gcc/gcc/ipa-prop.c:1675 0x9eb882 ipa_analyze_node(cgraph_node*) ../../gcc/gcc/ipa-prop.c:2212 0x103ea7f ipcp_generate_summary ../../gcc/gcc/ipa-cp.c:3709 0xaa4906 execute_ipa_summary_passes(ipa_opt_pass_d*) ../../gcc/gcc/passes.c:2027 0x833dbb ipa_passes ../../gcc/gcc/cgraphunit.c:2070 0x833dbb compile() ../../gcc/gcc/cgraphunit.c:2174 0x834304 finalize_compilation_unit() ../../gcc/gcc/cgraphunit.c:2329 0x62efce cp_write_global_declarations() ../../gcc/gcc/cp/decl2.c:4447 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. -- Markus