https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104195

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
For char, 2, unsigned int (on aarch64, I suspect x86_64 is similar):
(set (reg/i:SI 0 x0)
    (zero_extend:SI (mem:QI (plus:DI (and:DI (subreg:DI (reg/v:SI 99 [ i ]) 0)
                    (const_int 1 [0x1]))
                (plus:DI (and:DI (subreg:DI (reg/v:SI 99 [ i ]) 0)
                        (const_int 4294967294 [0xfffffffe]))
                    (reg:DI 108))) [0 _4->data[_5]+0 S1 A8])))


i&1 + ( ((i&(u32)~0x1) +  r108)
->
(i&1 + ((i&(u32)~0x1)) +  r108
->
(i&1 | ((i&(u32)~0x1)) +  r108
->
i&(u32)~0 + r128

It looks like it all comes down to re-associatation inside combine ....

Reply via email to