Przeglądaj źródła

Allow DCE to eliminate unused block parameters

jonathanvdc 8 lat temu
rodzic
commit
73ec6df3b4
1 zmienionych plików z 15 dodań i 5 usunięć
  1. 15 5
      kernel/modelverse_jit/cfg_optimization.py

+ 15 - 5
kernel/modelverse_jit/cfg_optimization.py

@@ -109,19 +109,23 @@ def elide_local_checks(entry_point):
 def eliminate_unused_definitions(entry_point):
     """Tries to eliminate unused definitions in the control-flow graphb defined by the
        given entry point."""
-    def_dependencies = {}
+    def_dependencies = defaultdict(set)
     root_defs = set()
     for block in cfg_ir.get_all_blocks(entry_point):
-        for definition in block.definitions:
-            def_dependencies[definition] = set(
+        for definition in block.parameters + block.definitions:
+            def_dependencies[definition].update(
                 [dep for dep in definition.get_all_dependencies()
                  if isinstance(dep, cfg_ir.Definition)])
             if definition.has_side_effects():
                 root_defs.add(definition)
 
-        for dep in block.flow.get_all_dependencies():
+        for dep in block.flow.get_dependencies():
             if isinstance(dep, cfg_ir.Definition):
                 root_defs.add(dep)
+            else:
+                assert isinstance(dep, cfg_ir.Branch)
+                for param, arg in zip(dep.block.parameters, dep.arguments):
+                    def_dependencies[param].add(arg)
 
     live_defs = set()
     def __mark_live(definition):
@@ -137,8 +141,14 @@ def eliminate_unused_definitions(entry_point):
         __mark_live(root)
 
     dead_defs = set.difference(set(def_dependencies.keys()), live_defs)
+    dead_phis = set()
     for dead_def in dead_defs:
-        dead_def.block.remove_definition(dead_def)
+        if isinstance(dead_def.value, cfg_ir.BlockParameter):
+            dead_phis.add(dead_def)
+        else:
+            dead_def.block.remove_definition(dead_def)
+
+    erase_parameters(entry_point, dead_phis)
 
 def eliminate_trivial_phis(entry_point):
     """Eliminates trivial block parameters, i.e., block parameters which are really