|
@@ -28,6 +28,10 @@ unit optdfa;
|
|
|
uses
|
|
|
node;
|
|
|
|
|
|
+ { reset all dfa info, this is required before creating dfa info
|
|
|
+ if the tree has been changed without updating dfa }
|
|
|
+ procedure resetdfainfo(node : tnode);
|
|
|
+
|
|
|
procedure createoptinfo(node : tnode);
|
|
|
|
|
|
implementation
|
|
@@ -54,8 +58,6 @@ unit optdfa;
|
|
|
end;
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
{
|
|
|
x:=f; read: [f]
|
|
|
|
|
@@ -83,16 +85,130 @@ unit optdfa;
|
|
|
|
|
|
type
|
|
|
tdfainfo = record
|
|
|
- definitionlist : tfplist;
|
|
|
- lifelist : tfplist;
|
|
|
+ use : TDFASet;
|
|
|
+ def : TDFASet;
|
|
|
+ map : TIndexedNodeSet
|
|
|
+ end;
|
|
|
+
|
|
|
+ procedure AddDefUse(s : TDFASet;m : ;n : tnode);
|
|
|
+ begin
|
|
|
+ while true do
|
|
|
+ begin
|
|
|
+ case n.nodetype of
|
|
|
+ typeconvn:
|
|
|
+ n:=ttypeconvnode(n).left;
|
|
|
+ loadn:
|
|
|
+ begin
|
|
|
+ m.Add(n);
|
|
|
+ TDFASetInclude(s,n.optinfo^.index);
|
|
|
+ end;
|
|
|
+ else
|
|
|
+ internalerror(2007050601);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
+
|
|
|
+ procedure CreateLifeInfo(node : tnode);
|
|
|
+
|
|
|
+ var
|
|
|
+ changed : boolean;
|
|
|
+
|
|
|
+ procedure CreateInfo(node : tnode);
|
|
|
+
|
|
|
+ procedure updatelifeinfo(n : tnode;l : TDFASet);
|
|
|
+ begin
|
|
|
+ changed:=changed or DFASetNotEqual(l,n.life);
|
|
|
+ node.life:=l;
|
|
|
+ end;
|
|
|
+
|
|
|
+ procedure calclife(n : tnode);
|
|
|
+ var
|
|
|
+ l : TDFANode;
|
|
|
+ begin
|
|
|
+ if assigned(successor) then
|
|
|
+ begin
|
|
|
+ DFASetDiff(l,successor.optinfo^.life,n.optinfo^.def);
|
|
|
+ DFASetIncludeSet(l,n.optinfo^.use);
|
|
|
+ updatelifeinfo(n,l);
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+ var
|
|
|
+ dfainfo : tdfainfo;
|
|
|
+ begin
|
|
|
+ if nf_processing in node.flags then
|
|
|
+ exit;
|
|
|
+ include(node,nf_processing);
|
|
|
+
|
|
|
+ if assigned(node.successor) then
|
|
|
+ CreateInfo(node.successor);
|
|
|
+
|
|
|
+ { life:=succesorlive-definition+use }
|
|
|
+
|
|
|
+ case node.nodetype of
|
|
|
+ whilen:
|
|
|
+ begin
|
|
|
+ { first, do things as usual, get life information from the successor }
|
|
|
+
|
|
|
+ { life:=succesorlive-definition+use }
|
|
|
+
|
|
|
+ { now iterate through the loop }
|
|
|
+ CreateInfo(twhilenode(node).left);
|
|
|
+
|
|
|
+ { update while node }
|
|
|
+ { life:=life+left.life }
|
|
|
+
|
|
|
+ { ... and a second iteration for fast convergence }
|
|
|
+ CreateInfo(twhilenode(node).left);
|
|
|
+ end;
|
|
|
+ statementn:
|
|
|
+ begin
|
|
|
+ { actually an expression doing something? }
|
|
|
+ case tstatementnode(node).statement.nodetype of
|
|
|
+ assignn:
|
|
|
+ begin
|
|
|
+ tstatementnode(node).allocoptinfo;
|
|
|
+ if not(assigned(tstatementnode(node).optinfo^.def)) or
|
|
|
+ not(assigned(tstatementnode(node).optinfo^.use)) then
|
|
|
+ begin
|
|
|
+ dfainfo.use:=tstatementnode(node).optinfo^.use;
|
|
|
+ dfainfo.def:=tstatementnode(node).optinfo^.def;
|
|
|
+ Foreach
|
|
|
+ end;
|
|
|
+ calclife(node);
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ end;
|
|
|
+ else
|
|
|
+ internalerror(2007050502);
|
|
|
+ end;
|
|
|
+
|
|
|
+ exclude(node,nf_processing);
|
|
|
+ end;
|
|
|
+
|
|
|
+ begin
|
|
|
+ repeat
|
|
|
+ changed:=false;
|
|
|
+ CreateInfo(node);
|
|
|
+ until not(changed);
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
+ { reset all dfa info, this is required before creating dfa info
|
|
|
+ if the tree has been changed without updating dfa }
|
|
|
+ procedure resetdfainfo(node : tnode);
|
|
|
+ begin
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
procedure createdfainfo(node : tnode);
|
|
|
begin
|
|
|
- { first, add controll flow information }
|
|
|
+ { add controll flow information }
|
|
|
SetNodeSucessors(node);
|
|
|
- { now, collect life information }
|
|
|
|
|
|
+ { now, collect life information }
|
|
|
+ CreateLifeInfo(node);
|
|
|
end;
|
|
|
|
|
|
|