[Bug tree-optimization/47316] devirtualize calls to virtual methods that are never further overriden
hubicka at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Dec 17 16:25:00 GMT 2013
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.
More information about the Gcc-bugs
mailing list