mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-08 10:26:13 +02:00
* fix loop unrolling of for in loops
git-svn-id: trunk@25209 -
This commit is contained in:
parent
24f8623490
commit
b262b4d76b
@ -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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user