This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: gen_lowpart called where 'truncate' needed?
Ian Lance Taylor <iant@google.com> writes:
> Mat Hostetter <mhostetter@tilera.com> writes:
>
>> Since the high bits are already zero, that would be less efficient on
>> most platforms, so guarding it with something like this would probably
>> be smarter:
>>
>> if (targetm.mode_rep_extended (mode, GET_MODE(x)) == SIGN_EXTEND)
>> return simplify_gen_unary (TRUNCATE, mode, x, GET_MODE (x));
>>
>> I'm happy to believe I'm doing something wrong in my back end, but I'm
>> not sure what that would be. I could also believe these are obscure
>> edge cases no one cared about before. Any tips would be appreciated.
>
> Interesting. I think you are in obscure edge case territory. Your
> suggestion makes sense to me, and in fact it should probably be put
> into gen_lowpart_common.
FWIW, I disagree. Firstly, mode_rep_extended is a special case of
!TRULY_NOOP_TRUNCATION so the above check should use that. Secondly, in
MIPS we call gen_lowpart to convert DI to SI when we know it's safe. In
this case we always want a subreg not a truncate for better code. So I
don't think gen_lowpart_common is the right place to fix this.
I think the right fix is to call convert_to_mode or convert_move in the
expansion code which ensure the proper truncation.
Adam