https://gcc.gnu.org/bugzilla/show_bug.cgi?id=45434
--- Comment #9 from Uroš Bizjak <ubizjak at gmail dot com> --- The current mainline compiles: --cut here-- _Bool foo(int i) { return (i & 0xFF) == ((i & 0xFF00) >> 8); } _Bool bar(int i) { return (i & 0xFF) <= ((i & 0xFF00) >> 8); } --cut here-- with -O2 to: foo: movl %edi, %eax sarl $8, %eax xorl %edi, %eax testb %al, %al sete %al ret bar: movl %edi, %eax cmpb %al, %ah setnb %al ret While ._original dump reads: ;; Function foo (null) { return ((i >> 8 ^ i) & 255) == 0; } ;; Function bar (null) { return (i & 255) <= (i >> 8 & 255); } The test for equivalence goes through XOR which interferes with the ability of the combine pass to form the compare with zero-extracted argument RTX.