Author: fijal
Branch: compress-numbering
Changeset: r80930:9661ee702ee2
Date: 2015-11-25 10:45 +0200
http://bitbucket.org/pypy/pypy/changeset/9661ee702ee2/
Log: whack enough to start passing first blackhole resume
diff --git a/rpython/jit/codewriter/jitcode.py
b/rpython/jit/codewriter/jitcode.py
--- a/rpython/jit/codewriter/jitcode.py
+++ b/rpython/jit/codewriter/jitcode.py
@@ -141,18 +141,14 @@
def get_register_index_f(self, index):
return ord(self.live_f[index])
- def enumerate_vars(self, callback_i, callback_r, callback_f, spec):
- xxx
- index = 0
+ def enumerate_vars(self, callback_i, callback_r, callback_f, spec, index):
for i in range(self.get_register_count_i()):
- callback_i(index, self.get_register_index_i(i))
- index += 1
+ index = callback_i(index, self.get_register_index_i(i))
for i in range(self.get_register_count_r()):
- callback_r(index, self.get_register_index_r(i))
- index += 1
+ index = callback_r(index, self.get_register_index_r(i))
for i in range(self.get_register_count_f()):
- callback_f(index, self.get_register_index_f(i))
- index += 1
+ index = callback_f(index, self.get_register_index_f(i))
+ return index
enumerate_vars._annspecialcase_ = 'specialize:arg(4)'
_liveness_cache = {}
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
@@ -211,7 +211,7 @@
class NumberingState(object):
def __init__(self, snapshot_list):
self.liveboxes = {}
- self.current = [None] * self.count_boxes(snapshot_list)
+ self.current = [rffi.cast(rffi.SHORT, 0)] *
self.count_boxes(snapshot_list)
self.position = len(self.current)
self.n = 0
self.v = 0
@@ -285,7 +285,6 @@
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)
@@ -312,7 +311,7 @@
state.append(tagged)
state.n = n
state.v = v
- state.position -= length
+ state.position -= length + 2
# def _get_prev_snapshot(self, snapshot):
# cur_snapshot = snapshot
@@ -341,17 +340,17 @@
# 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)
+ state.position -= len(snapshot_list[i].boxes)
if i != 0:
frameinfo = framestack_list[i - 1]
jitcode_pos, pc = unpack_uint(frameinfo.packed_jitcode_pc)
state.position -= 2
state.append(rffi.cast(rffi.USHORT, jitcode_pos))
state.append(rffi.cast(rffi.USHORT, pc))
- state.position -= 2
+ self._number_boxes(snapshot_list[i].boxes, optimizer, state)
numb = resumecode.create_numbering(state.current,
- lltype.nullptr(resumecode.NUMBERING), 0)
+ lltype.nullptr(resumecode.NUMBERING), 0, len(vref_snapshot.boxes))
return numb, state.liveboxes, state.v
@@ -1003,6 +1002,16 @@
self._prepare_virtuals(storage.rd_virtuals)
self._prepare_pendingfields(storage.rd_pendingfields)
+ def read_jitcode_pos_pc(self):
+ jitcode_pos, self.cur_index = resumecode.numb_next_item(self.numb,
+ self.cur_index)
+ pc, self.cur_index = resumecode.numb_next_item(self.numb,
+ self.cur_index)
+ return jitcode_pos, pc
+
+ def done_reading(self):
+ return self.cur_index >= len(self.numb.code)
+
def getvirtual_ptr(self, index):
# Returns the index'th virtual, building it lazily if needed.
# Note that this may be called recursively; that's why the
@@ -1388,33 +1397,26 @@
rstack._stack_criticalcode_stop()
#
# First get a chain of blackhole interpreters whose length is given
- # by the depth of rd_frame_info_list. The first one we get must be
+ # by the positions in the numbering. The first one we get must be
# the bottom one, i.e. the last one in the chain, in order to make
# the comment in BlackholeInterpreter.setposition() valid.
- nextbh = None
- numbering = storage.rd_numb.prev
+ prevbh = None
+ firstbh = None
+ curbh = None
while True:
curbh = blackholeinterpbuilder.acquire_interp()
- curbh.nextblackholeinterp = nextbh
- nextbh = curbh
- numbering = numbering.prev
- if not numbering:
- break
- firstbh = nextbh
- #
- # Now fill the blackhole interpreters with resume data.
- curbh = firstbh
- xxxx
- numbering = storage.rd_numb.prev
- while True:
- jitcode_pos, pc = unpack_uint(numbering.packed_jitcode_pc)
+ if prevbh is not None:
+ prevbh.nextblackholeinterp = curbh
+ else:
+ firstbh = curbh
+ prevbh = curbh
+ jitcode_pos, pc = resumereader.read_jitcode_pos_pc()
jitcode = jitcodes[jitcode_pos]
curbh.setposition(jitcode, pc)
resumereader.consume_one_section(curbh)
- curbh = curbh.nextblackholeinterp
- numbering = numbering.prev
- if not numbering:
+ if resumereader.done_reading():
break
+ curbh.nextblackholeinterp = None
return firstbh
def force_from_resumedata(metainterp_sd, storage, deadframe, vinfo, ginfo):
@@ -1457,7 +1459,7 @@
info = blackholeinterp.get_current_position_info()
self._prepare_next_section(info)
- def consume_virtualref_info(self, vrefinfo, numb, end):
+ def consume_virtualref_info(self, vrefinfo, end):
# we have to decode a list of references containing pairs
# [..., virtual, vref, ...] stopping at 'end'
if vrefinfo is None:
@@ -1470,12 +1472,15 @@
# For each pair, we store the virtual inside the vref.
vrefinfo.continue_tracing(vref, virtual)
- def consume_vable_info(self, vinfo, numb):
+ def consume_vable_info(self, vinfo):
# we have to ignore the initial part of 'nums' (containing vrefs),
# find the virtualizable from nums[-1], load all other values
# from the CPU stack, and copy them into the virtualizable
+ numb = self.numb
+ first_snapshot_size = rffi.cast(lltype.Signed,
numb.first_snapshot_size)
if vinfo is None:
- return len(numb.nums)
+ return first_snapshot_size
+ xxx
index = len(numb.nums) - 1
virtualizable = self.decode_ref(numb.nums[index])
# just reset the token, we'll force it later
@@ -1497,14 +1502,11 @@
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:
- end_vref = self.consume_vable_info(vinfo, numb)
+ end_vref = self.consume_vable_info(vinfo)
if ginfo is not None:
end_vref -= 1
- self.consume_virtualref_info(vrefinfo, numb, end_vref)
+ self.consume_virtualref_info(vrefinfo, end_vref)
def allocate_with_vtable(self, descr=None):
from rpython.jit.metainterp.executor import exec_new_with_vtable
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,19 +15,21 @@
NUMBERING = lltype.GcStruct('Numbering',
('prev', NUMBERINGP),
('prev_index', rffi.USHORT),
+ ('first_snapshot_size', rffi.USHORT), # ugh, ugly
('code', lltype.Array(rffi.SHORT)))
NUMBERINGP.TO.become(NUMBERING)
NULL_NUMBER = lltype.nullptr(NUMBERING)
-def create_numbering(lst, prev, prev_index):
+def create_numbering(lst, prev, prev_index, first_snapshot_size):
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)
+ numb.first_snapshot_size = rffi.cast(rffi.USHORT, first_snapshot_size)
return numb
-def _create_numbering(lst, prev, prev_index):
+def _create_numbering(lst, prev, prev_index, first_snapshot_size):
count = 0
for item in lst:
if item < 0:
@@ -39,6 +41,7 @@
numb = lltype.malloc(NUMBERING, count)
numb.prev = prev
numb.prev_index = rffi.cast(rffi.USHORT, prev_index)
+ numb.first_snapshot_size = rffi.cast(rffi.USHORT, first_snapshot_size)
index = 0
for item in lst:
if 0 <= item <= 128:
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
@@ -279,7 +279,7 @@
def Numbering(nums):
- numb = create_numbering(nums, NULL_NUMBER, 0)
+ numb = create_numbering(nums, NULL_NUMBER, 0, 0)
return numb
def tagconst(i):
@@ -947,8 +947,9 @@
assert v == 0
assert liveboxes3 == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX)}
- assert unpack_numbering(numb3) == [tag(3, TAGINT), tag(4, TAGINT), tag(0,
TAGBOX),
- tag(3, TAGINT), 0, 0] + base
+ 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]
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit