From: Jan Hubicka Date: Fri, 15 Jan 2016 11:00:24 +0000 (+0100) Subject: re PR ipa/68148 (Devirtualization only applies to last of multiple successive calls) X-Git-Tag: basepoints/gcc-7~1615 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=824ca15e298a60f8ea31e433dd23327f86ee2227;p=thirdparty%2Fgcc.git re PR ipa/68148 (Devirtualization only applies to last of multiple successive calls) PR ipa/68148 * ipa-icf.c (sem_function::merge): Virtual functions may become reachable even if they address is not taken and there are no idrect calls. * g++.dg/ipa/devirt-49.C: New testcase. From-SVN: r232410 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 006493bb4b07..ac14805ae762 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-01-15 Jan Hubicka + + PR ipa/68148 + * ipa-icf.c (sem_function::merge): Virtual functions may become + reachable even if they address is not taken and there are no + idrect calls. + 2016-01-15 Jan Hubicka * lto-streamer-out.c (subtract_estimated_size): New function. diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index aaa6a4766c95..ef04c559bf40 100644 --- a/gcc/ipa-icf.c +++ b/gcc/ipa-icf.c @@ -1305,6 +1305,7 @@ sem_function::merge (sem_item *alias_item) /* If all callers was redirected, do not produce wrapper. */ if (alias->can_remove_if_no_direct_calls_p () + && !DECL_VIRTUAL_P (alias->decl) && !alias->has_aliases_p ()) { create_wrapper = false; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e50e1f936e1b..409c42f01720 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-01-15 Jan Hubicka + + PR ipa/68148 + * g++.dg/ipa/devirt-49.C: New testcase. + 2016-01-15 Christian Bruel PR target/65837 diff --git a/gcc/testsuite/g++.dg/ipa/devirt-49.C b/gcc/testsuite/g++.dg/ipa/devirt-49.C new file mode 100644 index 000000000000..6beb47ba9afa --- /dev/null +++ b/gcc/testsuite/g++.dg/ipa/devirt-49.C @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-ipa-devirt" } */ +struct Interface { + virtual ~Interface() {} + virtual void virtualFunc() = 0; + virtual void virtualFunc2() = 0; +}; + +struct Concrete : Interface { + int counter_; + Concrete() : counter_(0) {} + void virtualFunc() { counter_++; } + void virtualFunc2() { counter_++; } +}; + +void test(Interface &c) { + c.virtualFunc(); + c.virtualFunc2(); +} +/* { dg-final { scan-ipa-dump "2 speculatively devirtualized" "devirt" } } */