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 ....