[pypy-commit] pypy jit-leaner-frontend: start working on live ranges

fijal pypy.commits at gmail.com
Sun Mar 20 05:50:01 EDT 2016


Author: fijal
Branch: jit-leaner-frontend
Changeset: r83186:46a2efc05eb0
Date: 2016-03-20 11:49 +0200
http://bitbucket.org/pypy/pypy/changeset/46a2efc05eb0/

Log:	start working on live ranges

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
@@ -9,7 +9,8 @@
 
 from rpython.jit.metainterp.history import ConstInt, Const, ConstFloat, ConstPtr
 from rpython.jit.metainterp.resoperation import AbstractResOp, AbstractInputArg,\
-    ResOperation, oparity, rop, opwithdescr, GuardResOp, IntOp, FloatOp, RefOp
+    ResOperation, oparity, rop, opwithdescr, GuardResOp, IntOp, FloatOp, RefOp,\
+    opclasses
 from rpython.rlib.rarithmetic import intmask, r_uint
 from rpython.rlib.objectmodel import we_are_translated
 from rpython.rtyper.lltypesystem import rffi, lltype, llmemory
@@ -47,6 +48,20 @@
     def get(self, index):
         return self.main_iter._untag(index)
 
+    def _update_liverange(self, item, index, liveranges):
+        tag, v = untag(item)
+        if tag == TAGBOX:
+            liveranges[v] = index
+
+    def update_liveranges(self, index, liveranges):
+        for item in self.vable_array:
+            self._update_liverange(item, index, liveranges)
+        for item in self.vref_array:
+            self._update_liverange(item, index, liveranges)
+        for frame in self.framestack:
+            for item in frame.box_array:
+                self._update_liverange(item, index, liveranges)
+
     def unpack_jitcode_pc(self, snapshot):
         return unpack_uint(snapshot.packed_jitcode_pc)
 
@@ -107,6 +122,26 @@
     def get_snapshot_iter(self, index):
         return SnapshotIterator(self, self.trace._snapshots[index])
 
+    def next_element_update_live_range(self, index, liveranges):
+        opnum = self._next()
+        if oparity[opnum] == -1:
+            argnum = self._next()
+        else:
+            argnum = oparity[opnum]
+        for i in range(argnum):
+            tagged = self._next()
+            tag, v = untag(tagged)
+            if tag == TAGBOX:
+                liveranges[v] = index
+        if opclasses[opnum].type != 'v':
+            liveranges[index] = index
+        if opwithdescr[opnum]:
+            descr_index = self._next()
+        if rop.is_guard(opnum):
+            self.get_snapshot_iter(descr_index).update_liveranges(
+                index, liveranges)
+        return index + 1
+
     def next(self):
         opnum = self._next()
         if oparity[opnum] == -1:
@@ -132,7 +167,8 @@
         if rop.is_guard(opnum):
             assert isinstance(res, GuardResOp)
             res.rd_resume_position = descr_index
-        self._cache[self._count] = res
+        if res.type != 'v':
+            self._cache[self._count] = res
         self._count += 1
         return res
 
@@ -359,6 +395,14 @@
         assert metainterp_sd
         return TraceIterator(self, self._start, self._pos, metainterp_sd=metainterp_sd)
 
+    def get_live_ranges(self, metainterp_sd):
+        t = self.get_iter(metainterp_sd)
+        liveranges = [0] * self._count
+        index = t._count
+        while not t.done():
+            index = t.next_element_update_live_range(index, liveranges)
+        return liveranges
+
     def unpack(self):
         iter = self.get_iter()
         ops = []
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
@@ -13,6 +13,9 @@
     def __init__(self, index):
         self.index = index
 
+class SomeDescr(AbstractDescr):
+    pass
+
 class metainterp_sd(object):
     pass
 
@@ -175,9 +178,6 @@
         assert l[0].getarglist() == [i0, i1]
 
     def test_virtualizable_virtualref(self):
-        class SomeDescr(AbstractDescr):
-            pass
-
         i0, i1, i2 = IntFrontendOp(0), IntFrontendOp(0), IntFrontendOp(0)
         t = Trace([i0, i1, i2])
         p0 = FakeOp(t.record_op(rop.NEW_WITH_VTABLE, [], descr=SomeDescr()))
@@ -186,4 +186,12 @@
         (i0, i1, i2), l, iter = self.unpack(t)
         assert not l[1].framestack
         assert l[1].virtualizables == [l[0], i1, i2]
-        assert l[1].vref_boxes == [l[0], i1]
\ No newline at end of file
+        assert l[1].vref_boxes == [l[0], i1]
+
+    def test_liveranges(self):
+        i0, i1, i2 = IntFrontendOp(0), IntFrontendOp(0), IntFrontendOp(0)
+        t = Trace([i0, i1, i2])
+        p0 = FakeOp(t.record_op(rop.NEW_WITH_VTABLE, [], descr=SomeDescr()))
+        t.record_op(rop.GUARD_TRUE, [i0])
+        resume.capture_resumedata([], [i1, i2, p0], [p0, i1], t)
+        assert t.get_live_ranges(metainterp_sd) == [4, 4, 4, 4, 0]


More information about the pypy-commit mailing list