PING: PATCH [4/n]: Prepare x32: Permute the conversion and addition if one operand is a constant

Paolo Bonzini bonzini@gnu.org
Wed Jul 13 16:24:00 GMT 2011


On 07/11/2011 05:54 PM, H.J. Lu wrote:
> The key is the
> >
> >     XEXP (x, 1) == convert_memory_address_addr_space
> >                    (to_mode, XEXP (x, 1), as)
> >
> >  test.  It ensures basically that the constant has 31-bit precision, because
> >  otherwise the constant would change from e.g. (const_int -0x7ffffffc) to
> >  (const_int 0x80000004) when zero-extending it from SImode to DImode.
> >
> >  But I'm not sure it's safe.  You have,
> >
> >    (zero_extend:DI (plus:SI FOO:SI) (const_int Y))
> >
> >  and you want to convert it to
> >
> >    (plus:DI FOO:DI (zero_extend:DI (const_int Y)))
> >
> >  (where the zero_extend is folded).  Ignore that FOO is a SYMBOL_REF (this
> >  piece of code does not assume anything about its shape); if FOO ==
> >  0xfffffffc and Y = 8, the result will be respectively 0x4 (valid) and
> >  0x100000004 (invalid).
>
> This example contradicts what you said above "It ensures basically that the
> constant has 31-bit precision".

Why?  Certainly Y = 8 has 31-bit (or less) precision.  So it has the 
same representation in SImode and DImode, and the test above on XEXP (x, 
1) succeeds.

> >  What happens if you just return NULL instead of the assertion (good idea
> >  adding it!)?
> >
> >  Of course then you need to:
> >
> >  1) check the return values of convert_memory_address_addr_space_1, and
> >  propagate NULL up to simplify_unary_operation;
> >
> >  2) check in simplify-rtx.c whether the return value of
> >  convert_memory_address_1 is NULL, and only return if the return value is not
> >  NULL.  This is not yet necessary (convert_memory_address is the last
> >  transformation for both SIGN_EXTEND and ZERO_EXTEND) but it is better to
> >  keep code clean.
>
> I will give it a try.

Thanks, did you get any result?  There's no "I think" in this code.  So 
even if I cannot approve it, I'd really like to see a version that I 
understand and that is clearly conservative, if it works.

Paolo



More information about the Gcc-patches mailing list