[pypy-commit] pypy jit-leaner-frontend: write snapshot iterator
fijal
pypy.commits at gmail.com
Fri Mar 4 05:15:16 EST 2016
Author: fijal
Branch: jit-leaner-frontend
Changeset: r82684:b00c49bd7e47
Date: 2016-03-04 12:14 +0200
http://bitbucket.org/pypy/pypy/changeset/b00c49bd7e47/
Log: write snapshot iterator
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
@@ -15,6 +15,29 @@
class Sentinel(object):
pass
+class SnapshotIterator(object):
+ def __init__(self, main_iter, pos, end_pos):
+ self.trace = main_iter.trace
+ self.main_iter = main_iter
+ self.end = end_pos
+ self.pos = pos
+
+ def done(self):
+ return self.pos >= self.end
+
+ def _next(self):
+ res = self.trace._ops[self.pos]
+ self.pos += 1
+ return res
+
+ def next(self):
+ r = self.main_iter._get(self._next())
+ assert r
+ return r
+
+ def get_size_jitcode_pc(self):
+ return self._next(), self._next(), self._next()
+
class TraceIterator(object):
def __init__(self, trace, end):
self.trace = trace
@@ -56,6 +79,10 @@
self.pos = self._next()
return pos
+ def get_snapshot_iter(self, pos):
+ end = self.trace._ops[pos]
+ return SnapshotIterator(self, pos + 1, end)
+
def next(self):
opnum = self._next()
if oparity[opnum] == -1:
@@ -75,7 +102,7 @@
descr = None
res = ResOperation(opnum, args, -1, descr=descr)
if rop.is_guard(opnum):
- res.rd_snapshot_position = self.skip_resume_data()
+ res.rd_resume_position = self.skip_resume_data()
self._cache[self._count] = res
self._count += 1
return res
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
@@ -507,6 +507,7 @@
def propagate_all_forward(self, trace, call_pure_results=None, flush=True):
trace = trace.get_iter()
+ self.trace = trace
self.call_pure_results = call_pure_results
while not trace.done():
self._really_emitted_operation = None
@@ -691,7 +692,7 @@
op.setdescr(descr)
assert isinstance(descr, compile.ResumeGuardDescr)
assert isinstance(op, GuardResOp)
- modifier = resume.ResumeDataVirtualAdder(self, descr, op,
+ modifier = resume.ResumeDataVirtualAdder(self, descr, op, self.trace,
self.resumedata_memo)
try:
newboxes = modifier.finish(self, pendingfields)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -14,62 +14,6 @@
from rpython.rlib.rarithmetic import LONG_BIT
from rpython.jit.tool.oparser import parse
-class FakeJitCode(object):
- index = 0
-
-def test_store_final_boxes_in_guard():
- py.test.skip("needs to be rewritten")
- from rpython.jit.metainterp.compile import ResumeGuardDescr
- from rpython.jit.metainterp.resume import tag, TAGBOX
- b0 = InputArgInt()
- b1 = InputArgInt()
- opt = optimizeopt.Optimizer(FakeMetaInterpStaticData(LLtypeMixin.cpu),
- None, None)
- op = ResOperation(rop.GUARD_TRUE, [ConstInt(1)], None)
- # setup rd data
- fi0 = resume.FrameInfo(None, FakeJitCode(), 11)
- snapshot0 = resume.Snapshot(None, [b0])
- op.rd_snapshot = resume.TopSnapshot(snapshot0, [], [b1])
- op.rd_frame_info_list = resume.FrameInfo(fi0, FakeJitCode(), 33)
- #
- opt.store_final_boxes_in_guard(op, [])
- fdescr = op.getdescr()
- if op.getfailargs() == [b0, b1]:
- assert list(fdescr.rd_numb.nums) == [tag(1, TAGBOX)]
- assert list(fdescr.rd_numb.prev.nums) == [tag(0, TAGBOX)]
- else:
- assert op.getfailargs() == [b1, b0]
- assert list(fdescr.rd_numb.nums) == [tag(0, TAGBOX)]
- assert list(fdescr.rd_numb.prev.nums) == [tag(1, TAGBOX)]
- assert fdescr.rd_virtuals is None
- assert fdescr.rd_consts == []
-
-def test_sharing_field_lists_of_virtual():
- py.test.skip("needs to be rewritten")
- class FakeOptimizer(object):
- class optimizer(object):
- class cpu(object):
- pass
- opt = FakeOptimizer()
- virt1 = virtualize.AbstractVirtualStructValue(opt, None)
- lst1 = virt1._get_field_descr_list()
- assert lst1 == []
- lst2 = virt1._get_field_descr_list()
- assert lst1 is lst2
- virt1.setfield(LLtypeMixin.valuedescr, optimizeopt.OptValue(None))
- lst3 = virt1._get_field_descr_list()
- assert lst3 == [LLtypeMixin.valuedescr]
- lst4 = virt1._get_field_descr_list()
- assert lst3 is lst4
-
- virt2 = virtualize.AbstractVirtualStructValue(opt, None)
- lst5 = virt2._get_field_descr_list()
- assert lst5 is lst1
- virt2.setfield(LLtypeMixin.valuedescr, optimizeopt.OptValue(None))
- lst6 = virt1._get_field_descr_list()
- assert lst6 is lst3
-
-
# ____________________________________________________________
@@ -78,16 +22,17 @@
enable_opts = "intbounds:rewrite:virtualize:string:earlyforce:pure:heap"
def optimize_loop(self, ops, optops, call_pure_results=None):
- loop = self.parse(ops, postprocess=self.postprocess)
+ loop = self.parse(ops)
token = JitCellToken()
- label_op = None # loop.record_op(rop.LABEL, loop.inputargs,
- # descr=TargetToken(token))
- #if loop.operations[-1].getopnum() == rop.JUMP:
- # loop.operations[-1].setdescr(token)
+ label_op = ResOperation(rop.LABEL, loop.inputargs, -1,
+ descr=TargetToken(token))
+ if loop.operations[-1].getopnum() == rop.JUMP:
+ loop.operations[-1].setdescr(token)
exp = parse(optops, namespace=self.namespace.copy())
- #expected = convert_old_style_to_targets(exp, jump=True)
+ expected = convert_old_style_to_targets(exp, jump=True)
call_pure_results = self._convert_call_pure_results(call_pure_results)
- compile_data = compile.SimpleCompileData(label_op, loop,
+ trace = self.convert_loop_to_packed(loop)
+ compile_data = compile.SimpleCompileData(label_op, trace,
call_pure_results)
info, ops = self._do_optimize_loop(compile_data)
label_op = ResOperation(rop.LABEL, info.inputargs)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -493,6 +493,18 @@
final_descr = history.BasicFinalDescr()
+class FakeFrame(object):
+ pc = 0
+
+ class jitcode:
+ index = 0
+
+ def __init__(self, boxes):
+ self.boxes = boxes
+
+ def get_list_of_active_boxes(self, flag):
+ return self.boxes
+
class BaseTest(object):
def parse(self, s, boxkinds=None, want_fail_descr=True, postprocess=None):
@@ -501,12 +513,6 @@
None, False, postprocess)
return self.oparse.parse()
- def postprocess(self, op):
- if OpHelpers.is_guard(op.getopnum()):
- op.rd_snapshot = resume.TopSnapshot(
- resume.Snapshot(None, op.getfailargs()), [], [])
- op.rd_frame_info_list = resume.FrameInfo(None, 0, 11)
-
def add_guard_future_condition(self, res):
# invent a GUARD_FUTURE_CONDITION to not have to change all tests
if res.operations[-1].getopnum() == rop.JUMP:
@@ -546,6 +552,17 @@
call_pure_results[list(k)] = v
return call_pure_results
+ def convert_loop_to_packed(self, loop):
+ from rpython.jit.metainterp.opencoder import Trace
+ trace = Trace(loop.inputargs)
+ for op in loop.operations:
+ newop = trace.record_op(op.getopnum(), op.getarglist())
+ if rop.is_guard(op.getopnum()):
+ frame = FakeFrame(op.getfailargs())
+ resume.capture_resumedata([frame], None, [], trace)
+ op.position = newop.position
+ return trace
+
def unroll_and_optimize(self, loop, call_pure_results=None):
self.add_guard_future_condition(loop)
jump_op = loop.operations[-1]
@@ -601,7 +618,7 @@
def convert_old_style_to_targets(loop, jump):
newloop = TreeLoop(loop.name)
newloop.inputargs = loop.inputargs
- newloop.operations = [ResOperation(rop.LABEL, loop.inputargs, descr=FakeDescr())] + \
+ newloop.operations = [ResOperation(rop.LABEL, loop.inputargs, -1, descr=FakeDescr())] + \
loop.operations
if not jump:
assert newloop.operations[-1].getopnum() == rop.JUMP
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -581,9 +581,7 @@
class GuardResOp(ResOpWithDescr):
_fail_args = None
-
- rd_snapshot = None
- rd_frame_info_list = None
+ rd_resume_position = -1
def getfailargs(self):
return self._fail_args
@@ -598,8 +596,7 @@
newop = AbstractResOp.copy_and_change(self, opnum, args, descr)
assert isinstance(newop, GuardResOp)
newop.setfailargs(self.getfailargs())
- newop.rd_snapshot = self.rd_snapshot
- newop.rd_frame_info_list = self.rd_frame_info_list
+ newop.rd_resume_position = self.rd_resume_position
return newop
class VectorGuardOp(GuardResOp):
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
@@ -301,16 +301,7 @@
state.n = n
state.v = v
- def number(self, optimizer, topsnapshot, frameinfo):
- # flatten the list
- cur = topsnapshot.prev
- snapshot_list = [topsnapshot]
- framestack_list = []
- while cur:
- framestack_list.append(frameinfo)
- frameinfo = frameinfo.prev
- snapshot_list.append(cur)
- cur = cur.prev
+ def number(self, optimizer, position, trace):
state = NumberingState(snapshot_list)
# we want to number snapshots starting from the back, but ending
@@ -387,10 +378,11 @@
class ResumeDataVirtualAdder(VirtualVisitor):
- def __init__(self, optimizer, storage, snapshot_storage, memo):
+ def __init__(self, optimizer, storage, guard_op, trace, memo):
self.optimizer = optimizer
+ self.trace = trace
self.storage = storage
- self.snapshot_storage = snapshot_storage
+ self.guard_op = guard_op
self.memo = memo
def make_virtual_info(self, info, fieldnums):
@@ -480,11 +472,11 @@
storage = self.storage
# make sure that nobody attached resume data to this guard yet
assert not storage.rd_numb
- snapshot = self.snapshot_storage.rd_snapshot
- assert snapshot is not None # is that true?
+ resume_position = self.guard_op.rd_resume_position
+ assert resume_position > 0
# count stack depth
- numb, liveboxes_from_env, v = self.memo.number(optimizer, snapshot,
- self.snapshot_storage.rd_frame_info_list)
+ numb, liveboxes_from_env, v = self.memo.number(optimizer,
+ resume_position, self.optimize.trace)
self.liveboxes_from_env = liveboxes_from_env
self.liveboxes = {}
storage.rd_numb = numb
diff --git a/rpython/jit/metainterp/test/test_opencoder.py b/rpython/jit/metainterp/test/test_opencoder.py
--- a/rpython/jit/metainterp/test/test_opencoder.py
+++ b/rpython/jit/metainterp/test/test_opencoder.py
@@ -5,6 +5,21 @@
from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer
from rpython.jit.metainterp import resume
+class JitCode(object):
+ def __init__(self, index):
+ self.index = index
+
+class FakeFrame(object):
+ parent_resumedata_position = -1
+
+ def __init__(self, pc, jitcode, boxes):
+ self.pc = pc
+ self.jitcode = jitcode
+ self.boxes = boxes
+
+ def get_list_of_active_boxes(self, flag):
+ return self.boxes
+
class TestOpencoder(object):
def unpack(self, t):
iter = t.get_iter()
@@ -41,21 +56,6 @@
return boxes
def test_rd_snapshot(self):
- class JitCode(object):
- def __init__(self, index):
- self.index = index
-
- class FakeFrame(object):
- parent_resumedata_position = -1
-
- def __init__(self, pc, jitcode, boxes):
- self.pc = pc
- self.jitcode = jitcode
- self.boxes = boxes
-
- def get_list_of_active_boxes(self, flag):
- return self.boxes
-
i0, i1 = InputArgInt(), InputArgInt()
t = Trace([i0, i1])
add = t.record_op(rop.INT_ADD, [i0, i1])
@@ -67,14 +67,35 @@
resume.capture_resumedata(framestack, None, [], t)
(i0, i1), l, iter = self.unpack(t)
assert l[1].opnum == rop.GUARD_FALSE
- boxes = self.unpack_snapshot(iter, l[1].rd_snapshot_position)
+ boxes = self.unpack_snapshot(iter, l[1].rd_resume_position)
assert boxes == [i0, i1]
t.record_op(rop.GUARD_FALSE, [add])
resume.capture_resumedata([frame0, frame1], None, [], t)
(i0, i1), l, iter = self.unpack(t)
assert l[1].opnum == rop.GUARD_FALSE
- boxes = self.unpack_snapshot(iter, l[1].rd_snapshot_position)
+ boxes = self.unpack_snapshot(iter, l[1].rd_resume_position)
assert boxes == [i0, i1]
assert l[2].opnum == rop.GUARD_FALSE
- boxes = self.unpack_snapshot(iter, l[2].rd_snapshot_position)
+ boxes = self.unpack_snapshot(iter, l[2].rd_resume_position)
assert boxes == [i0, i0, l[0], i0, i1]
+
+ def test_read_snapshot_interface(self):
+ i0, i1, i2 = InputArgInt(), InputArgInt(), InputArgInt()
+ t = Trace([i0, i1, i2])
+ t.record_op(rop.GUARD_TRUE, [i1])
+ frame0 = FakeFrame(1, JitCode(2), [i0, i1])
+ frame1 = FakeFrame(3, JitCode(4), [i2, i2])
+ resume.capture_resumedata([frame0, frame1], None, [], t)
+ (i0, i1, i2), l, iter = self.unpack(t)
+ pos = l[0].rd_resume_position
+ snapshot_iter = iter.get_snapshot_iter(pos)
+ size, jc_index, pc = snapshot_iter.get_size_jitcode_pc()
+ assert size == 2
+ assert jc_index == 4
+ assert pc == 3
+ assert [snapshot_iter.next() for i in range(2)] == [i2, i2]
+ size, jc_index, pc = snapshot_iter.get_size_jitcode_pc()
+ assert size == 2
+ assert jc_index == 2
+ assert pc == 1
+ assert [snapshot_iter.next() for i in range(2)] == [i0, i1]
More information about the pypy-commit
mailing list