При компиляции с -Ofast clang правильно делает вывод, что следующая функция всегда будет возвращать 0.
int zero(bool b) {
const int x = 5;
return (x * b) + (-x * b);
}
компилируется в
zero(bool): # @zero(bool)
xor eax, eax
ret
Однако, если я изменю константу напри любой степени двойки (кроме 1 или 0) clang больше не делает одно и то же вычитание
int zero(bool b) {
const int x = 8;
return (x * b) + (-x * b);
}
компилируется в
zero(bool): # @zero(bool)
mov eax, edi
shl eax, 3
xor dil, 1
movzx ecx, dil
lea eax, [rax + 8*rcx]
add eax, -8
ret
Код, скомпилированный с помощью проводника компилятора.
Если я изменю параметр функции на что-то большее (short, int, long), оптимизация будет выполнена правильно.
Что вызывает этот странный крайний случай?