------- Comment #13 from hubicka at ucw dot cz  2010-09-16 12:48 -------
Subject: Re:  Missed devirtualization

> I'm lost in this PR - for what testcase what statement needs folding
> (and what pending patches do I need to apply to see that)?
PR is tracking missed optimization in the testcase in comment 0.

There are two issues

1) OBJ_TYPE_REF folding should handle it.  For that we seem to need to
evern call fold on 
  OBJ_TYPE_REF(D.2210_2;&d.D.2108->0) (&d.D.2108);
this you can see on mainline

2) generic folding should work it out the hard way. I.e. for:
  MEM[(struct B *)&d]._vptr.B = &_ZTV1B[2];
  d.D.2108._vptr.B = &_ZTV1D[2];
  D.2210_2 = _ZTV1D[2];
  OBJ_TYPE_REF(D.2210_2;&d.D.2108->0) (&d.D.2108);
there is nothing that prevents us to resolve _ZTV1D[2] into pointer to Run (by
looking into initializer of vtable variable) and then take OBJ_TYPE_REF away
since it is pointless when first operand is known function.

With patch http://gcc.gnu.org/ml/gcc-patches/2010-09/msg01190.html we closer in
a way that .vpr1 dump has:
  MEM[(struct B *)&d]._vptr.B = &_ZTV1B[2];
  d.D.2078._vptr.B = &_ZTV1D[2];
  D.2179_1 = &_ZTV1D[2];
  D.2180_2 = (int (*__vtbl_ptr_type) (void)) Run;
  OBJ_TYPE_REF(D.2180_2;&d.D.2078->0) (&d.D.2078);

Somewhere I have patch that adds OBJ_TYPE_REF folding into CCP (so when first
argument is function pointer, we just fold into direct call). I will update it
and submit after http://gcc.gnu.org/ml/gcc-patches/2010-09/msg01190.html
is resolved.  Then still there is problem that resolution comes late
since we need FRE to fold
 d.D.2078._vptr.B = &_ZTV1D[2];
  D.2179_1 =  d.D.2078._vptr.B
and FRE is not run early (and we should devirutalize everything early
to get inlining)

1) is priority IMO (at moment we make amazingly little devirtualization at
Mozilla, about 20 calls).
2) is just side effect of my attempt to get folding working that I run into
while looking into kernel poor man C vtables (and ours targhooks).




Reply via email to