public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug tree-optimization/47316] New: devirtualize calls to virtual methods that are never further overriden
@ 2011-01-16 15:26 zsojka at seznam dot cz
2011-01-17 8:02 ` [Bug tree-optimization/47316] " zsojka at seznam dot cz
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: zsojka at seznam dot cz @ 2011-01-16 15:26 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47316
Summary: devirtualize calls to virtual methods that are never
further overriden
Product: gcc
Version: 4.6.0
Status: UNCONFIRMED
Severity: enhancement
Priority: P3
Component: tree-optimization
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: zsojka@seznam.cz
CC: jamborm@gcc.gnu.org
Created attachment 22984
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=22984
testcase
Similiar to PR46043, but the compiler itself can be able to find out there are
cases a virtual method is never overriden.
Maybe this is the original intention of the devirtualization work, but in the
case it is not, I am opening this PR.
It is quite common to have one base class and several derived classes that are
no further derived, and the hierarchy looks roughly like:
class Base {
virtual void f1();
virtual void f2();
virtual void f3();
};
class A : Base {
virtual void f1() { ... this->f3(); ... }
virtual void f2() { ... this->f1(); ... }
};
class B : Base {
virtual void f2() { ... this->f1(); ... }
};
void foo(A *a)
{
... a->f1(); ...
}
In a whole-program mode, if the compiler finds no type/variable is coming from
external calls (where there could be possibly type derived from Base/A/B), all
these cases could be devirtualized.
Attached is a simple testcase that could be devirtualized, but isn't even with:
$ g++ tstdevirt.C -O3 -fwhole-program
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug tree-optimization/47316] devirtualize calls to virtual methods that are never further overriden
2011-01-16 15:26 [Bug tree-optimization/47316] New: devirtualize calls to virtual methods that are never further overriden zsojka at seznam dot cz
@ 2011-01-17 8:02 ` zsojka at seznam dot cz
2011-01-17 12:35 ` redi at gcc dot gnu.org
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: zsojka at seznam dot cz @ 2011-01-17 8:02 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47316
--- Comment #1 from Zdenek Sojka <zsojka at seznam dot cz> 2011-01-17 06:48:50 UTC ---
Actually better solution would be function and type attributes, hinting the
function is never overriden.
The automatic analysis wouldn't work in cases like:
std::vector<A *> vec;
if there are any library calls inside std::vector.
Attributes would also work in non-whole-program mode.
I am sorry for not thinking it through - or rather forgetting the issues it had
and opening this PR so enthusiastically.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug tree-optimization/47316] devirtualize calls to virtual methods that are never further overriden
2011-01-16 15:26 [Bug tree-optimization/47316] New: devirtualize calls to virtual methods that are never further overriden zsojka at seznam dot cz
2011-01-17 8:02 ` [Bug tree-optimization/47316] " zsojka at seznam dot cz
@ 2011-01-17 12:35 ` redi at gcc dot gnu.org
2011-01-17 12:39 ` jamborm at gcc dot gnu.org
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: redi at gcc dot gnu.org @ 2011-01-17 12:35 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47316
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> 2011-01-17 12:02:02 UTC ---
(In reply to comment #1)
> Actually better solution would be function and type attributes, hinting the
> function is never overriden.
C++0x has override control features:
struct B {
virtual void f() const final;
};
As I've commented on several PRs, any work in this area should be done in line
with C++0x, not with GNU-specific attributes
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug tree-optimization/47316] devirtualize calls to virtual methods that are never further overriden
2011-01-16 15:26 [Bug tree-optimization/47316] New: devirtualize calls to virtual methods that are never further overriden zsojka at seznam dot cz
2011-01-17 8:02 ` [Bug tree-optimization/47316] " zsojka at seznam dot cz
2011-01-17 12:35 ` redi at gcc dot gnu.org
@ 2011-01-17 12:39 ` jamborm at gcc dot gnu.org
2013-12-17 16:22 ` hubicka at gcc dot gnu.org
2013-12-17 16:25 ` hubicka at gcc dot gnu.org
4 siblings, 0 replies; 6+ messages in thread
From: jamborm at gcc dot gnu.org @ 2011-01-17 12:39 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47316
--- Comment #3 from Martin Jambor <jamborm at gcc dot gnu.org> 2011-01-17 12:20:09 UTC ---
Actually, thanks for filing the bug. Devirtualization and other
optimizations (such as struct-reorg) based on type escape analysis are
a debated issue and it is nice to know users have interest in it.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug tree-optimization/47316] devirtualize calls to virtual methods that are never further overriden
2011-01-16 15:26 [Bug tree-optimization/47316] New: devirtualize calls to virtual methods that are never further overriden zsojka at seznam dot cz
` (2 preceding siblings ...)
2011-01-17 12:39 ` jamborm at gcc dot gnu.org
@ 2013-12-17 16:22 ` hubicka at gcc dot gnu.org
2013-12-17 16:25 ` hubicka at gcc dot gnu.org
4 siblings, 0 replies; 6+ messages in thread
From: hubicka at gcc dot gnu.org @ 2013-12-17 16:22 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47316
Jan Hubicka <hubicka at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |hubicka at gcc dot gnu.org
--- Comment #4 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
We now support final and do this type of analyzis that will lead to
devirtualization (if final or anonymous namespace is used) or speculative
devirtualization otherwise if doing so seems win.
We still do not assume that type hiearchy is complete even with -fwhole-program
since we do allow to link with libraries that may provide their own
derivations.
We may have a flag to enable this assumption and we probably want to strenghten
analysis of what can be supplied by library.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Bug tree-optimization/47316] devirtualize calls to virtual methods that are never further overriden
2011-01-16 15:26 [Bug tree-optimization/47316] New: devirtualize calls to virtual methods that are never further overriden zsojka at seznam dot cz
` (3 preceding siblings ...)
2013-12-17 16:22 ` hubicka at gcc dot gnu.org
@ 2013-12-17 16:25 ` hubicka at gcc dot gnu.org
4 siblings, 0 replies; 6+ messages in thread
From: hubicka at gcc dot gnu.org @ 2013-12-17 16:25 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47316
--- Comment #5 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
The testcase provided now generates:
void foo(A*) (struct A * a)
{
int (*__vtbl_ptr_type) () * _3;
int (*__vtbl_ptr_type) () _4;
int i.0_6;
int i.1_7;
void * PROF_9;
int i.2_11;
int i.3_12;
<bb 2>:
_3 = a_2(D)->_vptr.A;
_4 = *_3;
PROF_9 = [obj_type_ref] OBJ_TYPE_REF(_4;(struct A)a_2(D)->0);
if (PROF_9 == f)
goto <bb 3>;
else
goto <bb 4>;
<bb 3>:
i.2_11 ={v} i;
i.3_12 = i.2_11 + -1;
i ={v} i.3_12;
goto <bb 5>;
<bb 4>:
OBJ_TYPE_REF(_4;(struct A)a_2(D)->0) (a_2(D));
<bb 5>:
i.0_6 ={v} i;
i.1_7 = i.0_6 + -1;
i ={v} i.1_7;
return;
}
where
PROF_9 = [obj_type_ref] OBJ_TYPE_REF(_4;(struct A)a_2(D)->0);
if (PROF_9 == f)
goto <bb 3>;
else
goto <bb 4>;
looking at it, I am not sure if we want to keep OBJ_TYPE_REF here.
It is generally ignored except for the call statements themselves.
So either we want to drop it or extend type devirtualization in the folding
machinery to work for non-calls, too.
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2013-12-17 16:25 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-01-16 15:26 [Bug tree-optimization/47316] New: devirtualize calls to virtual methods that are never further overriden zsojka at seznam dot cz
2011-01-17 8:02 ` [Bug tree-optimization/47316] " zsojka at seznam dot cz
2011-01-17 12:35 ` redi at gcc dot gnu.org
2011-01-17 12:39 ` jamborm at gcc dot gnu.org
2013-12-17 16:22 ` hubicka at gcc dot gnu.org
2013-12-17 16:25 ` hubicka at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).