On Thu, Oct 18, 2012 at 4:00 PM, Kenneth Zadeck
<zad...@naturalbridge.com> wrote:
> you know richi, i did not know who i was actually talking to.   i said who
> is this richard beiner person and then i saw the email address.

;)

> On 10/18/2012 08:58 AM, Richard Biener wrote:
>>
>> On Thu, Oct 18, 2012 at 2:52 PM, Kenneth Zadeck
>> <zad...@naturalbridge.com> wrote:
>>>
>>> On 10/18/2012 06:22 AM, Richard Biener wrote:
>>>>
>>>> On Wed, Oct 17, 2012 at 11:47 PM, Kenneth Zadeck
>>>> <zad...@naturalbridge.com> wrote:
>>>>>
>>>>> Richi,
>>>>>
>>>>> I apologize for the size of this patch, but it only does one very small
>>>>> thing, it is just that it does it all over the middle end.
>>>>>
>>>>> This patch introduces a new api for extracting a signed or unsigned hwi
>>>>> from
>>>>> an integer cst.  There had been an abi for doing this, but it has some
>>>>> problems that were fixed here, and it was only used sometimes.
>>>>>
>>>>> The new abi consists of 6 functions, three for testing if the constant
>>>>> in
>>>>> the int cst will fit and three for actually pulling out the value.
>>>>>
>>>>> The ones for testing are tree_fits_uhwi_p, tree_fits_shwi_p,
>>>>> tree_fits_hwi_p.   The first two of these are unsigned and signed
>>>>> versions,
>>>>> and the second one takes a boolean parameter which is true if the value
>>>>> is
>>>>> positive.   This replaces the host_integerp which basically has the
>>>>> same
>>>>> functionality of tree_fits_hwi_p.   The reason for changing this is
>>>>> that
>>>>> there were about 400 calls to host_integerp and all but 4 of them took
>>>>> a
>>>>> constant parameter. These names are chosen to be similar to the similar
>>>>> functions in wide-int and are more mnemonic that the existing name
>>>>> since
>>>>> they use the more readable u and s prefixes that a lot of other places
>>>>> do.
>>>>>
>>>>> On the accessing side, there is tree_to_uhwi, tree_to_shwi, and
>>>>> tree_to_hwi.
>>>>> The first two do checking when checking is enabled. The last does no
>>>>> checking.
>>>>
>>>> Just a quick note here - the changelog mentions tree_low_cst (as new
>>>> function!?) but not host_integerp.  You should probably get rid of both,
>>>> otherwise uses will creap back as people are familiar with them
>>>> (I'm not sure these changes for consistency are always good ...)
>>>
>>> i will fix this.
>
> these are bugs in the changelog, not the code.   new changelog included.
>
>>>
>>>> I don't like that tree_to_hwi does not do any checking.  In fact I don't
>>>> like that it _exists_, after all it has a return type which signedness
>>>> does not magically change.  Unchecked conversions should use
>>>> TREE_LOW_CST.
>>>
>>> the idea is that when wide-int goes in, there is actually no
>>> TREE_INT_CST_LOW.   The concept of low and high go out the door. the
>>> int-cst
>>> will have an array in it that is big enough to hold the value.
>>> so tree_to_hwi becomes a short hand for just accessing the lower element
>>> of
>>> the array.
>>>
>>> you could argue that you should say tree_fits_uhwi_p followed by
>>> tree_to_uhwi (and the same for signed).   This is an easy fix.   it just
>>> seemed a little redundant.
>>
>> Well, if you want raw access to the lower element (when do you actually
>> want that, when not in wide-int.c/h?) ... you still need to care about the
>> signedness of the result.  And tree_fits_uhwi_p does not return the
>> same as tree_fits_shwi_p all the time.
>>
>> I don't see any goodness in tree_to_hwi nor tree_fits_hwi really.  Because
>> if you just access the lower word then that still has a sign (either
>> HOST_WIDE_INT or unsigned HOST_WIDE_INT).  We should get rid
>> of those places - can you enumerate them?  I think you said it was just
>> a few callers with variable signedness argument.
>
> Note that tree_fits_hwi_p does check.   it just takes a parameter to say if
> it wants signed or unsigned checking (it is the old host_integerp,
> repackaged).   You really do need this function as it is for the 4 or 5
> places it is called.  The parameter to it is typically, but not always, the
> sign of the type of the int cst being passed to it.
>
> it is the tree_to_hwi that is unchecked.  Most of the places are identified
> with comments.  This survives the changelog.   (i happen to be in the group
> of people that think changelogs are useless, and that we should do a better
> job of commenting the code.)
>
> I do not know if this is sloppyness or not, but the signedness that is
> checked rarely matches the sign of the variable that the value is assigned.
> I found this quite frustrating when i was making the patch but this kind of
> thing is common in code where the original writer "knew what (s)he was
> doing."  Unless you are doing comparisons or shifting, the signedness of
> target does not really make much difference.
>
> if you want me to change the sequences of explicit checking and unchecked
> access to explicit checking followed by a checked access, then i am happy to
> do this.

Disclaimer: not looking at the patch (again).

The existing tree_low_cst function performs checking, so tree_to_hwi
should as well.

I don't think mismatch of signedness of the variable assigned to with the
sign we use for hwi extraction is any good.  C++ isn't type-safe here
for the return value but if we'd use a reference as return slot we
could make it so ...
(in exchange for quite some ugliness IMNSHO):

void tree_to_shwi (const_tree tree, HOST_WIDE_INT &hwi);

vs.

void tree_to_uhwi (const_tree tree, unsigned HOST_WIDE_INT &hwi);

maybe more natural would be

void hwi_from_tree (HOST_WIDE_INT &hwi, const_tree tree);
void hwi_from_tree (unsigned HOST_WIDE_INT &hwi, const_tree tree);

let the C++ bikeshedding begin!  (the point is to do appropriate checking
for a conversion of (INTEGER_CST) tree to HOST_WIDE_INT vs.
unsigned HOST_WIDE_INT)

No, I don't want you to do the above transform with this patch ;)

Thanks,
Richard.


> kenny
>
>> Richard.
>>
>>> I should also point out that about 2/3 if this patch is going to die as
>>> the
>>> rest of the wide int stuff goes in.   But i did not want to submit a
>>> patch
>>> that only converted 1/3 of the cases.   The truth is that most of these
>>> places where you are doing this conversion are just because the people
>>> were
>>> too lazy to do the math at the full precision of the double int.
>>>
>>>> Thus, my 2 cents before I really look at the patch (which will likely
>>>> be next week only, so maybe you can do a followup with the above
>>>> suggestions).
>>>>
>>>> Thanks,
>>>> Richard.
>>>>
>>>>> it is expected normally, the unchecked accesses follows an explicit
>>>>> check,
>>>>> or if there is no explicit check, then one of the checked ones follows.
>>>>> This is always not the case for places that just want to look at the
>>>>> bottom
>>>>> bits of some large number, such as several places that compute
>>>>> alignment.
>>>>> These just use the naked unchecked access.
>>>>>
>>>>> There were a lot of places that either did no checking or did the
>>>>> checking
>>>>> inline.   This patch tracks down all of those places and they now use
>>>>> the
>>>>> same abi.
>>>>>
>>>>> There are three places where i found what appear to be bugs in the
>>>>> code.
>>>>> These are places where the existing code did an unsigned check and then
>>>>> followed it with a signed access (or visa versa). These places are
>>>>> marked
>>>>> with comments that contain the string "THE NEXT LINE IS POSSIBLY
>>>>> WRONG".
>>>>> With some guidance from the reviewer, i will fix these are remove the
>>>>> unacceptable comments.
>>>>>
>>>>> Aside from that, this patch is very very boring because it just makes
>>>>> this
>>>>> one transformation. Look for interesting stuff in tree.h.   Everything
>>>>> else
>>>>> is just forcing everywhere to use a single abi.
>>>>>
>>>>> This patch could go on with a little work without the other 5 patches
>>>>> or
>>>>> it
>>>>> can wait for them.
>>>>>
>>>>> kenny
>>>
>>>
>

Reply via email to