From 325396bf2b5f86f3ade75aec266b39881784d7d3 Mon Sep 17 00:00:00 2001 From: hubicka Date: Thu, 14 Aug 2014 23:36:22 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@213991 138bc75d-0d04-0410-961f-82ee72b054a4 --- 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 223e484a368..e5e085259b8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 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. * ipa-devirt.c (odr_subtypes_equivalent_p): New function diff --git a/gcc/ipa-devirt.c b/gcc/ipa-devirt.c index 2d356ad73b9..ff206eee259 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 bc879c176a9..73a6ab835bc 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 00000000000..be8cbdfa563 --- /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 2910374532a..67419a9cb2f 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.11.4.GIT