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