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

Reply via email to