Browse Source

* run dead store elimination multiple times if needed

florian 2 years ago
parent
commit
342524c312
2 changed files with 12 additions and 7 deletions
  1. 2 4
      compiler/optdeadstore.pas
  2. 10 3
      compiler/psub.pas

+ 2 - 4
compiler/optdeadstore.pas

@@ -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;
-      var
-        changed: boolean;
+    function do_optdeadstoreelim(var rootnode: tnode;changed: boolean): tnode;
       begin
       begin
 {$ifdef EXTDEBUG_DEADSTORE}
 {$ifdef EXTDEBUG_DEADSTORE}
         writeln('******************* Tree before deadstore elimination **********************');
         writeln('******************* Tree before deadstore elimination **********************');

+ 10 - 3
compiler/psub.pas

@@ -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