On ppc64 I get: trippels@gcc1-power7: % cat nsCacheService.ii enum class nsresult; class A; class B { public: B (int); A *operator->(); }; class C { }; class A { public: virtual nsresult AddObserver (const char *, C *, bool) = 0; }; class D : A { nsresult AddObserver (const char *p1, C *p2, bool p3) { AddObserver (p1, p2, p3); } }; char *prefList[]{}; class F : C { nsresult Install (); }; nsresult F::Install () { B branch = 0; for (int i;;) branch->AddObserver (prefList[i], this, false); } trippels@gcc1-power7: % c++ -c -std=gnu++0x -O3 nsCacheService.ii nsCacheService.ii: In function ‘virtual nsresult D::AddObserver(const char*, C*, bool)’: nsCacheService.ii:20:3: internal compiler error: tree check: expected ssa_name, have var_decl in walk_aliased_vdefs_1, at tree-ssa-alias.c:2689 AddObserver (const char *p1, C *p2, bool p3) ^ 0x10c40f8f tree_check_failed(tree_node const*, char const*, int, char const*, ...) ../../gcc/gcc/tree.c:9175 0x10a88313 tree_check ../../gcc/gcc/tree.h:2733 0x10a88313 walk_aliased_vdefs_1 ../../gcc/gcc/tree-ssa-alias.c:2689 0x10a883d7 walk_aliased_vdefs(ao_ref*, tree_node*, bool (*)(ao_ref*, tree_node*, void*), void*, bitmap_head**, bool*) ../../gcc/gcc/tree-ssa-alias.c:2741 0x1074de9f ipa_polymorphic_call_context::get_dynamic_type(tree_node*, tree_node*, tree_node*, gimple_statement_base*) ../../gcc/gcc/ipa-polymorphic-call.c:1584 0x10b30543 eliminate_dom_walker::before_dom_children(basic_block_def*) ../../gcc/gcc/tree-ssa-pre.c:4285 0x10f1925b dom_walker::walk(basic_block_def*) ../../gcc/gcc/domwalk.c:177 0x10b2e1c3 eliminate ../../gcc/gcc/tree-ssa-pre.c:4431 0x10b3839b execute ../../gcc/gcc/tree-ssa-pre.c:4762 0x10b3839b execute ../../gcc/gcc/tree-ssa-pre.c:4721 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <http://gcc.gnu.org/bugs.html> for instructions.
Mine (finally a small enough testcase...). This means somebody is not updating VDEFs properly (expected for load VUSEs btw).
Ah, #5 0x0000000000c263c2 in ipa_polymorphic_call_context::get_dynamic_type ( this=0x7fffffffd790, instance=<ssa_name 0x7ffff687b678>, otr_object=<ssa_name 0x7ffff687b678>, otr_type=<record_type 0x7ffff6867b28 D>, call=<gimple_call 0x7ffff6895498>) at /space/rguenther/src/svn/trunk/gcc/ipa-polymorphic-call.c:1606 (gdb) l 1601 tci.multiple_types_encountered = false; 1602 tci.speculative = false; 1603 tci.seen_unanalyzed_store = false; 1604 1605 walk_aliased_vdefs (&ao, gimple_vuse (stmt), check_stmt_for_type_change, 1606 &tci, NULL, &function_entry_reached); this walks on gimple_vuse! (gdb) p debug_gimple_stmt (stmt) # VUSE <.MEM> pretmp_5 = this_10(D)->D.2797._vptr.A; VUSEs are not kept renamed by load PRE insertion phase so this will not work. The function is called on the call # .MEM_45 = VDEF <.MEM_6(D)> OBJ_TYPE_REF(pretmp_1;(struct D)this_10(D)->0) (this_10(D), p1_11(D), p2_14(D), 0); Of course it would be nice to keep virtual SSA form up-to-date during PRE insertion, but as of now that was not necessary (and we can't simply rename VOPs as that will break the SSA value-numbering lattice which includes virtuals). Keeping virtual SSA form up-to-date requires computing the life virtual operand on edges (which means BB exit). I'm going to try that.
Author: rguenth Date: Fri Oct 10 11:04:39 2014 New Revision: 216065 URL: https://gcc.gnu.org/viewcvs?rev=216065&root=gcc&view=rev Log: 2014-10-10 Richard Biener <rguenther@suse.de> PR tree-optimization/63476 * tree-ssa-pre.c (struct bb_bitmap_sets): Add vop_on_exit member. (BB_LIVE_VOP_ON_EXIT): New define. (create_expression_by_pieces): Assign VUSEs to stmts. (compute_avail): Track BB_LIVE_VOP_ON_EXIT. (pass_pre::execute): Assert virtual SSA form is up-to-date after insertion. * g++.dg/torture/pr63476.C: New testcase. Added: trunk/gcc/testsuite/g++.dg/torture/pr63476.C Modified: trunk/gcc/ChangeLog trunk/gcc/testsuite/ChangeLog trunk/gcc/tree-ssa-pre.c
Fixed.