[PATCH 3/9] operand_equal_p: add support for OBJ_TYPE_REF.
Jan Hubicka
hubicka@ucw.cz
Thu Aug 15 15:44:00 GMT 2019
> On Tue, Aug 6, 2019 at 5:43 PM Martin Liska <mliska@suse.cz> wrote:
> >
> >
> > gcc/ChangeLog:
>
> + /* Virtual table call. */
> + case OBJ_TYPE_REF:
> + {
> + if (!operand_equal_p (OBJ_TYPE_REF_EXPR (arg0),
> + OBJ_TYPE_REF_EXPR (arg1), flags))
> + return false;
> + if (virtual_method_call_p (arg0))
> + {
> + if (tree_to_uhwi (OBJ_TYPE_REF_TOKEN (arg0))
> + != tree_to_uhwi (OBJ_TYPE_REF_TOKEN (arg1)))
> + return false;
> + if (!types_same_for_odr (obj_type_ref_class (arg0),
> + obj_type_ref_class (arg1)))
> + return false;
> + if (!operand_equal_p (OBJ_TYPE_REF_OBJECT (arg0),
> + OBJ_TYPE_REF_OBJECT (arg1), flags))
> + return false;
>
> this all gets deep into the devirt machinery, including looking at
> ODR type hashes. So I'm not sure if we really want to handle
> it this "optimistic" in operand_equal_p and completely ignore
> other operands when !virtual_method_call_p? That is, why
> not compare OBJ_TYPE_REF_TOKEN/OBJECT always at least?
For !virtual_method_call_p we do not use OBJ_TYPE_REF at all yet obj-C frontend
produce it. I think we should remove them somewhere during gimplification.
We can definitly turn "optimistic" to "pesimistic" and return false here.
Otherwise the checks makes sense to me - it the tests above passes devirt
machinery ought to give same results.
>
> Do we then have cases where the OBJ_TYPE_REF is actually
> distinct according to the remaining check?
I am not sure what you mean here?
Honza
>
> + }
>
>
> > 2019-07-24 Martin Liska <mliska@suse.cz>
> >
> > * fold-const.c (operand_equal_p): Support OBJ_TYPE_REF.
> > * tree.c (add_expr): Hash parts of OBJ_TYPE_REF.
> > ---
> > gcc/fold-const.c | 21 +++++++++++++++++++++
> > gcc/tree.c | 9 +++++++++
> > 2 files changed, 30 insertions(+)
> >
More information about the Gcc-patches
mailing list