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

Reply via email to