Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79453:9cb5d0626cce
Date: 2015-09-05 12:27 +0200
http://bitbucket.org/pypy/pypy/changeset/9cb5d0626cce/

Log:    improve on having consistent names of boxes in translated version

diff --git a/rpython/jit/metainterp/compile.py 
b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -24,6 +24,8 @@
     raise SwitchToBlackhole(Counters.ABORT_BRIDGE)
 
 class CompileData(object):
+    memo = None
+    
     def forget_optimization_info(self):
         for arg in self.start_label.getarglist():
             arg.set_forwarded(None)
@@ -54,7 +56,8 @@
             opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
             return opt.optimize_preamble(self.start_label, self.end_label,
                                          self.operations,
-                                         self.call_pure_results)
+                                         self.call_pure_results,
+                                         self.box_names_memo)
         else:
             opt = Optimizer(metainterp_sd, jitdriver_sd, optimizations)
             return opt.propagate_all_forward(self.start_label.getarglist(),
@@ -97,7 +100,8 @@
         opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
         return opt.optimize_bridge(self.start_label, self.operations,
                                    self.call_pure_results,
-                                   self.inline_short_preamble)
+                                   self.inline_short_preamble,
+                                   self.box_names_memo)
 
 class UnrolledLoopData(CompileData):
     """ This represents label() ops jump with extra info that's from the
@@ -217,7 +221,7 @@
                                  enable_opts=enable_opts)
     try:
         loop_info, ops = optimize_trace(metainterp_sd, jitdriver_sd,
-                                        data)
+                                        metainterp.box_names_memo, data)
     except InvalidLoop:
         return None
     loop = create_empty_loop(metainterp)
@@ -235,7 +239,7 @@
         loop.check_consistency()
     jitcell_token.target_tokens = [target_token]
     send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, "loop",
-                         inputargs)
+                         inputargs, metainterp.box_names_memo)
     record_loop_or_bridge(metainterp_sd, loop)
     return target_token
 
@@ -271,6 +275,7 @@
                                     enable_opts=enable_opts)
     try:
         start_state, preamble_ops = optimize_trace(metainterp_sd, jitdriver_sd,
+                                                   metainterp.box_names_memo,
                                                    preamble_data)
     except InvalidLoop:
         return None
@@ -285,6 +290,7 @@
                                  enable_opts=enable_opts)
     try:
         loop_info, loop_ops = optimize_trace(metainterp_sd, jitdriver_sd,
+                                             metainterp.box_names_memo,
                                              loop_data)
     except InvalidLoop:
         return None
@@ -307,14 +313,14 @@
     assert isinstance(label_token, TargetToken)
     if label_token.short_preamble:
         metainterp_sd.logger_ops.log_short_preamble([],
-                                                label_token.short_preamble)
+            label_token.short_preamble, metainterp.box_names_memo)
     loop.operations = ([start_label] + preamble_ops + loop_info.extra_same_as +
                        [loop_info.label_op] + loop_ops)
     if not we_are_translated():
         loop.check_consistency()
     jitcell_token.target_tokens = [start_descr] + jitcell_token.target_tokens
     send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, "loop",
-                         inputargs)
+                         inputargs, metainterp.box_names_memo)
     record_loop_or_bridge(metainterp_sd, loop)
     return start_descr
 
@@ -345,6 +351,7 @@
                                  enable_opts=enable_opts)
     try:
         loop_info, loop_ops = optimize_trace(metainterp_sd, jitdriver_sd,
+                                             metainterp.box_names_memo,
                                              loop_data)
     except InvalidLoop:
         # Fall back on jumping directly to preamble
@@ -355,6 +362,7 @@
                                      inline_short_preamble=False)
         try:
             loop_info, loop_ops = optimize_trace(metainterp_sd, jitdriver_sd,
+                                                 metainterp.box_names_memo,
                                                  loop_data)
         except InvalidLoop:
             return None
@@ -363,7 +371,7 @@
     assert isinstance(label_token, TargetToken)
     if label_token.short_preamble:
         metainterp_sd.logger_ops.log_short_preamble([],
-                                                label_token.short_preamble)
+            label_token.short_preamble, metainterp.box_names_memo)
     loop = partial_trace
     loop.original_jitcell_token = loop_jitcell_token
     loop.operations = (loop.operations + loop_info.extra_same_as +
@@ -460,9 +468,9 @@
 
 
 def do_compile_loop(jd_id, unique_id, metainterp_sd, inputargs, operations,
-                    looptoken, log=True, name=''):
+                    looptoken, log=True, name='', memo=None):
     metainterp_sd.logger_ops.log_loop(inputargs, operations, -2,
-                                      'compiling', name=name)
+                                      'compiling', name=name, memo=memo)
     return metainterp_sd.cpu.compile_loop(inputargs,
                                           operations, looptoken,
                                           jd_id=jd_id, unique_id=unique_id,
@@ -470,8 +478,9 @@
                                           logger=metainterp_sd.logger_ops)
 
 def do_compile_bridge(metainterp_sd, faildescr, inputargs, operations,
-                      original_loop_token, log=True):
-    metainterp_sd.logger_ops.log_bridge(inputargs, operations, "compiling")
+                      original_loop_token, log=True, memo=None):
+    metainterp_sd.logger_ops.log_bridge(inputargs, operations, "compiling",
+                                        memo=memo)
     assert isinstance(faildescr, AbstractFailDescr)
     return metainterp_sd.cpu.compile_bridge(faildescr, inputargs, operations,
                                             original_loop_token, log=log,
@@ -486,7 +495,7 @@
             item.reset_value()
 
 def send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, type,
-                         orig_inpargs):
+                         orig_inpargs, memo):
     forget_optimization_info(loop.operations)
     forget_optimization_info(loop.inputargs)
     vinfo = jitdriver_sd.virtualizable_info
@@ -521,7 +530,8 @@
         asminfo = do_compile_loop(jitdriver_sd.index, unique_id, metainterp_sd,
                                   loop.inputargs,
                                   operations, original_jitcell_token,
-                                  name=loopname)
+                                  name=loopname,
+                                  memo=memo)
     finally:
         debug_stop("jit-backend")
     metainterp_sd.profiler.end_backend()
@@ -545,7 +555,7 @@
         
metainterp_sd.warmrunnerdesc.memory_manager.keep_loop_alive(original_jitcell_token)
 
 def send_bridge_to_backend(jitdriver_sd, metainterp_sd, faildescr, inputargs,
-                           operations, original_loop_token):
+                           operations, original_loop_token, memo):
     forget_optimization_info(operations)
     forget_optimization_info(inputargs)
     if not we_are_translated():
@@ -567,7 +577,7 @@
     try:
         asminfo = do_compile_bridge(metainterp_sd, faildescr, inputargs,
                                     operations,
-                                    original_loop_token)
+                                    original_loop_token, memo)
     finally:
         debug_stop("jit-backend")
     metainterp_sd.profiler.end_backend()
@@ -583,7 +593,7 @@
     else:
         ops_offset = None
     metainterp_sd.logger_ops.log_bridge(inputargs, operations, None, faildescr,
-                                        ops_offset)
+                                        ops_offset, memo=memo)
     #
     #if metainterp_sd.warmrunnerdesc is not None:    # for tests
     #    metainterp_sd.warmrunnerdesc.memory_manager.keep_loop_alive(
@@ -801,7 +811,8 @@
         propagate_original_jitcell_token(new_loop)
         send_bridge_to_backend(metainterp.jitdriver_sd, metainterp.staticdata,
                                self, inputargs, new_loop.operations,
-                               new_loop.original_jitcell_token)
+                               new_loop.original_jitcell_token,
+                               metainterp.box_names_memo)
 
     def make_a_counter_per_value(self, guard_value_op):
         assert guard_value_op.getopnum() == rop.GUARD_VALUE
@@ -991,7 +1002,7 @@
         propagate_original_jitcell_token(new_loop)
         send_loop_to_backend(self.original_greenkey, metainterp.jitdriver_sd,
                              metainterp_sd, new_loop, "entry bridge",
-                             orig_inputargs)
+                             orig_inputargs, metainterp.box_names_memo)
         # send the new_loop to warmspot.py, to be called directly the next time
         jitdriver_sd.warmstate.attach_procedure_to_interp(
             self.original_greenkey, jitcell_token)
@@ -1035,7 +1046,8 @@
                                  call_pure_results=call_pure_results,
                                  enable_opts=enable_opts)
     try:
-        info, newops = optimize_trace(metainterp_sd, jitdriver_sd, data)
+        info, newops = optimize_trace(metainterp_sd, jitdriver_sd,
+                                      metainterp.box_names_memo, data)
     except InvalidLoop:
         debug_print("compile_new_bridge: got an InvalidLoop")
         # XXX I am fairly convinced that optimize_bridge cannot actually raise
diff --git a/rpython/jit/metainterp/logger.py b/rpython/jit/metainterp/logger.py
--- a/rpython/jit/metainterp/logger.py
+++ b/rpython/jit/metainterp/logger.py
@@ -12,90 +12,103 @@
         self.metainterp_sd = metainterp_sd
         self.guard_number = guard_number
 
-    def log_loop(self, inputargs, operations, number=0, type=None, 
ops_offset=None, name=''):
+    def log_loop(self, inputargs, operations, number=0, type=None,
+                 ops_offset=None, name='', memo=None):
         if type is None:
             debug_start("jit-log-noopt-loop")
             debug_print("# Loop", number, '(%s)' % name, ":", "noopt",
                         "with", len(operations), "ops")
-            logops = self._log_operations(inputargs, operations, ops_offset)
+            logops = self._log_operations(inputargs, operations, ops_offset,
+                                          memo)
             debug_stop("jit-log-noopt-loop")
         elif type == "rewritten":
             debug_start("jit-log-rewritten-loop")
             debug_print("# Loop", number, '(%s)' % name, ":", type,
                         "with", len(operations), "ops")
-            logops = self._log_operations(inputargs, operations, ops_offset)
+            logops = self._log_operations(inputargs, operations, ops_offset,
+                                          memo)
             debug_stop("jit-log-rewritten-loop")
         elif number == -2:
             debug_start("jit-log-compiling-loop")
-            logops = self._log_operations(inputargs, operations, ops_offset)
+            logops = self._log_operations(inputargs, operations, ops_offset,
+                                          memo)
             debug_stop("jit-log-compiling-loop")
         else:
             debug_start("jit-log-opt-loop")
             debug_print("# Loop", number, '(%s)' % name, ":", type,
                         "with", len(operations), "ops")
-            logops = self._log_operations(inputargs, operations, ops_offset)
+            logops = self._log_operations(inputargs, operations, ops_offset,
+                                          memo)
             debug_stop("jit-log-opt-loop")
         return logops
 
     def log_bridge(self, inputargs, operations, extra=None,
-                   descr=None, ops_offset=None):
+                   descr=None, ops_offset=None, memo=None):
         if extra == "noopt":
             debug_start("jit-log-noopt-bridge")
             debug_print("# bridge out of Guard",
                         "0x%x" % compute_unique_id(descr),
                         "with", len(operations), "ops")
-            logops = self._log_operations(inputargs, operations, ops_offset)
+            logops = self._log_operations(inputargs, operations, ops_offset,
+                                          memo)
             debug_stop("jit-log-noopt-bridge")
         elif extra == "rewritten":
             debug_start("jit-log-rewritten-bridge")
             debug_print("# bridge out of Guard",
                         "0x%x" % compute_unique_id(descr),
                         "with", len(operations), "ops")
-            logops = self._log_operations(inputargs, operations, ops_offset)
+            logops = self._log_operations(inputargs, operations, ops_offset,
+                                          memo)
             debug_stop("jit-log-rewritten-bridge")
         elif extra == "compiling":
             debug_start("jit-log-compiling-bridge")
-            logops = self._log_operations(inputargs, operations, ops_offset)
+            logops = self._log_operations(inputargs, operations, ops_offset,
+                                          memo)
             debug_stop("jit-log-compiling-bridge")
         else:
             debug_start("jit-log-opt-bridge")
             debug_print("# bridge out of Guard",
                         "0x%x" % r_uint(compute_unique_id(descr)),
                         "with", len(operations), "ops")
-            logops = self._log_operations(inputargs, operations, ops_offset)
+            logops = self._log_operations(inputargs, operations, ops_offset,
+                                          memo)
             debug_stop("jit-log-opt-bridge")
         return logops
 
-    def log_short_preamble(self, inputargs, operations):
+    def log_short_preamble(self, inputargs, operations, memo=None):
         debug_start("jit-log-short-preamble")
-        logops = self._log_operations(inputargs, operations, ops_offset=None)
+        logops = self._log_operations(inputargs, operations, ops_offset=None,
+                                      memo=memo)
         debug_stop("jit-log-short-preamble")
         return logops
 
-    def _log_operations(self, inputargs, operations, ops_offset):
+    def _log_operations(self, inputargs, operations, ops_offset, memo=None):
         if not have_debug_prints():
             return None
-        logops = self._make_log_operations()
-        logops._log_operations(inputargs, operations, ops_offset)
+        logops = self._make_log_operations(memo)
+        logops._log_operations(inputargs, operations, ops_offset, memo)
         return logops
 
-    def _make_log_operations(self):
-        return LogOperations(self.metainterp_sd, self.guard_number)
+    def _make_log_operations(self, memo):
+        return LogOperations(self.metainterp_sd, self.guard_number, memo)
 
     def repr_of_resop(self, op):
-        return LogOperations(self.metainterp_sd, 
self.guard_number).repr_of_resop(op)
+        # XXX fish the memo from somewhere
+        return LogOperations(self.metainterp_sd, self.guard_number,
+                             None).repr_of_resop(op)
 
 
 class LogOperations(object):
     """
