* continue const. propagation after a for loop when possible

This commit is contained in:
florian 2022-05-22 22:51:57 +02:00
parent bcea5581de
commit 4c8e802dd3
2 changed files with 24 additions and 21 deletions

View File

@ -50,7 +50,7 @@ unit optconstprop;
will not result in any constant propagation.
}
function do_optconstpropagate(var rootnode : tnode) : tnode;
function do_optconstpropagate(var rootnode : tnode;var changed: boolean) : tnode;
implementation
@ -136,7 +136,9 @@ unit optconstprop;
{ play safe and set the result which is check below }
result:=replaceBasicAssign(tfornode(n).t1, arg, tree_modified2);
tree_modified:=tree_modified or tree_modified2;
if result and (pi_dfaavailable in current_procinfo.flags) then
if result and (pi_dfaavailable in current_procinfo.flags) and
{ play safe }
assigned(tfornode(n).t2.optinfo) and assigned(tassignmentnode(arg).left.optinfo) then
begin
CalcDefSum(tfornode(n).t2);
{ the constant can propagete if is is not the counter variable ... }
@ -146,9 +148,8 @@ unit optconstprop;
{ and no definition in the loop? }
not(DFASetIn(tfornode(n).t2.optinfo^.defsum,tassignmentnode(arg).left.optinfo^.index)) then
begin
replaceBasicAssign(tfornode(n).t2, arg, tree_modified3);
result:=replaceBasicAssign(tfornode(n).t2, arg, tree_modified3);
tree_modified:=tree_modified or tree_modified3;
result:=false;
end
else
result:=false;
@ -383,22 +384,15 @@ unit optconstprop;
end;
function do_optconstpropagate(var rootnode: tnode): tnode;
var
changed: boolean;
runsimplify : Boolean;
function do_optconstpropagate(var rootnode: tnode;var changed: boolean): tnode;
begin
{$ifdef DEBUG_CONSTPROP}
writeln('************************ before constant propagation ***************************');
printnode(rootnode);
{$endif DEBUG_CONSTPROP}
runsimplify:=false;
repeat
changed:=false;
foreachnodestatic(pm_postandagain, rootnode, @propagate, @changed);
runsimplify:=runsimplify or changed;
until changed=false;
if runsimplify then
changed:=false;
foreachnodestatic(pm_postandagain, rootnode, @propagate, @changed);
if changed then
doinlinesimplify(rootnode);
{$ifdef DEBUG_CONSTPROP}
writeln('************************ after constant propagation ***************************');

View File

@ -1199,7 +1199,7 @@ implementation
procedure tcgprocinfo.OptimizeNodeTree;
var
i : integer;
RedoDFA: Boolean;
RedoDFA, changed: Boolean;
{RedoDFA : boolean;}
begin
{ do this before adding the entry code else the tail recursion recognition won't work,
@ -1210,7 +1210,12 @@ implementation
do_opttail(code,procdef);
if cs_opt_constant_propagate in current_settings.optimizerswitches then
do_optconstpropagate(code);
begin
changed:=false;
repeat
do_optconstpropagate(code,changed);
until not(changed);
end;
if (cs_opt_nodedfa in current_settings.optimizerswitches) and
{ creating dfa is not always possible }
@ -1222,10 +1227,14 @@ implementation
RedoDFA:=false;
if cs_opt_constant_propagate in current_settings.optimizerswitches then
do_optconstpropagate(code);
if RedoDFA then
dfabuilder.redodfainfo(code);
begin
changed:=false;
repeat
do_optconstpropagate(code,changed);
if changed then
dfabuilder.redodfainfo(code);
until not(changed);
end;
if (cs_opt_loopstrength in current_settings.optimizerswitches)
{ our induction variable strength reduction doesn't like