On Mon, Sep 30, 2013 at 7:39 AM, bin.cheng <[email protected]> wrote:
>
>
>> -----Original Message-----
>> From: Richard Biener [mailto:[email protected]]
>> Sent: Friday, September 27, 2013 4:30 PM
>> To: Bin Cheng
>> Cc: GCC Patches
>> Subject: Re: [PATCH]Fix computation of offset in ivopt
>>
>> On Fri, Sep 27, 2013 at 7:07 AM, bin.cheng <[email protected]> wrote:
>> >
>> >
>> > case INTEGER_CST:
>> > //.......
>> > *offset = int_cst_value (expr);
>> > change to
>> > case INTEGER_CST:
>> > //.......
>> > *offset = sext_hwi (int_cst_value (expr), type);
>> >
>> > and
>> > case MULT_EXPR:
>> > //.......
>> > *offset = sext_hwi (int_cst_value (expr), type); to
>> > case MULT_EXPR:
>> > //.......
>> > HOST_WIDE_INT xxx = (HOST_WIDE_INT)off0 * int_cst_value (op1);
>> > *offset = sext_hwi (xxx, type);
>> >
>> > Any comments?
>>
>> The issue is of course that we end up converting offsets to sizetype at
> some
>> point which makes them all appear unsigned. The fix for this is to simply
>> interpret them as signed ... but it's really a mess ;)
>>
>
> Hi, this is updated patch which calculates signed offset in strip_offset_1
> then sign extend it in strip_offset.
>
> Bootstrap and test on x86_64/x86/arm. Is it OK?
I don't think you need
+ /* Sign extend off if expr is in type which has lower precision
+ than HOST_WIDE_INT. */
+ if (TYPE_PRECISION (TREE_TYPE (expr)) <= HOST_BITS_PER_WIDE_INT)
+ off = sext_hwi (off, TYPE_PRECISION (TREE_TYPE (expr)));
at least it would be suspicious if you did ...
The only case that I can think of points to a bug in strip_offset_1
again, namely if sizetype (the type of all offsets) is smaller than
a HOST_WIDE_INT in which case
+ boffset = int_cst_value (DECL_FIELD_BIT_OFFSET (field));
+ *offset = off0 + int_cst_value (tmp) + boffset / BITS_PER_UNIT;
is wrong as boffset / BITS_PER_UNIT does not do a signed division
then (for negative boffset which AFAIK does not happen - but it would
be technically allowed). Thus, the predicates like
+ && cst_and_fits_in_hwi (tmp)
would need to be amended with a check that the MSB is not set.
Btw, the cst_and_fits_in_hwi implementation is odd:
bool
cst_and_fits_in_hwi (const_tree x)
{
if (TREE_CODE (x) != INTEGER_CST)
return false;
if (TYPE_PRECISION (TREE_TYPE (x)) > HOST_BITS_PER_WIDE_INT)
return false;
return (TREE_INT_CST_HIGH (x) == 0
|| TREE_INT_CST_HIGH (x) == -1);
}
the precision check seems totally pointless and I wonder what's
the point of this routine as there is host_integerp () already
and tree_low_cst instead of int_cst_value - oh, I see, the latter
forcefully sign-extends .... that should make the extension
not necessary.
Btw, int_cst_value sounds like a very bad name for a value-changing
function.
Richard.
> Thanks.
> bin
>
> 2013-09-30 Bin Cheng <[email protected]>
>
> * tree-ssa-loop-ivopts.c (strip_offset_1): Change parameter type.
> Count DECL_FIELD_BIT_OFFSET when computing offset for COMPONENT_REF.
> (strip_offset): Sign extend before return.