On Fri, 2014-08-15 at 18:38 -0400, Trevor Saunders wrote:
> On Fri, Aug 15, 2014 at 04:24:49PM -0600, Jeff Law wrote:
> > On 08/06/14 11:23, David Malcolm wrote:
> > >gcc/
> > > * final.c (get_attr_length_1): Replace GET_CODE check with a
> > > dyn_cast, introducing local "seq" and the use of methods of
> > > rtx_sequence.
> > > (shorten_branches): Likewise, introducing local "body_seq".
> > > Strengthen local "inner_insn" from rtx to rtx_insn *.
> > > (reemit_insn_block_notes): Replace GET_CODE check with a
> > > dyn_cast, strengthening local "body" from rtx to rtx_sequence *.
> > > Use methods of rtx_sequence.
> > > (final_scan_insn): Likewise, introducing local "seq" for when
> > > "body" is known to be a SEQUENCE, using its methods.
> > So presumably a dyn_cast isn't terribly expensive here? I guess I'm a bit
> > fuzzy on whether or not we agreed to allow using dynamic casts?!? Doesn't
> > that have to check the RTTI info which I would think would be considerably
> > more expensive than just checking the code. Or am I missing something here?
>
> your missing dyn_cast != dynamic_cast, the first is just a wrapper
> around as_a / is_a, and so doesn't use rtti.
>
Yes; as Trevor notes, this isn't using C++'s dynamic_cast and RTTI, it's
using dyn_cast from our is-a.h, so this is just:
inline T
dyn_cast (U *p)
{
if (is_a <T> (p))
return is_a_helper <T>::cast (p);
else
return static_cast <T> (0);
}
and (after inlining with the specializations for
T == rtx_sequence *) is essentially just:
rtx_sequence *
dyn_cast (rtx p)
{
if (GET_CODE (p) == SEQUENCE)
return reinterpret_cast <rtx_sequence *> (p);
else
return static_cast <rtx_sequence *> (0);
}
i.e. back to just a GET_CODE check again (albeit with a new local, of
the subclass ptr type; I don't know how well our optimizations handle
that yet: the idea that a local ptr X is either equal to another local
ptr Y or is NULL. Does our value-numbering cope with this, where one
ptr is a subclass of another?).
Dave