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