[pypy-commit] pypy optinfo-into-bridges: fix a number of problems found by other tests

cfbolz pypy.commits at gmail.com
Thu Oct 13 06:30:28 EDT 2016


Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: optinfo-into-bridges
Changeset: r87749:d084b574cb5a
Date: 2016-10-13 12:29 +0200
http://bitbucket.org/pypy/pypy/changeset/d084b574cb5a/

Log:	fix a number of problems found by other tests

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
@@ -1072,6 +1072,8 @@
     if metainterp.history.ends_with_jump:
         if isinstance(resumekey, ResumeGuardCopiedDescr):
             key = resumekey.prev
+        elif isinstance(resumekey, ResumeFromInterpDescr):
+            key = None
         else:
             key = resumekey
         data = BridgeCompileData(trace, runtime_boxes, key,
diff --git a/rpython/jit/metainterp/optimizeopt/bridgeopt.py b/rpython/jit/metainterp/optimizeopt/bridgeopt.py
--- a/rpython/jit/metainterp/optimizeopt/bridgeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/bridgeopt.py
@@ -50,6 +50,8 @@
 
 def serialize_optimizer_knowledge(optimizer, numb_state, liveboxes, liveboxes_from_env, memo):
     liveboxes_set = set(liveboxes)
+    if None in liveboxes_set:
+        liveboxes_set.remove(None)
     metainterp_sd = optimizer.metainterp_sd
 
     numb_state.grow(len(liveboxes)) # bit too much
@@ -57,7 +59,7 @@
     bitfield = 0
     shifts = 0
     for box in liveboxes:
-        if box.type != "r":
+        if box is None or box.type != "r":
             continue
         info = optimizer.getptrinfo(box)
         known_class = info is not None and info.get_known_class(optimizer.cpu) is not None
@@ -83,7 +85,8 @@
         numb_state.grow(1)
         numb_state.append_int(0)
 
-def deserialize_optimizer_knowledge(optimizer, resumestorage, runtime_boxes, liveboxes):
+def deserialize_optimizer_knowledge(optimizer, resumestorage, frontend_boxes, liveboxes):
+    assert len(frontend_boxes) == len(liveboxes)
     numb = resumestorage.rd_numb
     metainterp_sd = optimizer.metainterp_sd
 
@@ -102,7 +105,7 @@
         class_known = bitfield & mask
         mask >>= 1
         if class_known:
-            cls = optimizer.cpu.ts.cls_of_box(runtime_boxes[i])
+            cls = optimizer.cpu.ts.cls_of_box(frontend_boxes[i])
             optimizer.make_constant_class(box, cls)
 
     # heap knowledge
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebridge.py
@@ -30,6 +30,7 @@
         self.add_guard_future_condition(bridge)
         trace = oparser.convert_loop_to_trace(bridge, FakeMetaInterpStaticData(self.cpu))
         data = compile.BridgeCompileData(trace, self.convert_values(bridge.operations[-1].getarglist(), bridge_values),
+                                         None,
                                          enable_opts=self.enable_opts,
                             inline_short_preamble=inline_short_preamble)
         bridge_info, ops = self._do_optimize_loop(data)
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
@@ -239,11 +239,13 @@
     def optimize_bridge(self, trace, runtime_boxes, call_pure_results,
                         inline_short_preamble, box_names_memo, resumestorage):
         from rpython.jit.metainterp.optimizeopt.bridgeopt import deserialize_optimizer_knowledge
+        frontend_inputargs = trace.inputargs
         trace = trace.get_iter()
         self._check_no_forwarding([trace.inputargs])
-        deserialize_optimizer_knowledge(self.optimizer,
-                                        resumestorage, runtime_boxes,
-                                        trace.inputargs)
+        if resumestorage:
+            deserialize_optimizer_knowledge(self.optimizer,
+                                            resumestorage, frontend_inputargs,
+                                            trace.inputargs)
         info, ops = self.optimizer.propagate_all_forward(trace,
             call_pure_results, False)
         jump_op = info.jump_op
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -190,7 +190,7 @@
         item = self._pos
         short = rffi.cast(rffi.SHORT, item)
         assert rffi.cast(lltype.Signed, short) == item
-        self.current[index] = item
+        self.current[index] = short
 
 class ResumeDataLoopMemo(object):
 
diff --git a/rpython/jit/metainterp/test/test_resume.py b/rpython/jit/metainterp/test/test_resume.py
--- a/rpython/jit/metainterp/test/test_resume.py
+++ b/rpython/jit/metainterp/test/test_resume.py
@@ -40,6 +40,9 @@
 
 
 class FakeOptimizer(object):
+    metainterp_sd = None
+    optheap = None
+
     def __init__(self, trace=None):
         self.trace = trace
 
@@ -1115,7 +1118,7 @@
         class MyInfo:
             @staticmethod
             def enumerate_vars(callback_i, callback_r, callback_f, _, index):
-                while index < len(self.numb.code):
+                while index < max_index:
                     tagged, _ = resumecode.numb_next_item(self.numb, index)
                     _, tag = untag(tagged)
                     if tag == TAGVIRTUAL:
@@ -1132,7 +1135,9 @@
                     else:
                         assert 0
 
-        size, self.cur_index = resumecode.numb_next_item(self.numb, 0)
+        size_section, self.cur_index = resumecode.numb_next_item(self.numb, 0)
+        max_index = resumecode.numb_next_n_items(self.numb, size_section, 0)
+        size, self.cur_index = resumecode.numb_next_item(self.numb, self.cur_index)
         assert size == 0
         size, self.cur_index = resumecode.numb_next_item(self.numb, self.cur_index)
         assert size == 0


More information about the pypy-commit mailing list