https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115392
--- Comment #8 from Daniel Petrovic <daniel-dev at hotmail dot de> --- LLVM seems to correctly optimize all different cases: https://godbolt.org/z/K65x6G33G unsigned int b; bool foo_1() { return (b | 0x12) <= 0xFF; } bool foo_2() { return (b | 0x12) > 0xFF; } bool bar_1() { return (b ^ 0x12) <= 0xFF; } bool bar_2() { return (b ^ 0x12) > 0xFF; } bool fooz_1() { return (b | 0x12) < 0x100; } bool fooz_2() { return (b | 0x12) >= 0x100; } bool baz_1() { return (b ^ 0x12) < 0x100; } bool baz_2() { return (b ^ 0x12) >= 0x100; } output: foo_1(): cmp dword ptr [rip + b], 256 setb al ret foo_2(): cmp dword ptr [rip + b], 256 setae al ret bar_1(): cmp dword ptr [rip + b], 256 setb al ret bar_2(): cmp dword ptr [rip + b], 256 setae al ret fooz_1(): cmp dword ptr [rip + b], 256 setb al ret fooz_2(): cmp dword ptr [rip + b], 256 setae al ret baz_1(): cmp dword ptr [rip + b], 256 setb al ret baz_2(): cmp dword ptr [rip + b], 256 setae al ret b: .long 0
