* fix loop unrolling of for in loops

git-svn-id: trunk@25209 -
This commit is contained in:
florian 2013-08-02 21:21:14 +00:00
parent 24f8623490
commit b262b4d76b

View File

@ -62,7 +62,7 @@ unit optloop;
type type
treplaceinfo = record treplaceinfo = record
loadnode : tloadnode; node : tnode;
value : Tconstexprint; value : Tconstexprint;
end; end;
preplaceinfo = ^treplaceinfo; preplaceinfo = ^treplaceinfo;
@ -78,12 +78,15 @@ unit optloop;
function replaceloadnodes(var n: tnode; arg: pointer): foreachnoderesult; function replaceloadnodes(var n: tnode; arg: pointer): foreachnoderesult;
begin begin
if (n.nodetype=loadn) and (tloadnode(n).symtableentry=preplaceinfo(arg)^.loadnode.symtableentry) then if ((n.nodetype=loadn) and (preplaceinfo(arg)^.node.nodetype=loadn) and
(tloadnode(n).symtableentry=tloadnode(preplaceinfo(arg)^.node).symtableentry)) or
((n.nodetype=temprefn) and (preplaceinfo(arg)^.node.nodetype=temprefn) and
(ttemprefnode(n).tempinfo=ttemprefnode(preplaceinfo(arg)^.node).tempinfo)) then
begin begin
if n.flags*[nf_modify,nf_write]<>[] then if n.flags*[nf_modify,nf_write]<>[] then
internalerror(2012090402); internalerror(2012090402);
n.free; n.free;
n:=cordconstnode.create(preplaceinfo(arg)^.value,preplaceinfo(arg)^.loadnode.resultdef,false); n:=cordconstnode.create(preplaceinfo(arg)^.value,preplaceinfo(arg)^.node.resultdef,false);
end; end;
result:=fen_false; result:=fen_false;
end; end;
@ -130,9 +133,9 @@ unit optloop;
if getridoffor then if getridoffor then
begin begin
if tfornode(node).left.nodetype<>loadn then if not(tfornode(node).left.nodetype in [temprefn,loadn]) then
internalerror(2012090301); internalerror(2012090301);
replaceinfo.loadnode:=tloadnode(tfornode(node).left); replaceinfo.node:=tfornode(node).left;
replaceinfo.value:=tordconstnode(tfornode(node).right).value; replaceinfo.value:=tordconstnode(tfornode(node).right).value;
end; end;