On Wed, Oct 31, 2012 at 2:30 PM, Richard Sandiford
<rdsandif...@googlemail.com> wrote:
> Richard Biener <richard.guent...@gmail.com> writes:
>>> But that means that wide_int has to model a P-bit operation as a
>>> "normal" len*HOST_WIDE_INT operation and then fix up the result
>>> after the fact, which seems unnecessarily convoluted.
>>
>> It does that right now.  The operations are carried out in a loop
>> over len HOST_WIDE_INT parts, the last HWI is then special-treated
>> to account for precision/size.  (yes, 'len' is also used as optimization - 
>> the
>> fact that len ends up being mutable is another thing I dislike about
>> wide-int.  If wide-ints are cheap then all ops should be non-mutating
>> (at least to 'len')).
>
> But the point of having a mutating len is that things like zero and -1
> are common even for OImode values.  So if you're doing someting potentially
> expensive like OImode multiplication, why do it to the number of
> HOST_WIDE_INTs needed for an OImode value when the value we're
> processing has only one significant HOST_WIDE_INT?

I don't propose doing that.  I propose that no wide-int member function
may _change_ it's len (to something larger).  Only that way you can
avoid allocating wasted space for zero and -1.  That way also the
artificial limit on 2 * largest-int-mode-hwis goes.

>>>  I still don't
>>> see why a full-precision 2*HOST_WIDE_INT operation (or a full-precision
>>> X*HOST_WIDE_INT operation for any X) has any special meaning.
>>
>> Well, the same reason as a HOST_WIDE_INT variable has a meaning.
>> We use it to constrain what we (efficiently) want to work on.  For example
>> CCP might iterate up to 2 * HOST_BITS_PER_WIDE_INT times when
>> doing bit-constant-propagation in loops (for TImode integers on a x86_64 
>> host).
>
> But what about targets with modes wider than TImode?  Would double_int
> still be appropriate then?  If not, why does CCP have to use a templated
> type with a fixed number of HWIs (and all arithmetic done to a fixed
> number of HWIs) rather than one that can adapt to the runtime values,
> like wide_int can?

Because nobody cares about accurate bit-tracking for modes larger than
TImode.  And because no convenient abstraction was available ;)

>> Oh, and I don't necessary see a use of double_int in its current form
>> but for an integer representation on the host that is efficient to manipulate
>> integer constants of a target dependent size.  For example the target
>> detail that we have partial integer modes with bitsize > precision and that
>> the bits > precision appearantly have a meaning when looking at the
>> bit-representation of a constant should not be part of the base class
>> of wide-int (I doubt it belongs to wide-int at all, but I guess you know more
>> about the reason we track bitsize in addition to precision - I think it's
>> abstraction at the wrong level, the tree level does fine without knowing
>> about bitsize).
>
> TBH I'm uneasy about the bitsize thing too.  I think bitsize is only
> tracked for shift truncation, and if so, I agree it makes sense
> to do that separately.

So, can we please remove all traces of bitsize from wide-int then?

> But anyway, this whole discussion seems to have reached a stalemate.
> Or I suppose a de-facto rejection, since you're the only person in
> a position to approve the thing :-)

There are many (silent) people that are able to approve the thing.  But the
point is I have too many issues with the current patch that I'm unable
to point at a specific thing I want Kenny to change after which the patch
would be fine.  So I rely on some guesswork from Kenny giving my
advices "leaner API", "less fused ops", "get rid of bitsize", "think of
abstracting the core HWI[len] operation", "there should be no tree or
RTL dependencies in the wide-int API" to produce an updated variant.
Which of course takes time, which of course crosses my vacation, which
in the end means it isn't going to make 4.8 (I _do_ like the idea of not
having a dependence on host properties for integer constant representation).

Btw, a good hint at what a minimal wide-int API would look like is if
you _just_ replace double-int users with it.  Then you obviously have to
implement only the double-int interface and conversion from/to double-int.

Richard.


> Richard

Reply via email to