Почему компиляторы дублируют некоторые инструкции?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему компиляторы дублируют некоторые инструкции?

Сообщение Anonymous »

Иногда компиляторы генерируют код со странным дублированием инструкций, которое можно безопасно удалить. Рассмотрим следующий фрагмент кода:

Код: Выделить всё

int gcd(unsigned x, unsigned y) {
return x == 0 ? y : gcd(y % x, x);
}
Вот ассемблерный код (сгенерированный clang 5.0 с включенной оптимизацией):

Код: Выделить всё

gcd(unsigned int, unsigned int): # @gcd(unsigned int, unsigned int)
mov eax, esi
mov edx, edi
test edx, edx
je .LBB0_1
.LBB0_2: # =>This Inner Loop Header: Depth=1
mov ecx, edx
xor edx, edx
div ecx
test edx, edx
mov eax, ecx
jne .LBB0_2
mov eax, ecx
ret
.LBB0_1:
ret
В следующем фрагменте:

Код: Выделить всё

  mov eax, ecx
jne .LBB0_2
mov eax, ecx
Если переход не происходит, eax переназначается без видимой причины.

Другой пример — два ret в конце функции: один тоже отлично подойдет.

Компилятор просто недостаточно умен или есть причина не удалять дублирования?

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

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

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

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

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

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

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