Initially, F probably wouldn't be optimised because 'arg' is not constant.  However, if F were marked as inline (not pure) and its actual parameter is a constant (say, 5, for the sake of argument), then there is definitely potential for optimisation, since it would be expanded to the following:

s := 0;
for i := 0 to 100 do
  s := s + PureFunc(5);
Result := s;

In this case, PureFunc(5) would be replaced with its pre-calculated result, and some node analysis could potentially replace the entire for-loop with s := s + x, where x is equal to 101 * PureFunc(5), since it's now dealing with simple numbers.

Now for the case where F is not pure or inline, it may take a bit more thought in allowing the compiler to detect the mathematical equivalence and replace the for-loop with s := s + 101 * PureFunc(arg), but it's certainly doable.  Going back to the original subject title, this is one reason why I pushed to get the XML node dump feature implemented, because it provides valuable research data for the development of such optimisations.  Such an optimisation may have to be -O4 though because of a side-effect with range check errors - if the error is handled, s might contain a different value to what is expected (e.g. if s was initially $7FFFFFF0 and PureFunc(arg) = 1, then assuming s isn't written to before the error is raised, it will still contain $7FFFFFF0 rather than $7FFFFFFF that would occur if the for-loop ran a few times).

Long story short, it took me a brief moment to see how the optimisation would work until I thought about it a bit more, but if PureFunc is indeed pure, then that could certainly be a development goal.

Thank you very much for that!

Gareth aka. Kit


On 25/06/2019 09:19, denisgolovan wrote:
Can I have an example of "hoisting pure functions out of loops" that you
speak of?
Sure.
I mean something like following (completely artificial example):

function PureFunc1: ...
function F(arg: Integer): Integer;
var s:Integer;
begin
   s:=0;
   for i:=0 to 100 do
      s:=s+PureFunc(arg);
   Result:=s;
end;

Of course, the real value of pure functions for optimization oppotunities is 
some combination of generics and closures, but that's completely another 
story...


---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus

_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to