Extended Description
Minimal sample code:
static inline int imin(int a, int b) {
return a < b ? a : b;
}
int fn1(int a, int b) {
if (a < b) __builtin_unreachable();
return imin(a, b);
}
int fn2(int a, int b) {
if (a < b) __builtin_unreachable();
return a < b ? a : b;
}
compiled with -O3 produces (Linux x86-64):
fn1:
mov eax, esi
cmp edi, esi
cmovle eax, edi
ret
fn2:
mov eax, esi
ret
Only in fn2 is the ternary operation correctly optimized away.