Почему GCC и Clang появляются в обеих ветках, а не только один раз? (Выделение частей эпилога из дублирования хвоста)C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему GCC и Clang появляются в обеих ветках, а не только один раз? (Выделение частей эпилога из дублирования хвоста)

Сообщение Anonymous »

GCC и Clang компилируются
bool pred();
void f();
void g();

void h() {
if (pred()) {
f();
} else {
g();
}
}

к некоторым вариантам
# Clang -Os output. -O3 is the same
h():
push rax
call pred()@PLT
test al, al
je .LBB0_2
pop rax
jmp f()@PLT
.LBB0_2:
pop rax
jmp g()@PLT

при оптимизации размера кода. Вы можете увидеть это в Compiler Explorer.
Есть ли причина выдавать команду pop в обеих ветвях вместо того, чтобы выдавать ее только один раз перед je?? p>
Например, включение в другой регистр, обработанный вызовом, чтобы избежать уничтожения возвращаемого значения pred(), или использование add rsp, 8 (что, возможно, на самом деле не быстрее на современных процессорах в в этом случае, поскольку для этого требуется синхронизация стека.)
# hand-written example of what compilers could be doing
h():
push rax # align the stack
call pred()@PLT
pop rcx # clean up the stack, restoring the stack pointer to its initial state
test al, al
je .LBB0_2
jmp f()@PLT # tailcall f
.LBB0_2:
jmp g()@PLT # tailcall g


Подробнее здесь: https://stackoverflow.com/questions/783 ... ring-parts
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»