Рассмотрим фрагмент кода C++:Почему такой странный код сгенерирован?
int main()
{
volatile int a=0;
if(!a)
++a;
}
Я скомпилировать его системы amd64 с г ++ (Ubuntu 4.8.1-2ubuntu1 ~ 12.04) с командой g++ test.cpp -S -o test.S -masm=intel
и получить следующий код:
...
mov eax, DWORD PTR [ebp-4]
test eax, eax
sete al
test al, al
je .L2
mov eax, DWORD PTR [ebp-4] ; don't use result of sete
add eax, 1
mov DWORD PTR [ebp-4], eax
.L2:
mov eax, 0 ; also drop result of sete
...
Этот код меня действительно удивляет. Сначала я подумал, что это как-то связано с 64-битным режимом. Но когда я попытался скомпилировать с -m32
, этот бит остался прежним.
Почему он проверяет eax
за то, что он равен нулю, а затем снова проверит результат после установки al
на ZF
? Почему он просто не делает test eax,eax\n jne .L2
?
Включите оптимизацию (-O3 в командной строке), и бесполезные инструкции исчезнут. –
@NilsPipenbrinck Я знаю об оптимизации. Вопрос в том, почему это так, а не как исправить. – Ruslan