On Wed, Aug 06, 2014 at 01:19:39PM -0400, David Malcolm wrote:
> This is the patch series I spoke about at Cauldron in the talk
> "A proposal for typesafe RTL"; slides here:
> http://dmalcolm.fedorapeople.org/presentations/cauldron-2014/rtl
> 
> They can also be seen at:
> https://dmalcolm.fedorapeople.org/gcc/patch-backups/rtx-classes/v20/
> 
> The aim of the patch series is to improve the type-safety and
> readability of the backend by introducing subclasses of rtx (actually
> rtx_def) for *instructions*, and also for EXPR_LIST, INSN_LIST, SEQUENCE.
> 
> That way we can document directly in the code the various places that
> manipulate insn chains vs other kinds of rtx node.

makes sense, thanks for doing this.

>   * having a subclass for EXPR_LIST allows for replacing this kind of
>     thing:
> 
>       for (x = forced_labels; x; x = XEXP (x, 1))
>         if (XEXP (x, 0))
>            set_label_offsets (XEXP (x, 0), NULL_RTX, 1);
> 
>     with the following, which captures that it's an EXPR_LIST, and makes
>     it clearer that we're simply walking a singly-linked list:
> 
>       for (rtx_expr_list *x = forced_labels; x; x = x->next ())
>         if (x->element ())
>           set_label_offsets (x->element (), NULL_RTX, 1);

much nicer, I guess this may help us eventually make these classes stop
being rtxen and so save some memory.

>   * there's a NULL_RTX define in rtl.h.   In an earlier version of the
>     patch I added a NULL_INSN define, but in this version I simply use
>     NULL, and I'm in two minds about whether a NULL_INSN is desirable
>     (would we have a NULL_FOO for all of the subclasses?).  I like having
>     a strong distinction between arbitrary RTL nodes vs instructions,
>     so maybe there's a case for NULL_INSN, but not for the subclasses?

tbh I don't understand the point of NULL_RTX / TREE.  I tend to think
there's no point in multiple names for NULL.  After all we don't have a
NULL_INT or NULL_FLOAT, but float * and int * are pretty different.

>   * "pointerness" of the types.  "rtx" is a typedef to "rtx_def *" i.e.
>     there's an implicit pointer.  In the discussion about using C++
>     classes for gimple statements:
>        https://gcc.gnu.org/ml/gcc-patches/2014-04/msg01427.html
>     Richi said:
> 
> > To followup myself here, it's because 'tree' is a typedef to a pointer
> > and thus 'const tree' is different from 'const tree_node *'.
> >
> > Not sure why we re-introduced the 'mistake' of making 'tree' a pointer
> > when we introduced 'gimple'.  If we were to make 'gimple' the class
> > type itself we can use gimple *, const gimple * and also const gimple &
> > (when a NULL pointer is not expected).

I guess it came from the time when gimple was a union in C, so you'd
have to write union gimple_seq * which is a bit weird.

>     So in the following patches the pointerness is explicit: the patches
>     refer to:
>        rtx_insn *insn;
>     rather than just:
>        rtx_insn insn;
>     and so one can write:
>        const rtx_insn *insn
>     and the "constness" applies to the insn, not to the pointer.
> 
>     But we could go either way here: the class could be "rtx_insn_def",
>     with "rtx_insn" a typedef to an "rtx_insn_def *" etc with:

personally I prefer it the way it is.

>   * Should as_a <rtx_insn *> accept a NULL pointer?  It's possible to make
>     the is_a_helper cope with NULL, but this adds an extra conditional.

I'd prefer it didn't accept NULL.

>     I instead added an as_a_nullable<> cast, so that you can explicitly
>     add a check against NULL before checking the code of the rtx node.

The name seems a little awkward (what exactly is nullable?) but I don't
have a better one.

> As for the performance of a regular build i.e. with as_a<>
> checks *enabled*; looking at the wallclock time taken for a bootstrap and
> regression test, for my s390 builds (with -j3) I saw:

I'm curious did you look at --enable-checking=rtl ? Did you manage to
remove some of those checks or is that future work?

> 
> s390 control:
>   "make" time: 68 mins
>   "make check" time: 122 mins
>   total time: 190 mins
> 
> s390 experiment:
>   "make" time: 70 mins
>   "make check" time: 126 mins
>   total time: 196 mins
> 
> showing a 3% increase, presumably due to the as_a and as_a_nullable
> checks.
> 
> i.e. a release build shows no change in performance; a debug build shows
> a 3% increase in time taken to bootstrap and regression test.  I believe
> the debug build could be sped up with further patches to eliminate the
> checked casts.

sounds reasonable especially if this takes over some of the role of rtl
checking.

It all looks reasonable from my skim of this series.

Trev

Reply via email to