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