mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-27 07:11:39 +01:00
+ first draft for dfa
git-svn-id: trunk@7282 -
This commit is contained in:
parent
b2605b8ff6
commit
87bdf13f9f
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -279,9 +279,11 @@ compiler/oglx.pas svneol=native#text/plain
|
|||||||
compiler/ogmap.pas svneol=native#text/plain
|
compiler/ogmap.pas svneol=native#text/plain
|
||||||
compiler/optbase.pas svneol=native#text/plain
|
compiler/optbase.pas svneol=native#text/plain
|
||||||
compiler/optcse.pas svneol=native#text/plain
|
compiler/optcse.pas svneol=native#text/plain
|
||||||
|
compiler/optdfa.pas svneol=native#text/plain
|
||||||
compiler/options.pas svneol=native#text/plain
|
compiler/options.pas svneol=native#text/plain
|
||||||
compiler/opttail.pas svneol=native#text/plain
|
compiler/opttail.pas svneol=native#text/plain
|
||||||
compiler/optunrol.pas svneol=native#text/plain
|
compiler/optunrol.pas svneol=native#text/plain
|
||||||
|
compiler/optutils.pas svneol=native#text/plain
|
||||||
compiler/owar.pas svneol=native#text/plain
|
compiler/owar.pas svneol=native#text/plain
|
||||||
compiler/owbase.pas svneol=native#text/plain
|
compiler/owbase.pas svneol=native#text/plain
|
||||||
compiler/parabase.pas svneol=native#text/plain
|
compiler/parabase.pas svneol=native#text/plain
|
||||||
|
|||||||
@ -278,6 +278,12 @@ interface
|
|||||||
{ the parent node of this is node }
|
{ the parent node of this is node }
|
||||||
{ this field is set by concattolist }
|
{ this field is set by concattolist }
|
||||||
parent : tnode;
|
parent : tnode;
|
||||||
|
{ next node in control flow on the same block level, i.e.
|
||||||
|
for loop nodes, this is the next node after the end of the loop,
|
||||||
|
same for if and case, if this field is nil, the next node is the procedure exit,
|
||||||
|
for the last node in a loop this is set to the loop header
|
||||||
|
this field is set only for control flow nodes }
|
||||||
|
successor : tnode;
|
||||||
{ there are some properties about the node stored }
|
{ there are some properties about the node stored }
|
||||||
flags : tnodeflags;
|
flags : tnodeflags;
|
||||||
ppuidx : longint;
|
ppuidx : longint;
|
||||||
|
|||||||
99
compiler/optdfa.pas
Normal file
99
compiler/optdfa.pas
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
{
|
||||||
|
DFA
|
||||||
|
|
||||||
|
Copyright (c) 2007 by Florian Klaempfl
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
}
|
||||||
|
unit optdfa;
|
||||||
|
|
||||||
|
{$i fpcdefs.inc}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
node;
|
||||||
|
|
||||||
|
procedure createoptinfo(node : tnode);
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
globtype,globals,
|
||||||
|
cpuinfo,
|
||||||
|
nutils,
|
||||||
|
nbas,nflw,ncon,ninl,ncal,
|
||||||
|
optutils;
|
||||||
|
|
||||||
|
|
||||||
|
function initnodes(var n:tnode; arg: pointer) : foreachnoderesult;
|
||||||
|
begin
|
||||||
|
{ node worth to add? }
|
||||||
|
if (node_complexity(n)>1) and (tstoreddef(n.resultdef).is_intregable or tstoreddef(n.resultdef).is_fpuregable) then
|
||||||
|
begin
|
||||||
|
plists(arg)^.nodelist.Add(n);
|
||||||
|
plists(arg)^.locationlist.Add(@n);
|
||||||
|
result:=fen_false;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
result:=fen_norecurse_false;
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
x:=f; read: [f]
|
||||||
|
|
||||||
|
while x do read: []
|
||||||
|
|
||||||
|
a:=b; read: [a,b,d] def: [a] life: read*def=[a]
|
||||||
|
c:=d; read: [a,d] def: [a,c] life: read*def=[a]
|
||||||
|
e:=a; read: [a] def: [a,c,e] life: read*def=[a]
|
||||||
|
|
||||||
|
|
||||||
|
function f(b,d,x : type) : type;
|
||||||
|
|
||||||
|
begin
|
||||||
|
while x do alive: b,d,x
|
||||||
|
begin
|
||||||
|
a:=b; alive: b,d,x
|
||||||
|
c:=d; alive: a,d,x
|
||||||
|
e:=a+c; alive: a,c,x
|
||||||
|
dec(x); alive: c,e,x
|
||||||
|
end;
|
||||||
|
result:=c+e; alive: c,e
|
||||||
|
end; alive: result
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
type
|
||||||
|
tdfainfo = record
|
||||||
|
definitionlist : tfplist;
|
||||||
|
lifelist : tfplist;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure createdfainfo(node : tnode);
|
||||||
|
begin
|
||||||
|
{ first, add controll flow information }
|
||||||
|
SetNodeSucessors(node);
|
||||||
|
{ now, collect life information }
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
end.
|
||||||
129
compiler/optutils.pas
Normal file
129
compiler/optutils.pas
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
{
|
||||||
|
Helper routines for the optimizer
|
||||||
|
|
||||||
|
Copyright (c) 2007 by Florian Klaempfl
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
|
****************************************************************************
|
||||||
|
}
|
||||||
|
unit optutils;
|
||||||
|
|
||||||
|
{$i fpcdefs.inc}
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
node;
|
||||||
|
|
||||||
|
procedure SetNodeSucessors(p : tnode);
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
nbas,nflw;
|
||||||
|
|
||||||
|
procedure SetNodeSucessors(p : tnode);
|
||||||
|
var
|
||||||
|
Continuestack : TFPList;
|
||||||
|
Breakstack : TFPList;
|
||||||
|
{ sets the successor nodes of a node tree block
|
||||||
|
returns the first node of the tree if it's a controll flow node }
|
||||||
|
function DoSet(p : tnode;succ : tnode) : tnode;
|
||||||
|
var
|
||||||
|
hp1,hp2 : tnode;
|
||||||
|
begin
|
||||||
|
result:=nil;
|
||||||
|
case p.nodetype of
|
||||||
|
statementn:
|
||||||
|
begin
|
||||||
|
hp1:=p;
|
||||||
|
result:=p;
|
||||||
|
while assigned(hp1) do
|
||||||
|
begin
|
||||||
|
if assigned(tstatementnode(hp1).right) then
|
||||||
|
begin
|
||||||
|
hp2:=DoSet(tstatementnode(hp1).statement,tstatementnode(hp1).next);
|
||||||
|
if assigned(hp2) then
|
||||||
|
tstatementnode(hp1).successor:=hp2
|
||||||
|
else
|
||||||
|
tstatementnode(hp1).successor:=tstatementnode(hp1).right;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
hp2:=DoSet(tstatementnode(hp1).statement,successor);
|
||||||
|
if assigned(hp2) then
|
||||||
|
tstatementnode(hp1).successor:=hp2
|
||||||
|
else
|
||||||
|
tstatementnode(hp1).successor:=successor;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
blockn:
|
||||||
|
begin
|
||||||
|
result:=DoSet(tblocknode(p).statements,successor);
|
||||||
|
end;
|
||||||
|
forn:
|
||||||
|
begin
|
||||||
|
Breakstack.Add(successor);
|
||||||
|
Continuestack.Add(p);
|
||||||
|
result:=p;
|
||||||
|
DoSet(tfornode(p).statements,successor);
|
||||||
|
Breakstack.Delete(Count-1);
|
||||||
|
Continuestack.Delete(Count-1);
|
||||||
|
end;
|
||||||
|
breakn:
|
||||||
|
begin
|
||||||
|
result:=p;
|
||||||
|
p.successor:=tnode(Breakstack.Last);
|
||||||
|
end;
|
||||||
|
continuen:
|
||||||
|
begin
|
||||||
|
result:=p;
|
||||||
|
p.successor:=tnode(Continuestack.Last);
|
||||||
|
end;
|
||||||
|
{ exit is actually a jump to some final. code
|
||||||
|
exitn:
|
||||||
|
begin
|
||||||
|
result:=p;
|
||||||
|
p.successor:=nil;
|
||||||
|
end;
|
||||||
|
}
|
||||||
|
ifn,
|
||||||
|
whilerepeatn,
|
||||||
|
exitn,
|
||||||
|
withn,
|
||||||
|
casen,
|
||||||
|
labeln,
|
||||||
|
goton,
|
||||||
|
tryexceptn,
|
||||||
|
raisen,
|
||||||
|
tryfinallyn,
|
||||||
|
onn,
|
||||||
|
nothingn:
|
||||||
|
internalerror(2007050501);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Breakstack:=TFPList.Create;
|
||||||
|
Continuestack:=TFPList.Create;
|
||||||
|
DoSet(p,nil);
|
||||||
|
Continuestack.Free;
|
||||||
|
Breakstack.Free;
|
||||||
|
end;
|
||||||
|
|
||||||
|
end.
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user