Bug 63476

Summary: [5 Regression] ICE: tree check: expected ssa_name, have var_decl in walk_aliased_vdefs_1, at tree-ssa-alias.c:2689
Product: gcc Reporter: Markus Trippelsdorf <trippels>
Component: tree-optimizationAssignee: Richard Biener <rguenth>
Status: RESOLVED FIXED    
Severity: normal    
Priority: P3    
Version: 5.0   
Target Milestone: 5.0   
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed: 2014-10-08 00:00:00

Description Markus Trippelsdorf 2014-10-07 21:05:38 UTC
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.
Comment 1 Richard Biener 2014-10-08 11:11:53 UTC
Mine (finally a small enough testcase...).  This means somebody is not updating VDEFs properly (expected for load VUSEs btw).
Comment 2 Richard Biener 2014-10-09 11:12:00 UTC
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.
Comment 3 Richard Biener 2014-10-10 11:05:12 UTC
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
Comment 4 Richard Biener 2014-10-10 11:09:12 UTC
Fixed.