http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49088
Eric Botcazou <ebotcazou at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2011.05.20 19:42:51
Ever Confirmed|0 |1
--- Comment #4 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2011-05-20
19:42:51 UTC ---
> combine turns it into
>
> (insn 18 17 10 2 (set (reg:DI 73)
> (const_int 4294967238 [0xffffffc6])) x.i:14 62 {*movdi_internal_rex64}
> (nil))
>
> (insn 11 10 12 2 (set (reg:DI 68)
> (plus:DI (reg/f:DI 20 frame)
> (reg:DI 73))) x.i:14 247 {*lea_1}
> (expr_list:REG_DEAD (reg:DI 73)
> (nil)))
>
> "const_int -64" is signed, not unsigned.
RTL constants are always sign-extended for their mode but RTL objects,
including constants, have no specific signedness, except for a few exceptions
like the SUBREG_PROMOTED_UNSIGNED_P flag.
That being said, the transformation looks indeed invalid.