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

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
             Status|WAITING                     |NEW

--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> ---
using uint8_t = unsigned char;

template<typename T>
constexpr const T&
min(const T& a, const T& b)
{
    if (b < a)
        return b;
    return a;
}

uint8_t func1(uint8_t num)
{
    return bool(num);
}

uint8_t func2(uint8_t num)
{
    return num < uint8_t(1u) ? uint8_t(0u) : uint8_t(1u);
}

uint8_t func3(uint8_t num)
{
    return min(uint8_t(1u), num);
}

uint8_t func4(uint8_t num)
{
    return min(num, uint8_t(1u));
}

Clang gives the same code for all four functions, but GCC compiles func4
differently:

func1(unsigned char):
        test    dil, dil
        setne   al
        ret
func2(unsigned char):
        test    dil, dil
        setne   al
        ret
func3(unsigned char):
        test    dil, dil
        setne   al
        ret
func4(unsigned char):
        cmp     dil, 0
        mov     eax, 1
        cmovbe  eax, edi
        ret

Reply via email to