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


_______________________________________________
fpc-devel maillist  -  [email protected]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to