Зачем MSVC 2022 создавать два вызова idiv для одного std::div без каких-либо оптимизаций?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Зачем MSVC 2022 создавать два вызова idiv для одного std::div без каких-либо оптимизаций?

Сообщение Anonymous »

Используя CMAKE_BUILD_TYPE="Debug" мой MSVC 2022 [17.4.33403.182] создал один вызов idiv для частного и идентичный вызов idiv для оставшейся части. Код был просто [полный проект см. здесь]:

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

_div_t const dv = std::div((int)5, (int)3);
А сборка [синтаксис Intel] выглядела следующим образом:

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

        11        _div_t const dv = std::div((int)5, (int)3);
0x7ff6b38a1434           mov     dword ptr [rsp+4],3
0x7ff6b38a143c           mov     dword ptr [rsp],5
0x7ff6b38a1443           mov     eax,dword ptr [rsp]
0x7ff6b38a1446           cdq
0x7ff6b38a1447           idiv    eax,dword ptr [rsp+4]
0x7ff6b38a144b           mov     dword ptr [rsp+8],eax
0x7ff6b38a144f           mov     eax,dword ptr [rsp]
0x7ff6b38a1452           cdq
0x7ff6b38a1453           idiv    eax,dword ptr [rsp+4]
0x7ff6b38a1457           mov     dword ptr [rsp+0Ch],edx
0x7ff6b38a145b           mov     rax,qword ptr [rsp+8]
0x7ff6b38a1460           mov     qword ptr [rsp+10h],rax
0x7ff6b38a1465           mov     rax,qword ptr [rsp+10h]
0x7ff6b38a146a           mov     qword ptr [rsp+18h],rax
0x7ff6b38a146f           mov     rax,qword ptr [rsp+18h]
0x7ff6b38a1474           mov     qword ptr [rsp+20h],rax
Используя CMAKE_BUILD_TYPE="Release" [и несколько реорганизовывая код, чтобы компилятор не оптимизировал этот код полностью - см. здесь], он сводится к одному вызову idiv:

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

0x7ff7947f1800                   mov     eax,ecx
5        return std::div(dividend, divisor);
0x7ff7947f1802           mov     r8d,edx
0x7ff7947f1805           cdq
0x7ff7947f1806           idiv    eax,r8d
0x7ff7947f1809           mov     dword ptr [rsp+18h],eax
0x7ff7947f180d           mov     dword ptr [rsp+1Ch],edx
0x7ff7947f1811           mov     rax,qword ptr [rsp+18h]
6    }
0x7ff7947f1816           ret
Но почему MSVC 2022 вообще генерирует дублирующийся код?
Потому что он знает, что он все равно будет оптимизирован?

Подробнее здесь: https://stackoverflow.com/questions/797 ... -optimizat
Ответить

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

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

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

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

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