-    ResOperation logger.  Each instance contains a memo giving numbers
-    to boxes, and is typically used to log a single loop.
+    ResOperation logger.
     """
-    def __init__(self, metainterp_sd, guard_number):
+    def __init__(self, metainterp_sd, guard_number, memo):
         self.metainterp_sd = metainterp_sd
         self.ts = metainterp_sd.cpu.ts
         self.guard_number = guard_number
-        self.memo = {}
+        if memo is None:
+            memo = {}
+        self.memo = memo
 
     def repr_of_descr(self, descr):
         return descr.repr_of_descr()
@@ -180,7 +193,8 @@
         return s_offset + res + op.getopname() + '(' + args + ')' + fail_args
 
 
-    def _log_operations(self, inputargs, operations, ops_offset=None):
+    def _log_operations(self, inputargs, operations, ops_offset=None,
+                        memo=None):
         if not have_debug_prints():
             return
         if ops_offset is None:
@@ -197,8 +211,8 @@
             offset = ops_offset[None]
             debug_print("+%d: --end of the loop--" % offset)
 
-    def log_loop(self, loop):
-        self._log_operations(loop.inputargs, loop.operations)
+    def log_loop(self, loop, memo=None):
+        self._log_operations(loop.inputargs, loop.operations, memo=memo)
 
 def int_could_be_an_address(x):
     if we_are_translated():
diff --git a/rpython/jit/metainterp/optimizeopt/__init__.py 
b/rpython/jit/metainterp/optimizeopt/__init__.py
--- a/rpython/jit/metainterp/optimizeopt/__init__.py
+++ b/rpython/jit/metainterp/optimizeopt/__init__.py
@@ -46,14 +46,16 @@
 
     return optimizations, unroll
 
-def optimize_trace(metainterp_sd, jitdriver_sd, compile_data):
+def optimize_trace(metainterp_sd, jitdriver_sd, memo, compile_data):
     """Optimize loop.operations to remove internal overheadish operations.
     """
     debug_start("jit-optimize")
     inputargs = compile_data.start_label.getarglist()
     try:
         metainterp_sd.logger_noopt.log_loop(inputargs,
-                                            compile_data.operations)
+                                            compile_data.operations,
+                                            memo)
+        compile_data.box_names_memo = memo
         optimizations, unroll = build_opt_chain(metainterp_sd,
                                                 compile_data.enable_opts)
         return compile_data.optimize(metainterp_sd, jitdriver_sd,
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py 
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -239,7 +239,6 @@
         self.metainterp_sd = metainterp_sd
         self.jitdriver_sd = jitdriver_sd
         self.cpu = metainterp_sd.cpu
-        self.logops = LogOperations(metainterp_sd, False)
         self.interned_refs = self.cpu.ts.new_ref_dict()
         self.interned_ints = {}
         self.resumedata_memo = resume.ResumeDataLoopMemo(metainterp_sd)
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py 
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -108,13 +108,14 @@
         if check_newops:
             assert not self.optimizer._newoperations
     
-    def optimize_preamble(self, start_label, end_label, ops, 
call_pure_results):
+    def optimize_preamble(self, start_label, end_label, ops, call_pure_results,
+                          memo):
         self._check_no_forwarding([[start_label, end_label], ops])
         info, newops = self.optimizer.propagate_all_forward(
             start_label.getarglist()[:], ops, call_pure_results, True,
             flush=False)
         exported_state = self.export_state(start_label, end_label.getarglist(),
-                                           info.inputargs)
+                                           info.inputargs, memo)
         exported_state.quasi_immutable_deps = info.quasi_immutable_deps
         # we need to absolutely make sure that we've cleaned up all
         # the optimization info
@@ -209,7 +210,7 @@
         return label_vs
 
     def optimize_bridge(self, start_label, operations, call_pure_results,
-                        inline_short_preamble):
+                        inline_short_preamble, box_names_memo):
         self._check_no_forwarding([start_label.getarglist(),
                                     operations])
         info, ops = self.optimizer.propagate_all_forward(
@@ -241,7 +242,7 @@
             return self.jump_to_preamble(cell_token, jump_op, info)
         exported_state = self.export_state(start_label,
                                            operations[-1].getarglist(),
-                                           info.inputargs)
+                                           info.inputargs, box_names_memo)
         exported_state.quasi_immutable_deps = 
self.optimizer.quasi_immutable_deps
         self.optimizer._clean_optimization_info(self.optimizer._newoperations)
         return exported_state, self.optimizer._newoperations
@@ -345,7 +346,8 @@
             for op in short:
                 op.set_forwarded(None)
 
-    def export_state(self, start_label, original_label_args, 
renamed_inputargs):
+    def export_state(self, start_label, original_label_args, renamed_inputargs,
+                     memo):
         end_args = [self.optimizer.force_box_for_end_of_preamble(a)
                     for a in original_label_args]
         self.optimizer.flush()
@@ -370,7 +372,7 @@
         self.optimizer._clean_optimization_info(start_label.getarglist())
         return ExportedState(label_args, end_args, virtual_state, infos,
                              short_boxes, renamed_inputargs,
-                             short_inputargs)
+                             short_inputargs, memo)
 
     def import_state(self, targetop, exported_state):
         # the mapping between input args (from old label) and what we need
@@ -447,7 +449,7 @@
     
     def __init__(self, end_args, next_iteration_args, virtual_state,
                  exported_infos, short_boxes, renamed_inputargs,
-                 short_inputargs):
+                 short_inputargs, memo):
         self.end_args = end_args
         self.next_iteration_args = next_iteration_args
         self.virtual_state = virtual_state
@@ -455,11 +457,10 @@
         self.short_boxes = short_boxes
         self.renamed_inputargs = renamed_inputargs
         self.short_inputargs = short_inputargs
-        self.dump()
+        self.dump(memo)
 
-    def dump(self):
+    def dump(self, memo):
         debug_start("jit-log-exported-state")
-        memo = {}
         debug_print("[" + ", ".join([x.repr_short(memo) for x in 
self.next_iteration_args]) + "]")
         for box in self.short_boxes:
             debug_print("  " + box.repr(memo))
diff --git a/rpython/jit/metainterp/pyjitpl.py 
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1884,6 +1884,8 @@
         self.call_ids = []
         self.current_call_id = 0
 
+        self.box_names_memo = {}
+
     def retrace_needed(self, trace, exported_state):
         self.partial_trace = trace
         self.retracing_from = len(self.history.operations) - 1
@@ -2206,11 +2208,11 @@
         else:
             greenkey = self.current_merge_points[0][0][:jd_sd.num_green_args]
             self.staticdata.warmrunnerdesc.hooks.on_abort(reason,
-                                                          jd_sd.jitdriver,
-                                                          greenkey,
-                                                          
jd_sd.warmstate.get_location_str(greenkey),
-                                                          
self.staticdata.logger_ops._make_log_operations(),
-                                                          
self.history.operations)
+                    jd_sd.jitdriver, greenkey,
+                    jd_sd.warmstate.get_location_str(greenkey),
+                    self.staticdata.logger_ops._make_log_operations(
+                        self.box_names_memo),
+                    self.history.operations)
         self.staticdata.stats.aborted()
 
     def blackhole_if_trace_too_long(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to