Author: fijal
Branch: compress-numbering
Changeset: r80926:2a006fba78d9
Date: 2015-11-25 09:54 +0200
http://bitbucket.org/pypy/pypy/changeset/2a006fba78d9/
Log: write the snapshots in a better order. complicates code, but will
probably be beneficial
diff --git a/lib_pypy/cffi/__init__.py b/lib_pypy/cffi/__init__.py
--- a/lib_pypy/cffi/__init__.py
+++ b/lib_pypy/cffi/__init__.py
@@ -4,8 +4,8 @@
from .api import FFI, CDefError, FFIError
from .ffiplatform import VerificationError, VerificationMissing
-__version__ = "1.3.0"
-__version_info__ = (1, 3, 0)
+__version__ = "1.3.1"
+__version_info__ = (1, 3, 1)
# The verifier module file names are based on the CRC32 of a string that
# contains the following version number. It may be older than __version__
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
@@ -202,19 +202,31 @@
TAGBOX = 2
TAGVIRTUAL = 3
-UNASSIGNED = tag(-1 << 13, TAGBOX)
-UNASSIGNEDVIRTUAL = tag(-1 << 13, TAGVIRTUAL)
-NULLREF = tag(0, TAGCONST)
-UNINITIALIZED = tag(1, TAGCONST) # used for uninitialized string characters
-TAG_CONST_OFFSET = 2
+UNASSIGNED = tag(-1, TAGBOX)
+UNASSIGNEDVIRTUAL = tag(-1, TAGVIRTUAL)
+NULLREF = tag(-1, TAGCONST)
+UNINITIALIZED = tag(2, TAGCONST) # used for uninitialized string characters
+TAG_CONST_OFFSET = 0
class NumberingState(object):
- def __init__(self):
+ def __init__(self, snapshot_list):
self.liveboxes = {}
- self.current = []
+ self.current = [None] * self.count_boxes(snapshot_list)
+ self.position = len(self.current)
self.n = 0
self.v = 0
+ def count_boxes(self, lst):
+ c = 0
+ for snapshot in lst:
+ c += len(snapshot.boxes)
+ c += 2 * (len(lst) - 1)
+ return c
+
+ def append(self, item):
+ self.current[self.position] = item
+ self.position += 1
+
class ResumeDataLoopMemo(object):
def __init__(self, metainterp_sd):
@@ -273,6 +285,7 @@
v = state.v
liveboxes = state.liveboxes
length = len(boxes)
+ state.position -= length
for i in range(length):
box = boxes[i]
box = optimizer.get_box_replacement(box)
@@ -296,9 +309,10 @@
tagged = tag(n, TAGBOX)
n += 1
liveboxes[box] = tagged
- state.current.append(tagged)
+ state.append(tagged)
state.n = n
state.v = v
+ state.position -= length
# def _get_prev_snapshot(self, snapshot):
# cur_snapshot = snapshot
@@ -313,26 +327,28 @@
def number(self, optimizer, snapshot, frameinfo):
# flatten the list
- cur = snapshot
- snapshot_list = []
+ vref_snapshot = snapshot
+ cur = snapshot.prev
+ snapshot_list = [vref_snapshot]
framestack_list = []
while cur:
- if cur is not snapshot:
- framestack_list.append(frameinfo)
- frameinfo = frameinfo.prev
+ framestack_list.append(frameinfo)
+ frameinfo = frameinfo.prev
snapshot_list.append(cur)
cur = cur.prev
- snapshot_list.reverse()
- framestack_list.reverse()
- state = NumberingState()
+ state = NumberingState(snapshot_list)
- for i in range(len(snapshot_list)):
+ # we want to number snapshots starting from the back, but ending
+ # with a forward list
+ for i in range(len(snapshot_list) - 1, -1, -1):
self._number_boxes(snapshot_list[i].boxes, optimizer, state)
if i != 0:
frameinfo = framestack_list[i - 1]
jitcode_pos, pc = unpack_uint(frameinfo.packed_jitcode_pc)
- state.current.append(rffi.cast(rffi.USHORT, jitcode_pos))
- state.current.append(rffi.cast(rffi.USHORT, pc))
+ state.position -= 2
+ state.append(rffi.cast(rffi.USHORT, jitcode_pos))
+ state.append(rffi.cast(rffi.USHORT, pc))
+ state.position -= 2
numb = resumecode.create_numbering(state.current,
lltype.nullptr(resumecode.NUMBERING), 0)
@@ -1090,6 +1106,7 @@
def rebuild_from_resumedata(metainterp, storage, deadframe,
virtualizable_info, greenfield_info):
+ xxx
resumereader = ResumeDataBoxReader(storage, deadframe, metainterp)
boxes = resumereader.consume_vref_and_vable_boxes(virtualizable_info,
greenfield_info)
@@ -1480,6 +1497,7 @@
load_value_of_type._annspecialcase_ = 'specialize:arg(1)'
def consume_vref_and_vable(self, vrefinfo, vinfo, ginfo):
+ xxx
numb = self.cur_numb
self.cur_numb = numb.prev
if self.resume_after_guard_not_forced != 2:
diff --git a/rpython/jit/metainterp/resumecode.py
b/rpython/jit/metainterp/resumecode.py
--- a/rpython/jit/metainterp/resumecode.py
+++ b/rpython/jit/metainterp/resumecode.py
@@ -15,49 +15,78 @@
NUMBERING = lltype.GcStruct('Numbering',
('prev', NUMBERINGP),
('prev_index', rffi.USHORT),
- ('code', lltype.Array(rffi.UCHAR)))
+ ('code', lltype.Array(rffi.SHORT)))
NUMBERINGP.TO.become(NUMBERING)
NULL_NUMBER = lltype.nullptr(NUMBERING)
def create_numbering(lst, prev, prev_index):
- count = 0
- for item in lst:
- if item > 127:
- count += 1
- count += 1
- numb = lltype.malloc(NUMBERING, count)
- numb.prev = prev
- numb.prev_index = rffi.cast(rffi.USHORT, prev_index)
- index = 0
- for item in lst:
- assert item >= 0
- if item <= 128:
- numb.code[index] = rffi.cast(rffi.UCHAR, item)
- index += 1
- else:
- assert (item >> 8) <= 127
- numb.code[index] = rffi.cast(rffi.UCHAR, (item >> 8) |
0x80)
- numb.code[index + 1] = rffi.cast(rffi.UCHAR, item &
0xff)
- index += 2
- return numb
+ numb = lltype.malloc(NUMBERING, len(lst))
+ for i in range(len(lst)):
+ numb.code[i] = rffi.cast(rffi.SHORT, lst[i])
+ numb.prev = prev
+ numb.prev_index = rffi.cast(rffi.USHORT, prev_index)
+ return numb
+
+def _create_numbering(lst, prev, prev_index):
+ count = 0
+ for item in lst:
+ if item < 0:
+ if item < -63:
+ count += 1
+ if item > 127:
+ count += 1
+ count += 1
+ numb = lltype.malloc(NUMBERING, count)
+ numb.prev = prev
+ numb.prev_index = rffi.cast(rffi.USHORT, prev_index)
+ index = 0
+ for item in lst:
+ if 0 <= item <= 128:
+ numb.code[index] = rffi.cast(rffi.UCHAR, item)
+ index += 1
+ else:
+ assert (item >> 8) <= 63
+ if item < 0:
+ item = -item
+ if item <= 63:
+ numb.code[index] = rffi.cast(rffi.UCHAR, item | 0x40)
+ index += 1
+ else:
+ numb.code[index] = rffi.cast(rffi.UCHAR, (item >> 8) |
0x80 | 0x40)
+ numb.code[index + 1] = rffi.cast(rffi.UCHAR, item & 0xff)
+ index += 2
+ else:
+ numb.code[index] = rffi.cast(rffi.UCHAR, (item >> 8) | 0x80)
+ numb.code[index + 1] = rffi.cast(rffi.UCHAR, item & 0xff)
+ index += 2
+ return numb
def copy_from_list_to_numb(lst, numb, index):
- i = 0
- while i < len(lst):
- numb.code[i + index] = lst[i]
- i += 1
+ i = 0
+ while i < len(lst):
+ numb.code[i + index] = lst[i]
+ i += 1
def numb_next_item(numb, index):
- one = rffi.cast(lltype.Signed, numb.code[index])
- if one & 0x80:
- two = rffi.cast(lltype.Signed, numb.code[index + 1])
- return ((one & 0x7f) << 8) | two, index + 2
- return one, index + 1
+ return rffi.cast(lltype.Signed, numb.code[index]), index + 1
+
+def _numb_next_item(numb, index):
+ one = rffi.cast(lltype.Signed, numb.code[index])
+ if one & 0x40:
+ if one & 0x80:
+ two = rffi.cast(lltype.Signed, numb.code[index + 1])
+ return -(((one & ~(0x80 | 0x40)) << 8) | two), index + 2
+ else:
+ return -(one & (~0x40)), index + 1
+ if one & 0x80:
+ two = rffi.cast(lltype.Signed, numb.code[index + 1])
+ return ((one & 0x7f) << 8) | two, index + 2
+ return one, index + 1
def unpack_numbering(numb):
- l = []
- i = 0
- while i < len(numb.code):
- next, i = numb_next_item(numb, i)
- l.append(next)
- return l
+ l = []
+ i = 0
+ while i < len(numb.code):
+ next, i = numb_next_item(numb, i)
+ l.append(next)
+ return l
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
@@ -336,7 +336,7 @@
def test_simple_read_tagged_ints():
storage = Storage()
storage.rd_consts = []
- numb = Numbering(None, [tag(100, TAGINT)])
+ numb = Numbering([tag(100, TAGINT)])
storage.rd_numb = numb
#
cpu = MyCPU([])
@@ -552,17 +552,6 @@
assert jitcode_pos == 42
assert pc == 3
-def test_Numbering_create():
- l = [rffi.r_short(1), rffi.r_short(2)]
- numb = Numbering(None, l)
- assert not numb.prev
- assert list(numb.nums) == l
-
- l1 = [rffi.r_short(3)]
- numb1 = Numbering(numb, l1)
- assert numb1.prev == numb
- assert list(numb1.nums) == l1
-
def test_capture_resumedata():
b1, b2, b3 = [InputArgInt(), InputArgRef(), InputArgInt()]
c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)]
@@ -869,7 +858,7 @@
tagged = memo.getconst(const)
index, tagbits = untag(tagged)
assert tagbits == TAGCONST
- assert memo.consts[index] is const
+ assert memo.consts[index - TAG_CONST_OFFSET] is const
tagged = memo.getconst(ConstInt(50000))
index2, tagbits = untag(tagged)
assert tagbits == TAGCONST
@@ -887,7 +876,7 @@
tagged = memo.getconst(const)
index, tagbits = untag(tagged)
assert tagbits == TAGCONST
- assert memo.consts[index] is const
+ assert memo.consts[index - TAG_CONST_OFFSET] is const
tagged = memo.getconst(cpu.ts.ConstRef(demo55o))
index2, tagbits = untag(tagged)
assert tagbits == TAGCONST
@@ -905,7 +894,7 @@
tagged = memo.getconst(const)
index, tagbits = untag(tagged)
assert tagbits == TAGCONST
- assert memo.consts[index] is const
+ assert memo.consts[index - TAG_CONST_OFFSET] is const
def test_ResumeDataLoopMemo_number():
b1, b2, b3, b4, b5 = [InputArgInt(), InputArgInt(), InputArgInt(),
@@ -929,8 +918,8 @@
b3: tag(2, TAGBOX)}
base = [tag(0, TAGBOX), tag(1, TAGINT), tag(1, TAGBOX), tag(0, TAGBOX),
tag(2, TAGINT)]
- assert unpack_numbering(numb) == base + [
- tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(1, TAGINT), 0, 0]
+ assert unpack_numbering(numb) == [
+ tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(1, TAGINT), 0,
0] + base
numb2, liveboxes2, v = memo.number(FakeOptimizer(), snap2, frameinfo)
assert v == 0
@@ -938,8 +927,8 @@
assert liveboxes2 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
b3: tag(2, TAGBOX)}
assert liveboxes2 is not liveboxes
- assert unpack_numbering(numb2) == base + [
- tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(3, TAGINT), 0, 0]
+ assert unpack_numbering(numb2) == [
+ tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(3, TAGINT), 0, 0]
+ base
assert numb2.prev == numb.prev
env3 = [c3, b3, b1, c3]
@@ -958,8 +947,8 @@
assert v == 0
assert liveboxes3 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX)}
- assert unpack_numbering(numb3) == base + [tag(3, TAGINT), tag(4, TAGINT),
tag(0, TAGBOX),
- tag(3, TAGINT), 0, 0]
+ assert unpack_numbering(numb3) == [tag(3, TAGINT), tag(4, TAGINT), tag(0,
TAGBOX),
+ tag(3, TAGINT), 0, 0] + base
# virtual
env4 = [c3, b4, b1, c3]
@@ -971,8 +960,8 @@
assert liveboxes4 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
b4: tag(0, TAGVIRTUAL)}
- assert unpack_numbering(numb4) == base + [tag(3, TAGINT), tag(0,
TAGVIRTUAL),
- tag(0, TAGBOX), tag(3, TAGINT), 0, 0]
+ assert unpack_numbering(numb4) == [tag(3, TAGINT), tag(0, TAGVIRTUAL),
+ tag(0, TAGBOX), tag(3, TAGINT), 0, 0] + base
env5 = [b1, b4, b5]
snap5 = Snapshot(snap4, env5)
@@ -985,8 +974,8 @@
assert liveboxes5 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX),
b4: tag(0, TAGVIRTUAL), b5: tag(1, TAGVIRTUAL)}
- assert unpack_numbering(numb5) == unpack_numbering(numb4) + [tag(0,
TAGBOX), tag(0, TAGVIRTUAL),
- tag(1, TAGVIRTUAL), 2, 1]
+ assert unpack_numbering(numb5) == [tag(0, TAGBOX), tag(0, TAGVIRTUAL),
+ tag(1, TAGVIRTUAL), 2, 1] + unpack_numbering(numb4)
def test_ResumeDataLoopMemo_number_boxes():
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
@@ -1087,9 +1076,10 @@
assert storage.rd_snapshot is None
cpu = MyCPU([])
reader = ResumeDataDirectReader(MyMetaInterp(cpu), storage, "deadframe")
+ _next_section(reader, sys.maxint, 1, sys.maxint, 2**16)
+ _next_section(reader, 2, 3)
+ reader.cur_index += 2 # framestack
_next_section(reader, sys.maxint, 2**16, -65)
- _next_section(reader, 2, 3)
- _next_section(reader, sys.maxint, 1, sys.maxint, 2**16)
def test_virtual_adder_memo_const_sharing():
@@ -1125,8 +1115,8 @@
return True
class MyInfo:
@staticmethod
- def enumerate_vars(callback_i, callback_r, callback_f, _):
- for index, tagged in enumerate(self.cur_numb.nums):
+ def enumerate_vars(callback_i, callback_r, callback_f, _, index):
+ for tagged in self.cur_numb.nums:
_, tag = untag(tagged)
if tag == TAGVIRTUAL:
kind = REF
@@ -1134,11 +1124,11 @@
kind = Whatever()
box = self.decode_box(tagged, kind)
if box.type == INT:
- callback_i(index, index)
+ index = callback_i(index, index)
elif box.type == REF:
- callback_r(index, index)
+ index = callback_r(index, index)
elif box.type == FLOAT:
- callback_f(index, index)
+ index = callback_f(index, index)
else:
assert 0
self._prepare_next_section(MyInfo())
diff --git a/rpython/jit/metainterp/test/test_resumecode.py
b/rpython/jit/metainterp/test/test_resumecode.py
--- a/rpython/jit/metainterp/test/test_resumecode.py
+++ b/rpython/jit/metainterp/test/test_resumecode.py
@@ -1,18 +1,16 @@
-from rpython.jit.metainterp.resumecode import NUMBERING
+from rpython.jit.metainterp.resumecode import NUMBERING, NULL_NUMBER
from rpython.jit.metainterp.resumecode import create_numbering,\
- unpack_numbering, copy_from_list_to_numb
+ unpack_numbering, copy_from_list_to_numb
from rpython.rtyper.lltypesystem import lltype
def test_pack_unpack():
- examples = [
- [1, 2, 3, 4, 257, 10000, 13, 15],
- [1, 2, 3, 4],
- range(1, 10, 2),
- [13000, 12000, 10000, 256, 255, 254, 257]
- ]
- for l in examples:
- lst = create_numbering(l)
- n = lltype.malloc(NUMBERING, len(lst))
- copy_from_list_to_numb(lst, n, 0)
- assert unpack_numbering(n) == l
+ examples = [
+ [1, 2, 3, 4, 257, 10000, 13, 15],
+ [1, 2, 3, 4],
+ range(1, 10, 2),
+ [13000, 12000, 10000, 256, 255, 254, 257, -3, -1000]
+ ]
+ for l in examples:
+ n = create_numbering(l, NULL_NUMBER, 0)
+ assert unpack_numbering(n) == l
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit