On Mon, Jul 24, 2017 at 01:52:49PM +0100, Richard Sandiford wrote:
> Segher Boessenkool <seg...@kernel.crashing.org> writes:
> > On Mon, Jul 24, 2017 at 10:28:06AM +0100, Richard Sandiford wrote:
> >> > From what I can tell so far it makes things much harder to read.
> >> > Perhaps that is just because this is all new.
> >> 
> >> Which parts specifically?  E.g. is it mostly the is_a <T> (x, &y) changes?
> >> Or the as_a <T> (x) changes too?  Do you think the FOR_EACH_* iterators
> >> also make things harder to read?  Or is machine_mode->scalar_int_mode
> >> itself a problem?
> >
> > All the  as_a <T> (x)  etc. looks like cuneiform to me (not just in your
> > patch); and I cannot read cuneiform :-)
> >
> > One day I might understand why we need all this C++ inverted syntax,
> > needless abstraction, needless generalisation, data hiding and everything
> > else hiding.  Until then, I rant.  Sorry.
> >
> > The main purpose of abstraction is to make code easier to understand and
> > to write and change, but with C++ it usually makes it harder it seems :-(
> 
> Well, as someone who was/is on the fence about the C++ thing, I definitely
> sympathise :-)  But in this particular case it really isn't (supposed to be)
> "hey, we're using C++ now, let's add more layers!" abstraction.

:-)

> The same principle would have worked in C and IMO been useful in C.
> It sounds like you don't necessarily object to SCALAR_INT_TYPE_MODE etc.
> as asserting forms of TYPE_MODE, so if the syntax is a problem, I think:
> 
>    as_a <scalar_int_mode> (x)   => force_scalar_int (x)
>    is_a <scalar_int> (x, &y)    => is_scalar_int (x, &y)
> 
> would be fine too, and shorter to write.  Would that be better?

Yeah that looks better, to me at least.

> Like I say, one advantage of the new wrappers is that they force mode
> assumptions to be explicit (otherwise the compiler won't build).  That
> caught several real bugs before they had been found and fixed upstream.
> But that argument might be too weak to support this on its own.

It also helps compile time you said.  I like that, too :-)

> The other -- original, and IMO more compelling -- motivation is to make
> it easier to add variable-sized modes without having to worry about the
> possibility that scalar or complex modes could be variable-sized
> (because that would be much more invasive).  We could instead have kept
> everything as machine_mode, made GET_MODE_SIZE always be variable, and
> forced the result to a constant whenever it's "known" to be constant
> for some reason.  The difficulty with that is that it would be very hard
> to get right if not testing SVE, and even with SVE you would need just
> the right input code to trigger the problem.  So what we wanted to do
> was make it "easy" for people to know when variable-sized modes were a
> concern even if they weren't thinking about or testing SVE.  This
> scalar/not scalar or complex/not complex choices aren't architecture-
> specific in the same way.
> 
> With this approach we only needed to force a variable size or offset to
> a constant in a few places, and those cases were easy to justify from
> context.

Yes, it is clear some changes are needed -- I just hope the changes
can make the code easier to understand, instead of more complex.


Segher

Reply via email to