D - Inline optimization question
- Dario (21/21) Jun 07 2003 Consider this code:
Consider this code: void loop(int[] a, int function(int) f) { for(uint i=0; i<a.length; i++) a[i] = f(a[i]); } int main() { int[] a = getAnArray(); loop(a, function int(int a) { return a+1; }); return 0; } Is the compiler able to optimize this to become: int main() { int[] a = getAnArray(); for(uint i=0; i<a.length; i++) a[i] = a[i]+1; return 0; } ?
Jun 07 2003
I tried to use obj2asm on the object file but nothing seems to be inlined. loop() isn't inlined in main() and the pointer isn't inlined in loop(). I understand that it is a difficult task to inline everything, but why isn't loop() inlined in main()?
Jun 07 2003
Did you try the -inline flag? "Dario" <supdar yahoo.com> wrote in message news:bbshga$1phi$1 digitaldaemon.com...I tried to use obj2asm on the object file but nothing seems to be inlined. loop() isn't inlined in main() and the pointer isn't inlined in loop(). I understand that it is a difficult task to inline everything, but why isn't loop() inlined in main()?
Jun 07 2003
module test; void loop(int[] a, int function(int) f) { for(uint i=0; i<a.length; i++) a[i] = f(a[i]); } void main() { int[] a = new int[10]; loop(a, function int(int b) { return b+1; }); return 0; } _________________________________________ dmd -c -release -inline -O test.d obj2asm test.obj _________________________________________ _TEXT segment dword use32 public 'CODE' ;size is 0 _TEXT ends _DATA segment para use32 public 'DATA' ;size is 0 _DATA ends CONST segment para use32 public 'CONST' ;size is 0 CONST ends _BSS segment para use32 public 'BSS' ;size is 0 _BSS ends FLAT group extrn _Dtest_loop_FAiPFiZiZv includelib phobos.lib extrn _main extrn __acrtused_con extrn __Dmain extrn _Dtest_main__FiZi extrn __d_new _Dtest_loop_FAiPFiZiZv COMDAT flags=x0 attr=x0 align=x0 __Dmain COMDAT flags=x0 attr=x0 align=x0 _Dtest_main__FiZi COMDAT flags=x0 attr=x0 align=x0 _TEXT segment assume CS:_TEXT _TEXT ends _DATA segment _DATA ends CONST segment CONST ends _BSS segment _BSS ends _Dtest_loop_FAiPFiZiZv comdat assume CS:_Dtest_loop_FAiPFiZiZv push EAX push EAX push EBX xor EBX,EBX push ESI push EDI ;move function pointer in EDI mov EDI,EAX cmp 018h[ESP],EBX je L30 mov 010h[ESP],EBX mov EDX,01Ch[ESP] mov EBX,018h[ESP] mov ESI,EDX mov EBX,010h[ESP] L21: mov EAX,[EBX*4][ESI] ;call function (it's not inlined) call EDI mov [EBX*4][ESI],EAX inc EBX cmp EBX,018h[ESP] jb L21 L30: pop EDI pop ESI pop EBX add ESP,8 ret 8 _Dtest_loop_FAiPFiZiZv ends __Dmain comdat assume CS:__Dmain L0: push EAX push 4 push 0Ah call near ptr __d_new add ESP,8 push EDX push EAX ;pass function pointer mov EAX,offset FLAT:_Dtest_main__FiZi ;call function (it's not inlined) call near ptr _Dtest_loop_FAiPFiZiZv xor EAX,EAX pop ECX ret __Dmain ends _Dtest_main__FiZi comdat assume CS:_Dtest_main__FiZi inc EAX ret _Dtest_main__FiZi ends end
Jun 08 2003
"Dario" <supdar yahoo.com> wrote in message news:bbshga$1phi$1 digitaldaemon.com...I understand that it is a difficult task to inline everything, but why isn't loop() inlined in main()?Most inlines are done that resolve to expressions. Loops are another level of complexity entirely. It usually adds nothing to inline a loop anyway because the time spent in the loop far exceeds the time spent doing a function call.
Jun 08 2003