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).