mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 23:09:18 +02:00
* run dead store elimination multiple times if needed
This commit is contained in:
parent
a0366d7d28
commit
342524c312
@ -31,7 +31,7 @@ unit optdeadstore;
|
|||||||
uses
|
uses
|
||||||
node;
|
node;
|
||||||
|
|
||||||
function do_optdeadstoreelim(var rootnode : tnode) : tnode;
|
function do_optdeadstoreelim(var rootnode : tnode;changed: boolean) : tnode;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
@ -106,9 +106,7 @@ unit optdeadstore;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
function do_optdeadstoreelim(var rootnode: tnode): tnode;
|
function do_optdeadstoreelim(var rootnode: tnode;changed: boolean): tnode;
|
||||||
var
|
|
||||||
changed: boolean;
|
|
||||||
begin
|
begin
|
||||||
{$ifdef EXTDEBUG_DEADSTORE}
|
{$ifdef EXTDEBUG_DEADSTORE}
|
||||||
writeln('******************* Tree before deadstore elimination **********************');
|
writeln('******************* Tree before deadstore elimination **********************');
|
||||||
|
@ -1294,15 +1294,22 @@ implementation
|
|||||||
tabstractnormalvarsym(tloadnode(dfabuilder.nodemap[i]).symtableentry).noregvarinitneeded:=true
|
tabstractnormalvarsym(tloadnode(dfabuilder.nodemap[i]).symtableentry).noregvarinitneeded:=true
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
if cs_opt_dead_store_eliminate in current_settings.optimizerswitches then
|
||||||
|
begin
|
||||||
|
changed:=false;
|
||||||
|
repeat
|
||||||
|
do_optdeadstoreelim(code,changed);
|
||||||
|
if changed then
|
||||||
|
dfabuilder.redodfainfo(code);
|
||||||
|
until not(changed);
|
||||||
|
end;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
ConvertForLoops(code);
|
ConvertForLoops(code);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if (pi_dfaavailable in flags) and (cs_opt_dead_store_eliminate in current_settings.optimizerswitches) then
|
|
||||||
do_optdeadstoreelim(code);
|
|
||||||
|
|
||||||
if (cs_opt_remove_empty_proc in current_settings.optimizerswitches) and
|
if (cs_opt_remove_empty_proc in current_settings.optimizerswitches) and
|
||||||
(procdef.proctypeoption in [potype_operator,potype_procedure,potype_function]) and
|
(procdef.proctypeoption in [potype_operator,potype_procedure,potype_function]) and
|
||||||
(code.nodetype=blockn) and (tblocknode(code).statements=nil) then
|
(code.nodetype=blockn) and (tblocknode(code).statements=nil) then
|
||||||
|
Loading…
Reference in New Issue
Block a user