[fpc-devel] Optimizing unused return values of inline functions
    Benito van der Zander 
    benito at benibela.de
       
    Sun Aug 20 11:11:50 CEST 2017
    
    
  
Hi,
why does fpc not remove the calculation of the return value of inline 
functions, when the return value is unused?
For example
type TUtility = class
   function doSomething: TUtility; inline;
end;
function TUtility.dosomething: TUtility;
begin
    writeln();
    result := self;
end;
adds a mov    rax,rdi in the caller function, even if rax is then never 
used.
{
26      begin
    0x00000000004001c0 <+0>:     push   rbx
27        ut := TUtility.Create;
    0x00000000004001c1 <+1>:     movabs rsi,0x1
    0x00000000004001cb <+11>:    lea rdi,[rip+0x2b2fde]        # 
0x6b31b0 <VMT_$WTFINLINE_$$_TUTILITY>
    0x00000000004001d2 <+18>:    call   0x411b60 
<SYSTEM$_$TOBJECT_$__$$_CREATE$$TOBJECT>
    0x00000000004001d7 <+23>:    mov    rbx,rax
28        ut.dosomething;
    0x00000000004001da <+26>:    call   0x41bf20 <fpc_get_output>
    0x00000000004001df <+31>:    mov    rdi,rax
    0x00000000004001e2 <+34>:    call   0x41c100 <fpc_writeln_end>
    0x00000000004001e7 <+39>:    call   0x416170 <fpc_iocheck>
    0x00000000004001ec <+44>:    mov    rdi,rbx
    0x00000000004001ef <+47>:    mov    rax,rdi 
//<----------------------------------------------- here
29        ut.free;
    0x00000000004001f2 <+50>:    call   0x411cd0 
<SYSTEM$_$TOBJECT_$__$$_FREE>
30      end;
    0x00000000004001f7 <+55>:    pop    rbx
    0x00000000004001f8 <+56>:    ret
}
It is a popular pattern to add result := self; to _every_ method (or 
result := @self in objects/records), so it can be chained as 
dosomething().dosomething().dosomething(),.....
but one cannot use it with fpc efficiently, when it inserts too many 
unnecessary instructions
Best,
Benito
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20170820/f4c4ad4f/attachment.html>
    
    
More information about the fpc-devel
mailing list