Selaa lähdekoodia

Perform constant reads at compile-time, even for CFGs

jonathanvdc 8 vuotta sitten
vanhempi
commit
3b2e587f40
2 muutettua tiedostoa jossa 14 lisäystä ja 1 poistoa
  1. 12 0
      kernel/modelverse_jit/cfg_optimization.py
  2. 2 1
      kernel/modelverse_jit/jit.py

+ 12 - 0
kernel/modelverse_jit/cfg_optimization.py

@@ -326,6 +326,17 @@ def simplify_values(entry_point):
                         cfg_ir.Literal(
                             eval('%r %s %r' % (lhs.literal, def_val.operator, rhs.literal))))
 
+def inline_constants(entry_point):
+    """Replaces reads of constant nodes by the literals they contain."""
+    for block in get_all_blocks(entry_point):
+        for definition in block.definitions:
+            def_val = cfg_ir.get_def_value(definition)
+            if isinstance(def_val, cfg_ir.Read):
+                read_node = cfg_ir.get_def_value(def_val.node)
+                if isinstance(read_node, cfg_ir.Literal):
+                    val, = yield [("RV", [read_node.literal])]
+                    definition.redefine(cfg_ir.Literal(val))
+
 def optimize(entry_point, jit):
     """Optimizes the control-flow graph defined by the given entry point."""
     optimize_graph_flow(entry_point)
@@ -333,6 +344,7 @@ def optimize(entry_point, jit):
     optimize_graph_flow(entry_point)
     eliminate_trivial_phis(entry_point)
     optimize_calls(entry_point, jit)
+    yield [("CALL_ARGS", [inline_constants, (entry_point,)])]
     simplify_values(entry_point)
     eliminate_unused_definitions(entry_point)
     optimize_graph_flow(entry_point)

+ 2 - 1
kernel/modelverse_jit/jit.py

@@ -467,7 +467,8 @@ class ModelverseJit(object):
         if self.jit_code_log_function is not None:
             bytecode_analyzer = bytecode_to_cfg.AnalysisState(param_dict)
             bytecode_analyzer.analyze(body_bytecode)
-            cfg_optimization.optimize(bytecode_analyzer.entry_point, self)
+            yield [
+                ("CALL_ARGS", [cfg_optimization.optimize, (bytecode_analyzer.entry_point, self)])]
             self.jit_code_log_function(
                 "CFG for function '%s' at '%d':\n%s" % (
                     function_name, body_id,