Author: fijal
Branch: jit-leaner-frontend
Changeset: r83289:231f68c404dc
Date: 2016-03-23 10:43 +0200
http://bitbucket.org/pypy/pypy/changeset/231f68c404dc/
Log: finish whacking at test_resume
diff --git a/rpython/jit/metainterp/opencoder.py
b/rpython/jit/metainterp/opencoder.py
--- a/rpython/jit/metainterp/opencoder.py
+++ b/rpython/jit/metainterp/opencoder.py
@@ -1,10 +1,9 @@
""" Storage format:
for each operation (inputargs numbered with negative numbers)
-<opnum> [size-if-unknown-arity] [<arg0> <arg1> ...] [descr] [potential
snapshot]
-snapshot is as follows
-<total size of snapshot> <virtualizable size> <virtualizable boxes>
-<virtualref size> <virtualref boxes> [<size> <jitcode> <pc> <boxes...> ...]
+<opnum> [size-if-unknown-arity] [<arg0> <arg1> ...] [descr-or-snapshot-index]
+
+Snapshot index for guards points to snapshot stored in _snapshots of trace
"""
from rpython.jit.metainterp.history import ConstInt, Const, ConstFloat,
ConstPtr
@@ -24,6 +23,9 @@
MIN_SHORT = -2**15 + 1
MAX_SHORT = 2**15 - 1
+class TagOverflow(Exception):
+ pass
+
class BaseTrace(object):
pass
@@ -76,6 +78,8 @@
self.metainterp_sd = metainterp_sd
self._cache = [None] * trace._count
if force_inputargs is not None:
+ # the trace here is cut and we're working from
+ # inputargs that are in the middle, shuffle stuff around a bit
self.inputargs = [rop.inputarg_from_tp(arg.type) for
arg in force_inputargs]
for i, arg in enumerate(force_inputargs):
@@ -251,7 +255,8 @@
if self._pos >= len(self._ops):
# grow by 2X
self._ops = self._ops + [rffi.cast(rffi.SHORT, -15)] *
len(self._ops)
- assert MIN_SHORT < v < MAX_SHORT
+ if not MIN_SHORT < v < MAX_SHORT:
+ raise TagOverflow
self._ops[self._pos] = rffi.cast(rffi.SHORT, v)
self._pos += 1
@@ -305,14 +310,10 @@
self._bigints.append(box.getint())
return tag(TAGCONSTOTHER, v)
elif isinstance(box, ConstFloat):
+ # don't intern float constants
self._consts_float += 1
- v = self._floats_dict.get(box.getfloat(), -1)
- if v == -1:
- v = (len(self._floats) << 1) | 1
- # XXX the next line is bogus, can't use a float as
- # dict key. Must convert it first to a longlong
- self._floats_dict[box.getfloat()] = v
- self._floats.append(box.getfloat())
+ v = (len(self._floats) << 1) | 1
+ self._floats.append(box.getfloat())
return tag(TAGCONSTOTHER, v)
else:
self._consts_ptr += 1
@@ -343,6 +344,8 @@
for box in argboxes:
self.append(self._encode(box))
if opwithdescr[opnum]:
+ # note that for guards we always store 0 which is later
+ # patched during capture_resumedata
if descr is None:
self.append(0)
else:
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
@@ -23,12 +23,12 @@
from rpython.jit.metainterp import executor
from rpython.jit.codewriter import heaptracker, longlong
from rpython.jit.metainterp.resoperation import ResOperation, rop
-from rpython.jit.metainterp.test.strategies import boxlists
from rpython.rlib.debug import debug_start, debug_stop, debug_print,\
have_debug_prints
+from rpython.jit.metainterp.test.strategies import intconsts
from rpython.jit.metainterp import resumecode
-from hypothesis import given
+from hypothesis import given, strategies
class Storage:
rd_frame_info_list = None
@@ -40,6 +40,9 @@
class FakeOptimizer(object):
+ def __init__(self, trace=None):
+ self.trace = trace
+
def get_box_replacement(self, op):
while (op.get_forwarded() is not None and
not isinstance(op.get_forwarded(), info.AbstractInfo)):
@@ -184,7 +187,10 @@
def execute_and_record(self, opnum, descr, *argboxes):
resvalue = executor.execute(self.cpu, None, opnum, descr, *argboxes)
- op = ResOperation(opnum, list(argboxes), descr=descr)
+ if isinstance(resvalue, int):
+ op = IntFrontendOp(0)
+ else:
+ op = RefFrontendOp(0)
setvalue(op, resvalue)
self.trace.append((opnum, list(argboxes), resvalue, descr))
return op
@@ -924,22 +930,27 @@
2, 1, tag(3, TAGINT), tag(0, TAGVIRTUAL), tag(0, TAGBOX), tag(3,
TAGINT)
] + [0, 0]
-@given(boxlists)
+@given(strategies.lists(strategies.builds(IntFrontendOp, strategies.just(0)) |
intconsts,
+ min_size=1))
def test_ResumeDataLoopMemo_random(lst):
- t = Trace()
+ inpargs = [box for box in lst if not isinstance(box, Const)]
+ t = Trace(inpargs)
t.append(0)
- s = t.create_top_snapshot(FakeJitCode("", 0), 1, Frame([]), lst, [])
- s = TopSnapshot(None, [], lst)
- frameinfo = FrameInfo(None, FakeJitCode("foo", 0), 0)
- memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- num, liveboxes, v = memo.number(FakeOptimizer(), s, frameinfo)
+ metainterp_sd = FakeMetaInterpStaticData()
+ i = t.get_iter(metainterp_sd)
+ t.create_top_snapshot(FakeJitCode("", 0), 0, Frame(lst), False, [], [])
+ memo = ResumeDataLoopMemo(metainterp_sd)
+ num, liveboxes, v = memo.number(FakeOptimizer(), 0, i)
l = unpack_numbering(num)
- assert l[-1] == 0
- assert l[0] == len(lst)
+ assert l[0] == 0
+ assert l[1] == 0
+ assert l[2] == 0
+ assert l[3] == 0
+ mapping = dict(zip(inpargs, i.inputargs))
for i, item in enumerate(lst):
- v, tag = untag(l[i + 1])
+ v, tag = untag(l[i + 4])
if tag == TAGBOX:
- assert l[i + 1] == liveboxes[item]
+ assert l[i + 4] == liveboxes[mapping[item]]
elif tag == TAGCONST:
assert memo.consts[v].getint() == item.getint()
elif tag == TAGINT:
@@ -947,7 +958,7 @@
def test_ResumeDataLoopMemo_number_boxes():
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- b1, b2 = [InputArgInt(), InputArgInt()]
+ b1, b2 = [IntFrontendOp(0), IntFrontendOp(0)]
assert memo.num_cached_boxes() == 0
boxes = []
num = memo.assign_number_to_box(b1, boxes)
@@ -976,7 +987,7 @@
def test_ResumeDataLoopMemo_number_virtuals():
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- b1, b2 = [InputArgInt(), InputArgInt()]
+ b1, b2 = [IntFrontendOp(0), IntFrontendOp(0)]
assert memo.num_cached_virtuals() == 0
num = memo.assign_number_to_virtual(b1)
assert num == -1
@@ -996,9 +1007,9 @@
assert memo.num_cached_virtuals() == 0
def test_register_virtual_fields():
- b1, b2 = InputArgInt(), InputArgInt()
- vbox = InputArgRef()
- modifier = ResumeDataVirtualAdder(FakeOptimizer(), None, None, None)
+ b1, b2 = IntFrontendOp(0), IntFrontendOp(1)
+ vbox = RefFrontendOp(2)
+ modifier = ResumeDataVirtualAdder(FakeOptimizer(), None, None, None, None)
modifier.liveboxes_from_env = {}
modifier.liveboxes = {}
modifier.vfieldboxes = {}
@@ -1007,7 +1018,7 @@
b2: UNASSIGNED}
assert modifier.vfieldboxes == {vbox: [b1, b2]}
- modifier = ResumeDataVirtualAdder(FakeOptimizer(), None, None, None)
+ modifier = ResumeDataVirtualAdder(FakeOptimizer(), None, None, None, None)
modifier.liveboxes_from_env = {vbox: tag(0, TAGVIRTUAL)}
modifier.liveboxes = {}
modifier.vfieldboxes = {}
@@ -1025,48 +1036,55 @@
return newboxes
def make_storage(b1, b2, b3):
+ t = Trace([box for box in [b1, b2, b3] if not isinstance(box, Const)])
+ t.append(0)
storage = Storage()
- snapshot = Snapshot(None, [b1, ConstInt(1), b1, b2])
- snapshot = Snapshot(snapshot, [ConstInt(2), ConstInt(3)])
- snapshot = Snapshot(snapshot, [b1, b2, b3])
- top_snapshot = TopSnapshot(snapshot, [], [])
- frameinfo = FrameInfo(FrameInfo(FrameInfo(None, FakeJitCode("code1", 21),
22),
- FakeJitCode("code2", 31), 32), FakeJitCode("code3", 41), 42)
- storage.rd_snapshot = top_snapshot
- storage.rd_frame_info_list = frameinfo
- return storage
+ snap1 = t.create_snapshot(FakeJitCode("code3", 41), 42,
+ Frame([b1, ConstInt(1), b1, b2]), False)
+ snap2 = t.create_snapshot(FakeJitCode("code2", 31), 32,
+ Frame([ConstInt(2), ConstInt(3)]), False)
+ snap3 = t.create_top_snapshot(FakeJitCode("code1", 21), 22,
+ Frame([b1, b2, b3]), False, [], [])
+ snap3.prev = snap2
+ snap2.prev = snap1
+ storage.rd_resume_position = 0
+ return storage, t
def test_virtual_adder_int_constants():
b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**16), ConstInt(-65)]
- storage = make_storage(b1s, b2s, b3s)
- memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(FakeOptimizer(), storage, storage, memo)
- liveboxes = modifier.finish(FakeOptimizer())
- assert storage.rd_snapshot is None
+ storage, t = make_storage(b1s, b2s, b3s)
+ metainterp_sd = FakeMetaInterpStaticData()
+ memo = ResumeDataLoopMemo(metainterp_sd)
+ i = t.get_iter(metainterp_sd)
+ modifier = ResumeDataVirtualAdder(FakeOptimizer(i), storage, storage, i,
memo)
+ liveboxes = modifier.finish(FakeOptimizer(i))
cpu = MyCPU([])
reader = ResumeDataDirectReader(MyMetaInterp(cpu), storage, "deadframe")
reader.consume_vref_and_vable(None, None, None)
reader.cur_index += 2 # framestack
- _next_section(reader, sys.maxint, 2**16, -65)
+ _next_section(reader, sys.maxint, 1, sys.maxint, 2**16)
reader.cur_index += 2 # framestack
_next_section(reader, 2, 3)
reader.cur_index += 2 # framestack
- _next_section(reader, sys.maxint, 1, sys.maxint, 2**16)
+ _next_section(reader, sys.maxint, 2**16, -65)
def test_virtual_adder_memo_const_sharing():
b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**16), ConstInt(-65)]
- storage = make_storage(b1s, b2s, b3s)
- memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(FakeOptimizer(), storage, storage, memo)
- modifier.finish(FakeOptimizer())
+ storage, t = make_storage(b1s, b2s, b3s)
+ metainterp_sd = FakeMetaInterpStaticData()
+ memo = ResumeDataLoopMemo(metainterp_sd)
+ i = t.get_iter(metainterp_sd)
+ modifier = ResumeDataVirtualAdder(FakeOptimizer(i), storage, storage, i,
memo)
+ modifier.finish(FakeOptimizer(i))
assert len(memo.consts) == 2
assert storage.rd_consts is memo.consts
b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**17), ConstInt(-65)]
- storage2 = make_storage(b1s, b2s, b3s)
- modifier2 = ResumeDataVirtualAdder(FakeOptimizer(), storage2, storage2,
- memo)
- modifier2.finish(FakeOptimizer())
+ storage2, t = make_storage(b1s, b2s, b3s)
+ i = t.get_iter(metainterp_sd)
+ modifier2 = ResumeDataVirtualAdder(FakeOptimizer(i), storage2, storage2,
+ i, memo)
+ modifier2.finish(FakeOptimizer(i))
assert len(memo.consts) == 3
assert storage2.rd_consts is memo.consts
@@ -1173,12 +1191,12 @@
def test_virtual_adder_make_virtual():
- b2s, b3s, b4s, b5s = [InputArgRef(), InputArgInt(3), InputArgRef(),
- InputArgRef()]
+ b2s, b3s, b4s, b5s = [IntFrontendOp(0), IntFrontendOp(0), RefFrontendOp(0),
+ RefFrontendOp(0)]
c1s = ConstInt(111)
storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(FakeOptimizer(), storage, storage, memo)
+ modifier = ResumeDataVirtualAdder(FakeOptimizer(), storage, storage, None,
memo)
modifier.liveboxes_from_env = {}
modifier.liveboxes = {}
modifier.vfieldboxes = {}
@@ -1204,7 +1222,9 @@
storage.rd_consts = memo.consts[:]
storage.rd_numb = None
# resume
- b3t, b5t = [InputArgInt(33), InputArgRef(demo55o)]
+ b3t, b5t = [IntFrontendOp(0), RefFrontendOp(0)]
+ b5t.setref_base(demo55o)
+ b3t.setint(33)
newboxes = _resume_remap(liveboxes, [#b2s -- virtual
b3s,
#b4s -- virtual
@@ -1253,11 +1273,12 @@
del Const.__eq__
def test_virtual_adder_make_varray():
- b2s, b4s = [InputArgRef(), InputArgInt(4)]
+ b2s, b4s = [IntFrontendOp(0), IntFrontendOp(0)]
+ b4s.setint(4)
c1s = ConstInt(111)
storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(FakeOptimizer(), storage, storage, memo)
+ modifier = ResumeDataVirtualAdder(FakeOptimizer(), storage, storage, None,
memo)
modifier.liveboxes_from_env = {}
modifier.liveboxes = {}
modifier.vfieldboxes = {}
@@ -1272,7 +1293,10 @@
storage.rd_consts = memo.consts[:]
storage.rd_numb = None
# resume
- b1t, b3t, b4t = [InputArgInt(11), InputArgInt(33), InputArgInt(44)]
+ b1t, b3t, b4t = [IntFrontendOp(0), IntFrontendOp(0), IntFrontendOp(0)]
+ b1t.setint(11)
+ b3t.setint(33)
+ b4t.setint(44)
newboxes = _resume_remap(liveboxes, [#b2s -- virtual
b4s],
b4t)
@@ -1302,11 +1326,11 @@
def test_virtual_adder_make_vstruct():
- b2s, b4s = [InputArgRef(), InputArgRef()]
+ b2s, b4s = [RefFrontendOp(0), RefFrontendOp(0)]
c1s = ConstInt(111)
storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(FakeOptimizer(), storage, storage, memo)
+ modifier = ResumeDataVirtualAdder(FakeOptimizer(), storage, storage, None,
memo)
modifier.liveboxes_from_env = {}
modifier.liveboxes = {}
modifier.vfieldboxes = {}
@@ -1321,7 +1345,7 @@
dump_storage(storage, liveboxes)
storage.rd_consts = memo.consts[:]
storage.rd_numb = None
- b4t = InputArgRef()
+ b4t = RefFrontendOp(0)
newboxes = _resume_remap(liveboxes, [#b2s -- virtual
b4s], b4t)
#
@@ -1349,10 +1373,10 @@
def test_virtual_adder_pending_fields():
- b2s, b4s = [InputArgRef(), InputArgRef()]
+ b2s, b4s = [RefFrontendOp(0), RefFrontendOp(0)]
storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(None, storage, storage, memo)
+ modifier = ResumeDataVirtualAdder(None, storage, storage, None, memo)
modifier.liveboxes_from_env = {}
modifier.liveboxes = {}
modifier.vfieldboxes = {}
@@ -1369,8 +1393,10 @@
storage.rd_numb = None
# resume
demo55.next = lltype.nullptr(LLtypeMixin.NODE)
- b2t = InputArgRef(demo55o)
- b4t = InputArgRef(demo66o)
+ b2t = RefFrontendOp(0)
+ b2t.setref_base(demo55o)
+ b4t = RefFrontendOp(0)
+ b4t.setref_base(demo66o)
newboxes = _resume_remap(liveboxes, [b2s, b4s], b2t, b4t)
metainterp = MyMetaInterp()
@@ -1389,7 +1415,7 @@
class Storage(object):
pass
storage = Storage()
- modifier = ResumeDataVirtualAdder(None, storage, storage, None)
+ modifier = ResumeDataVirtualAdder(None, storage, storage, None, None)
modifier._add_pending_fields(None, [])
assert not storage.rd_pendingfields
#
@@ -1398,9 +1424,9 @@
return False
field_a = FieldDescr()
storage = Storage()
- modifier = ResumeDataVirtualAdder(None, storage, storage, None)
- a = InputArgInt()
- b = InputArgInt()
+ modifier = ResumeDataVirtualAdder(None, storage, storage, None, None)
+ a = IntFrontendOp(0)
+ b = IntFrontendOp(0)
modifier.liveboxes_from_env = {a: rffi.cast(rffi.SHORT, 1042),
b: rffi.cast(rffi.SHORT, 1061)}
modifier._add_pending_fields(FakeOptimizer(), [
@@ -1416,11 +1442,11 @@
#
array_a = FieldDescr()
storage = Storage()
- modifier = ResumeDataVirtualAdder(None, storage, storage, None)
- a42 = InputArgInt()
- a61 = InputArgInt()
- a62 = InputArgInt()
- a63 = InputArgInt()
+ modifier = ResumeDataVirtualAdder(None, storage, storage, None, None)
+ a42 = IntFrontendOp(0)
+ a61 = IntFrontendOp(0)
+ a62 = IntFrontendOp(0)
+ a63 = IntFrontendOp(0)
modifier.liveboxes_from_env = {a42: rffi.cast(rffi.SHORT, 1042),
a61: rffi.cast(rffi.SHORT, 1061),
a62: rffi.cast(rffi.SHORT, 1062),
@@ -1508,7 +1534,7 @@
metainterp_sd = FakeMetaInterpStaticData()
metainterp_sd.options = options
memo = ResumeDataLoopMemo(metainterp_sd)
- modifier = ResumeDataVirtualAdder(None, None, None, memo)
+ modifier = ResumeDataVirtualAdder(None, None, None, None, memo)
for i in range(5):
assert not modifier._invalidation_needed(5, i)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit