О проблемах (багах, фичах) оптимизации

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

О проблемах (багах, фичах) оптимизации

Сообщение beria » 17.02.2017 17:23:25

И так привожу строчку нативного кода с включенной оптимизацией типа RegVar
Код: Выделить всё
@@l251:
; [549] Inc(Result, h * k);
      mov   ebp,edi
      imul   ebp,esi
      add   eax,ebp


Как видно, все нормально и идет оптимизация под использование 32-битных регистров для целочисленных переменных...
А теперь для условного перехода добавим вполне невинный и минимальный код и увидим, что оптимизация отключилось всей процедуры и опять идут долгие обращения к памяти, вместо быстрых регистровых, а вся логика оптимального кода, в общем случае, слита в канализацию, я уже не говорю что до кучи, если это не отследить крайне вероятен SIGSEGV если есть любые обращения к пользовательским структурам данных.....

Код: Выделить всё
@@l251:
; [549] Inc(Result, h * k);
      mov   edx,dword ptr [ebp-24]
      mov   eax,dword ptr [ebp-16]
      imul   eax,edx
      add   dword ptr [ebp-12],eax
;  CPU PENTIUM4
@@l252:
; [551] JO      Over
      jo   @@j258
;  CPU PENTIUM4



Вопрос - это лечится или никак? Насколько помню свой опыт не только в С, но в T(B)P (включая TP3), такого там не было....
Аватара пользователя
beria
постоялец
 
Сообщения: 130
Зарегистрирован: 29.09.2016 08:57:13

Re: О проблемах (багах, фичах) оптимизации

Сообщение Azazaz » 17.02.2017 17:56:17

Судя по всему процедура имеет более чем 3 параметра, для архитектуры x86 есть возможность передавать через регистры только 3 параметра максимум, остальное будет пахать через стек. К тому же если переменные из примера являются локальными, то тут уже не существует других альтернатив размещения кроме как стек.
Выход: писать asm если это критично или реорганизовать исходник так что б грузить стек по минимуму или использовать x64 так как там много регистров.
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03

Re: О проблемах (багах, фичах) оптимизации

Сообщение zub » 17.02.2017 18:17:13

>>Вопрос - это лечится или никак?
Если лечится, то точно не тут, а на багтрекере
zub
долгожитель
 
Сообщения: 2884
Зарегистрирован: 14.11.2005 23:51:26

Re: О проблемах (багах, фичах) оптимизации

Сообщение Azazaz » 17.02.2017 18:18:31

Вот такой наркоманский код:
Код: Выделить всё
procedure T2(a, b: dword; c: char);
var
g, i: word;
begin
a:= 45;
i:= 5;
g:= 10;
b:= Byte(c) + a * b;
inc(b, 13);
inc(b, g*i);
end;

под оптимизацией O4 выдает:
Код: Выделить всё
   pushl   %ebx
   pushl   %esi
# Var a located in register eax
# Var b located in register eax
# Var c located in register cl
# Var g located in register bx
# Var i located in register si
# Var a located in register eax
# [9] a:= 45;
   movl   $45,%eax
# Var i located in register si
# [10] i:= 5;
   movw   $5,%si
# Var g located in register bx
# [11] g:= 10;
   movw   $10,%bx
# [12] b:= Byte(c) + a * b;
   imull   $45,%edx,%eax
   andl   $255,%ecx
   leal   (%eax,%ecx),%eax
# Var b located in register eax
# [13] inc(b, 13);
   addl   $13,%eax
# [14] inc(b, g*i);
   andl   $65535,%ebx
   andl   $65535,%esi
   imull   %ebx,%esi
   addl   %esi,%eax
# [15] end;
   popl   %esi
   popl   %ebx
   ret

даже на x86 использовано максимум регистров.
Azazaz
новенький
 
Сообщения: 41
Зарегистрирован: 21.04.2015 20:00:03


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26

Рейтинг@Mail.ru