This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug tree-optimization/47413] Constant Propagation and Virtual Function Tables


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47413

Richard Guenther <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2011.01.25 11:35:50
                 CC|                            |rguenth at gcc dot gnu.org
     Ever Confirmed|0                           |1

--- Comment #1 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-01-25 11:35:50 UTC ---
With GCC 4.6 I see

<bb 3>:
  obj_11->vtab = &vtab1337;
  D.3820_15 = f1337 (obj_11);
  printf (&"%d\n"[0], D.3820_15);

so it calls f1337 directly, but it doesn't inline it.

We are partly confused by the CFG caused by the NULL test:

<bb 2>:
  obj_11 = malloc (8);
  if (obj_11 == 0B)
    goto <bb 4>;
  else
    goto <bb 3>;

<bb 3>:
  obj_11->vtab = &vtab1337;

<bb 4>:
  # obj_12 = PHI <0B(2), obj_11(3)>
  if (obj_12 == 0B)
    goto <bb 6>;
  else
    goto <bb 5>;

<bb 5>:
  D.3822_13 = obj_12->vtab;
  D.3821_14 = D.3822_13->f;
  D.3820_15 = D.3821_14 (obj_12);

so it takes several iterations through different optimizers to eventually
constant propagate the function address (jump-threading the test in BB4,
which only happens late by DOM).


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]