http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48688

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ubizjak at gmail dot com

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> 2011-04-20 
10:25:07 UTC ---
All 6 variants:
int fn1 (int x) { return (x << 3) | 5; }
int fn2 (int x) { return (x * 8) | 5; }
int fn3 (int x) { return (x << 3) + 5; }
int fn4 (int x) { return (x * 8) + 5; }
int fn5 (int x) { return (x << 3) ^ 5; }
int fn6 (int x) { return (x * 8) ^ 5; }

The problem is that for + this is turned into lea only in combine, and
at that spot it only calls ix86_legitimate_address_p, not
ix86_legitimize_address.  So, either ix86_legitimate_address_p (well,
ix86_decompose_address) should also handle the IOR/XOR with constant case
because we can't just adjust it to the canonical plus through
ix86_legitimize_address, or either simplify-rtx.c or fold-const.c or whatever
should try to canonicalize the IOR/XOR resp. BIT_IOR_EXPR/BIT_XOR_EXPR into
PLUS_EXPR in those cases.  For simplify-rtx.c or fold-const.c, the question is
why should be PLUS generally preferred over IOR/XOR though, yeah, it helps one
target, but x86 isn't the only target GCC supports.

Reply via email to