From 80b6ba28787d32f5ca63d9a643c110474ba79160 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Fri, 15 Aug 2014 01:36:22 +0200 Subject: [PATCH] re PR tree-optimization/62091 (ice in before_dom_children) PR tree-optimization/62091 * g++.dg/ipa/devirt-38.C: New testcase. * tree-ssa-alias.c (walk_aliased_vdefs_1): Do not clear function_entry_reached. (walk_aliased_vdefs): Clear it here. * ipa-devirt.c (check_stmt_for_type_change): Handle static storage. From-SVN: r213991 --- gcc/ChangeLog | 8 ++++++++ gcc/ipa-devirt.c | 2 ++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ipa/devirt-38.C | 30 ++++++++++++++++++++++++++++ gcc/tree-ssa-alias.c | 5 +++-- 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ipa/devirt-38.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 223e484a368f..e5e085259b8d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2014-08-14 Jan Hubicka + + PR tree-optimization/62091 + * tree-ssa-alias.c (walk_aliased_vdefs_1): Do not clear + function_entry_reached. + (walk_aliased_vdefs): Clear it here. + * ipa-devirt.c (check_stmt_for_type_change): Handle static storage. + 2014-08-14 Jan Hubicka * ipa-utils.h (compare_virtual_tables): Declare. diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index 2d356ad73b94..ff206eee259e 100644 --- a/gcc/ipa-devirt.c +++ b/gcc/ipa-devirt.c @@ -2777,6 +2777,8 @@ check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data) * BITS_PER_UNIT; op = TREE_OPERAND (op, 0); } + else if (DECL_P (op)) + ; else { tci->speculative = true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index bc879c176a9b..73a6ab835bc8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-08-14 Jan Hubicka + + PR tree-optimization/62091 + * g++.dg/ipa/devirt-38.C: New testcase. + 2014-08-14 Marek Polacek DR 458 diff --git a/gcc/testsuite/g++.dg/ipa/devirt-38.C b/gcc/testsuite/g++.dg/ipa/devirt-38.C new file mode 100644 index 000000000000..be8cbdfa563b --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-38.C @@ -0,0 +1,30 @@ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +class SnmpSyntax +{ +public: + virtual SnmpSyntax *m_fn1 () const; + ~SnmpSyntax () {} + virtual SnmpSyntax &operator=(const SnmpSyntax &); +}; + +class A : public SnmpSyntax +{ +public: + A (int); + SnmpSyntax *m_fn1 () const {} + SnmpSyntax &operator=(const SnmpSyntax &); +}; +int a; +void fn1 () +{ + for (;; a++) + switch (0) + case 0: + { + A b (0); + SnmpSyntax &c = b; + c.m_fn1 (); + } +} +// Devirtualization to A::m_fn1 would be possible, but we can not do it at the moment diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 2910374532a9..67419a9cb2f8 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -2658,8 +2658,6 @@ walk_aliased_vdefs_1 (ao_ref *ref, tree vdef, bitmap *visited, unsigned int cnt, bool *function_entry_reached) { - if (function_entry_reached) - *function_entry_reached = false; do { gimple def_stmt = SSA_NAME_DEF_STMT (vdef); @@ -2709,6 +2707,9 @@ walk_aliased_vdefs (ao_ref *ref, tree vdef, timevar_push (TV_ALIAS_STMT_WALK); + if (function_entry_reached) + *function_entry_reached = false; + ret = walk_aliased_vdefs_1 (ref, vdef, walker, data, visited ? visited : &local_visited, 0, function_entry_reached); -- 2.47.2