|
@@ -4,6 +4,7 @@ from collections import defaultdict
|
|
|
import modelverse_jit.cfg_ir as cfg_ir
|
|
|
import modelverse_jit.cfg_dominators as cfg_dominators
|
|
|
import modelverse_jit.cfg_ssa_construction as cfg_ssa_construction
|
|
|
+import modelverse_kernel.primitives as primitive_functions
|
|
|
|
|
|
def is_empty_block(block):
|
|
|
"""Tests if the given block contains no parameters or definitions."""
|
|
@@ -53,11 +54,15 @@ def merge_blocks(entry_point):
|
|
|
predecessor_map = cfg_ir.get_all_predecessor_blocks(entry_point)
|
|
|
queue = list(predecessor_map.keys())
|
|
|
def __do_merge(source, target):
|
|
|
- for target_param, branch_arg in zip(target.parameters, source.flow.branch.arguments):
|
|
|
- source.append_definition(target_param)
|
|
|
+ target_params = list(target.parameters)
|
|
|
+ for target_param, branch_arg in zip(target_params, source.flow.branch.arguments):
|
|
|
+ target.remove_parameter(target_param)
|
|
|
target_param.redefine(branch_arg)
|
|
|
+ source.append_definition(target_param)
|
|
|
|
|
|
- for target_def in target.definitions:
|
|
|
+ target_defs = list(target.definitions)
|
|
|
+ for target_def in target_defs:
|
|
|
+ target.remove_definition(target_def)
|
|
|
source.append_definition(target_def)
|
|
|
|
|
|
source.flow = target.flow
|
|
@@ -69,9 +74,9 @@ def merge_blocks(entry_point):
|
|
|
while len(queue) > 0:
|
|
|
block = queue.pop()
|
|
|
preds = predecessor_map[block]
|
|
|
- if len(preds) == 1:
|
|
|
+ if len(preds) == 1 and block != entry_point:
|
|
|
single_pred = next(iter(preds))
|
|
|
- if isinstance(single_pred.flow, cfg_ir.JumpFlow):
|
|
|
+ if single_pred != block and isinstance(single_pred.flow, cfg_ir.JumpFlow):
|
|
|
__do_merge(single_pred, block)
|
|
|
|
|
|
def elide_local_checks(entry_point):
|
|
@@ -330,7 +335,8 @@ def expand_indirect_definitions(entry_point):
|
|
|
block.flow = __expand_indirect_defs(block.flow)
|
|
|
|
|
|
def optimize(entry_point, jit):
|
|
|
- """Optimizes the control-flow graph defined by the given entry point."""
|
|
|
+ """Optimizes the control-flow graph defined by the given entry point.
|
|
|
+ A potentially altered entry point is returned."""
|
|
|
optimize_graph_flow(entry_point)
|
|
|
elide_local_checks(entry_point)
|
|
|
optimize_graph_flow(entry_point)
|
|
@@ -344,3 +350,4 @@ def optimize(entry_point, jit):
|
|
|
merge_blocks(entry_point)
|
|
|
expand_indirect_definitions(entry_point)
|
|
|
eliminate_unused_definitions(entry_point)
|
|
|
+ raise primitive_functions.PrimitiveFinished(entry_point)
|