[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