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
This commit is contained in:
Jan Hubicka 2016-01-15 12:00:24 +01:00 committed by Jan Hubicka
parent 155768d65f
commit 824ca15e29
4 changed files with 33 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2016-01-15 Jan Hubicka <hubicka@ucw.cz>
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 <hubicka@ucw.cz>
* lto-streamer-out.c (subtract_estimated_size): New function.

View File

@ -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;

View File

@ -1,3 +1,8 @@
2016-01-15 Jan Hubicka <hubicka@ucw.cz>
PR ipa/68148
* g++.dg/ipa/devirt-49.C: New testcase.
2016-01-15 Christian Bruel <christian.bruel@st.com>
PR target/65837

View File

@ -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" } } */