Author: Carl Friedrich Bolz <cfb...@gmx.de>
Branch: optinfo-into-bridges
Changeset: r87803:769bf5d902c4
Date: 2016-10-14 14:38 +0200
http://bitbucket.org/pypy/pypy/changeset/769bf5d902c4/

Log:    a random test (had to change to 6 bits in the process, because
        resumecode uses 1 bit for extension bytes and 1 bit for the sign)

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
@@ -55,8 +55,8 @@
             liveboxes_set[box] = None
     metainterp_sd = optimizer.metainterp_sd
 
+    # class knowledge
     numb_state.grow(len(liveboxes)) # bit too much
-    # class knowledge
     bitfield = 0
     shifts = 0
     for box in liveboxes:
@@ -67,11 +67,11 @@
         bitfield <<= 1
         bitfield |= known_class
         shifts += 1
-        if shifts == 7:
+        if shifts == 6:
             numb_state.append_int(bitfield)
             bitfield = shifts = 0
     if shifts:
-        numb_state.append_int(bitfield << (7 - shifts))
+        numb_state.append_int(bitfield << (6 - shifts))
 
     # heap knowledge
     if optimizer.optheap:
@@ -105,7 +105,7 @@
             continue
         if not mask:
             bitfield, index = numb_next_item(numb, index)
-            mask = 0b1000000
+            mask = 0b100000
         class_known = bitfield & mask
         mask >>= 1
         if class_known:
diff --git a/rpython/jit/metainterp/test/test_bridgeopt.py 
b/rpython/jit/metainterp/test/test_bridgeopt.py
--- a/rpython/jit/metainterp/test/test_bridgeopt.py
+++ b/rpython/jit/metainterp/test/test_bridgeopt.py
@@ -1,5 +1,6 @@
 # tests that check that information is fed from the optimizer into the bridges
 
+import math
 from rpython.rlib import jit
 from rpython.jit.metainterp.test.support import LLJitMixin
 from rpython.jit.metainterp.optimizeopt.bridgeopt import 
serialize_optimizer_knowledge
@@ -8,6 +9,8 @@
 from rpython.jit.metainterp.resume import NumberingState
 from rpython.jit.metainterp.optimizeopt.info import InstancePtrInfo
 
+from hypothesis import strategies, given
+
 class FakeTS(object):
     def __init__(self, dct):
         self.dct = dct
@@ -42,7 +45,7 @@
     def __init__(self, numb):
         self.rd_numb = numb
 
-def test_simple():
+def test_known_classes():
     box1 = InputArgRef()
     box2 = InputArgRef()
     box3 = InputArgRef()
@@ -52,12 +55,12 @@
     optimizer = FakeOptimizer(dct)
 
     numb_state = NumberingState(4)
-    numb_state.append_int(1) # vinfo
+    numb_state.append_int(1) # size of resume block
     liveboxes = [InputArgInt(), box2, box1, box3]
 
     serialize_optimizer_knowledge(optimizer, numb_state, liveboxes, {}, None)
 
-    assert numb_state.current[:numb_state._pos] == [1, 0b0100000, 0]
+    assert numb_state.current[:numb_state._pos] == [1, 0b010000, 0]
 
     rbox1 = InputArgRef()
     rbox2 = InputArgRef()
@@ -71,6 +74,41 @@
     assert box3 not in after_optimizer.constant_classes
 
 
+box_strategy = strategies.builds(InputArgInt) | strategies.builds(InputArgRef)
+tuples = strategies.tuples(box_strategy, strategies.booleans()).filter(
+        lambda (box, known_class): isinstance(box, InputArgRef) or not 
known_class)
+boxes_known_classes = strategies.lists(tuples, min_size=1)
+
+@given(boxes_known_classes)
+def test_random_class_knowledge(boxes_known_classes):
+    cls = FakeClass()
+    dct1 = {box: InstancePtrInfo(known_class=cls)
+              for box, known_class in boxes_known_classes
+                  if known_class}
+    optimizer = FakeOptimizer(dct1)
+
+    refboxes = [box for (box, _) in boxes_known_classes
+                    if isinstance(box, InputArgRef)]
+
+    numb_state = NumberingState(1)
+    numb_state.append_int(1) # size of resume block
+    liveboxes = [box for (box, _) in boxes_known_classes]
+
+    serialize_optimizer_knowledge(optimizer, numb_state, liveboxes, {}, None)
+
+    #assert numb_state.current[:numb_state._pos] == [1, 0b0100000, 0]
+    assert len(numb_state.create_numbering().code) == 2 + 
math.ceil(len(refboxes) / 6.0)
+
+    dct = {box: cls
+              for box, known_class in boxes_known_classes
+                  if known_class}
+    after_optimizer = FakeOptimizer(cpu=FakeCPU(dct))
+    deserialize_optimizer_knowledge(
+        after_optimizer, FakeStorage(numb_state.create_numbering()),
+        liveboxes, liveboxes)
+    for box, known_class in boxes_known_classes:
+        assert (box in after_optimizer.constant_classes) == known_class
+
 class TestOptBridge(LLJitMixin):
     # integration tests
     def test_bridge_guard_class(self):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to