Пропущенная оптимизация в clang только на двух - PullRequest
8 голосов
/ 02 июня 2019

При компиляции с -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), оптимизация будет выполнена правильно.

Что вызывает этот странный крайний случай?

...