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:[EMAIL PROTECTED]
  p^.field1:=2;
  r1:=f(r2);   {1}
  p:[EMAIL PROTECTED];
  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
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to