[fpc-devel] (patch) An attempt to improve assignments/functionresult reuse

Jonas Maebe jonas.maebe at elis.ugent.be
Sun Dec 16 12:00:16 CET 2007


On 16 Dec 2007, at 11:13, Florian Klaempfl wrote:

> Jonas Maebe schrieb:
>>
>> On 16 Dec 2007, at 10:12, Florian Klaempfl wrote:
>>
>>> Sergei Gorelkin schrieb:
>>>>
>>>> I am not sure that we need the particular DFA from optdfa.pas, but
>>>> something to reduce conservativeness of escape analysis is  
>>>> definitely
>>>> needed. Otherwise, temps that are needed for just one particular  
>>>> case of
>>>> x:=f(x) are being created almost everywhere.
>>>> DFA comes from Jonas's advice from one of the first messages:
>>>
>>> When Jonas posted this message first, I didn't understand because I
>>> thought I read it too quick, but after carefull reading, I still  
>>> don't
>>> understand it :) The first paragraph talks about alias analysis  
>>> while
>>> the second talks about dfa.
>>
>> You need the latter to perform the former in a context-sensitive way.
>> Context-sensitive means that the outcome of your analysis is  
>> tailored to
>> a particular point in the procedure, rather than valid in any  
>> context/at
>> any point in the procedure.
>
> So indeed an alias analysis is required. Doing a simple one  
> shouldn't be
> too hard but I fear it will be too conservative as well ...

I read too quickly over your message, what I wanted to say was that  
your need dfa to perform *escape analysis* in a context-sensitive way.  
Alias analysis can be used to further refine the results (namely set  
the ti_addr_taken/addr_taken stuff in less cases, or replace them with  
another less global mechanism), but is not required.

>> No, it's the big if in tcallnode.maybe_create_funcret_node. The
>> conservative/context-insensitive parts are the ti_addr_taken and
>> addr_taken checks. These are computed globally for the entire current
>> procedure, rather than statement per statement based on which  
>> statements
>> can have been executed before the current statement is executed.
>
> What's a typical example of code which is compiled too conservative?

function f: trecord; forward;

procedure t(var r: trecord); forward;

procedure test;
var
   r: trecord;
begin
   r:=f; {1}
   t(r); {2}
end;

{1} cannot be optimized because the address of r is taken in {2}.


Alias analysis could moreover allow optimization of cases like this:

function f(const rec: trecord): trecord; forward;

procedure t(var r: trecord); forward;

procedure test;
var
   r1, r2: trecord;
   p: precord;
begin
   r2.field1:=3;
   p:=@r1
   p^.field1:=2;
   r1:=f(r2);   {1}
   p:=@r2;
   r1:=f(p^);   {2}
end;

{1} could be optimized because we would know that while p^ aliases r1,  
it has not escaped. {2} could be optimized because we would know that  
p aliases r2 and not r1.

There's of course also the issue of dynamic arrays, where you can have  
aliasing without taking the address of a variable (and in principle  
also with ansi/widestrings due to pchar/pwidechar casts which avoid  
the uniquestring calls).

> Maybe we can reduce the setting of ti_addr_taken?

Not without either alias analysis or compromising correctness in  
certain (valid) special cases.


Jonas



More information about the fpc-devel mailing list