[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