re PR tree-optimization/48772 (ICE: SIGSEGV in walk_non_aliased_vuses (gimple.h:1100) with -O -fnon-call-exceptions -fno-tree-ccp -fno-tree-dce)

2011-04-27  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/48772
	* tree-ssa-pre.c (eliminate): Update call stmts after elimination
	only.

	* g++.dg/pr48772.C: New testcase.

From-SVN: r173019
This commit is contained in:
Richard Guenther 2011-04-27 10:36:35 +00:00 committed by Richard Biener
parent f63d806d66
commit 9aef53ee4c
4 changed files with 55 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2011-04-27 Richard Guenther <rguenther@suse.de>
PR tree-optimization/48772
* tree-ssa-pre.c (eliminate): Update call stmts after elimination
only.
2011-04-27 Richard Guenther <rguenther@suse.de>
* tree-ssa-alias.c (indirect_refs_may_alias_p): Fix

View File

@ -1,3 +1,8 @@
2011-04-27 Richard Guenther <rguenther@suse.de>
PR tree-optimization/48772
* g++.dg/pr48772.C: New testcase.
2011-04-27 Jakub Jelinek <jakub@redhat.com>
PR c/48742

View File

@ -0,0 +1,35 @@
// { dg-do compile }
// { dg-options "-O -fnon-call-exceptions -fno-tree-ccp -fno-tree-dce" }
extern "C" void abort ();
struct A
{
void foo ()
{
this->bar ();
}
virtual void bar ()
{
abort ();
}
~A ()
{
}
};
struct B:A
{
virtual void bar ()
{
}
};
int
main ()
{
B b;
b.foo ();
return 0;
}

View File

@ -4186,6 +4186,7 @@ static unsigned int
eliminate (void)
{
VEC (gimple, heap) *to_remove = NULL;
VEC (gimple, heap) *to_update = NULL;
basic_block b;
unsigned int todo = 0;
gimple_stmt_iterator gsi;
@ -4411,7 +4412,7 @@ eliminate (void)
}
gimple_call_set_fn (stmt, fn);
update_stmt (stmt);
VEC_safe_push (gimple, heap, to_update, stmt);
/* When changing a call into a noreturn call, cfg cleanup
is needed to fix up the noreturn call. */
@ -4563,6 +4564,13 @@ eliminate (void)
}
VEC_free (gimple, heap, to_remove);
/* We cannot update call statements with virtual operands during
SSA walk. This might remove them which in turn makes our
VN lattice invalid. */
FOR_EACH_VEC_ELT (gimple, to_update, i, stmt)
update_stmt (stmt);
VEC_free (gimple, heap, to_update);
return todo;
}