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