[pypy-svn] r71514 - in pypy/branch/guard-value-counting/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Fri Feb 26 11:57:12 CET 2010
Author: arigo
Date: Fri Feb 26 11:57:11 2010
New Revision: 71514
Modified:
pypy/branch/guard-value-counting/pypy/jit/metainterp/resume.py
pypy/branch/guard-value-counting/pypy/jit/metainterp/test/test_resume.py
Log:
Start implementing the idea that there are really two kinds of Descrs
for guards: one before optimization, and the other after optimization.
They need slightly different attributes, and the goal is to let
optimization decide exactly which subclass of ResumeGuardDescr is
needed for each guard.
Modified: pypy/branch/guard-value-counting/pypy/jit/metainterp/resume.py
==============================================================================
--- pypy/branch/guard-value-counting/pypy/jit/metainterp/resume.py (original)
+++ pypy/branch/guard-value-counting/pypy/jit/metainterp/resume.py Fri Feb 26 11:57:11 2010
@@ -44,17 +44,18 @@
def capture_resumedata(framestack, virtualizable_boxes, virtualref_boxes,
storage):
+ # store resume data on the PreOptGuardDescr 'storage'
n = len(framestack)-1
top = framestack[n]
_ensure_parent_resumedata(framestack, n)
frame_info_list = FrameInfo(top.parent_resumedata_frame_info_list,
top)
- storage.rd_frame_info_list = frame_info_list
+ storage.pd_frame_info_list = frame_info_list
snapshot = Snapshot(top.parent_resumedata_snapshot, top.env[:])
snapshot = Snapshot(snapshot, virtualref_boxes[:]) # xxx for now
if virtualizable_boxes is not None:
snapshot = Snapshot(snapshot, virtualizable_boxes[:]) # xxx for now
- storage.rd_snapshot = snapshot
+ storage.pd_snapshot = snapshot
class Numbering(object):
__slots__ = ('prev', 'nums')
@@ -231,8 +232,9 @@
class ResumeDataVirtualAdder(object):
- def __init__(self, storage, memo):
- self.storage = storage
+ def __init__(self, storage_src, storage_dst, memo):
+ self.storage_src = storage_src # the PreOptGuardDescr that we read
+ self.storage_dst = storage_dst # the ResumeGuardDescr that we write
self.memo = memo
def make_virtual(self, known_class, fielddescrs):
@@ -270,15 +272,15 @@
def finish(self, values, pending_setfields=[]):
# compute the numbering
- storage = self.storage
- # make sure that nobody attached resume data to this guard yet
- assert storage.rd_numb is None
+ storage_src = self.storage_src
numb, liveboxes_from_env, v = self.memo.number(values,
- storage.rd_snapshot)
+ storage_src.pd_snapshot)
self.liveboxes_from_env = liveboxes_from_env
self.liveboxes = {}
- storage.rd_numb = numb
- storage.rd_snapshot = None
+ storage_dst = self.storage_dst
+ storage_dst.rd_frame_info_list = storage_src.pd_frame_info_list
+ storage_dst.rd_numb = numb
+ storage_dst.rd_snapshot = None
# collect liveboxes and virtuals
n = len(liveboxes_from_env) - v
@@ -302,8 +304,8 @@
self._number_virtuals(liveboxes, values, v)
self._add_pending_fields(pending_setfields)
- storage.rd_consts = self.memo.consts
- dump_storage(storage, liveboxes)
+ storage_dst.rd_consts = self.memo.consts
+ dump_storage(storage_dst, liveboxes)
return liveboxes[:]
def _number_virtuals(self, liveboxes, values, num_env_virtuals):
@@ -336,12 +338,12 @@
liveboxes.extend(new_liveboxes)
nholes = len(new_liveboxes) - count
- storage = self.storage
- storage.rd_virtuals = None
+ storage_dst = self.storage_dst
+ storage_dst.rd_virtuals = None
vfieldboxes = self.vfieldboxes
if vfieldboxes:
length = num_env_virtuals + memo.num_cached_virtuals()
- virtuals = storage.rd_virtuals = [None] * length
+ virtuals = storage_dst.rd_virtuals = [None] * length
memo.nvirtuals += length
memo.nvholes += length - len(vfieldboxes)
for virtualbox, fieldboxes in vfieldboxes.iteritems():
@@ -376,7 +378,7 @@
num = self._gettagged(box)
fieldnum = self._gettagged(fieldbox)
rd_pendingfields.append((descr, num, fieldnum))
- self.storage.rd_pendingfields = rd_pendingfields
+ self.storage_dst.rd_pendingfields = rd_pendingfields
def _gettagged(self, box):
if isinstance(box, Const):
Modified: pypy/branch/guard-value-counting/pypy/jit/metainterp/test/test_resume.py
==============================================================================
--- pypy/branch/guard-value-counting/pypy/jit/metainterp/test/test_resume.py (original)
+++ pypy/branch/guard-value-counting/pypy/jit/metainterp/test/test_resume.py Fri Feb 26 11:57:11 2010
@@ -8,13 +8,25 @@
from pypy.jit.metainterp.test.test_optimizefindnode import LLtypeMixin
from pypy.jit.metainterp import executor
-class Storage:
+class StoragePre(object):
+ pd_frame_info_list = None
+
+ def __setattr__(self, attr, value): # test mixing the two storage classes
+ assert not attr.startswith('rd_')
+ object.__setattr__(self, attr, value)
+
+class Storage(object):
rd_frame_info_list = None
rd_numb = None
rd_consts = []
rd_virtuals = None
rd_pendingfields = None
+ def __setattr__(self, attr, value): # test mixing the two storage classes
+ assert not attr.startswith('pd_')
+ object.__setattr__(self, attr, value)
+
+
def test_tag():
assert tag(3, 1) == rffi.r_short(3<<2|1)
assert tag(-3, 2) == rffi.r_short(-3<<2|2)
@@ -207,33 +219,33 @@
c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)]
fs = [FakeFrame("code0", 0, -1, b1, c1, b2)]
- storage = Storage()
- capture_resumedata(fs, None, [], storage)
+ storagepre = StoragePre()
+ capture_resumedata(fs, None, [], storagepre)
assert fs[0].parent_resumedata_snapshot is None
assert fs[0].parent_resumedata_frame_info_list is None
- assert storage.rd_frame_info_list.prev is None
- assert storage.rd_frame_info_list.jitcode == 'code0'
- assert storage.rd_snapshot.boxes == [] # for virtualrefs
- snapshot = storage.rd_snapshot.prev
+ assert storagepre.pd_frame_info_list.prev is None
+ assert storagepre.pd_frame_info_list.jitcode == 'code0'
+ assert storagepre.pd_snapshot.boxes == [] # for virtualrefs
+ snapshot = storagepre.pd_snapshot.prev
assert snapshot.prev is None
assert snapshot.boxes == fs[0].env
assert snapshot.boxes is not fs[0].env
- storage = Storage()
+ storagepre = StoragePre()
fs = [FakeFrame("code0", 0, -1, b1, c1, b2),
FakeFrame("code1", 3, 7, b3, c2, b1),
FakeFrame("code2", 9, -1, c3, b2)]
- capture_resumedata(fs, None, [], storage)
+ capture_resumedata(fs, None, [], storagepre)
- frame_info_list = storage.rd_frame_info_list
+ frame_info_list = storagepre.pd_frame_info_list
assert frame_info_list.prev is fs[2].parent_resumedata_frame_info_list
assert frame_info_list.jitcode == 'code2'
assert frame_info_list.pc == 9
- assert storage.rd_snapshot.boxes == [] # for virtualrefs
- snapshot = storage.rd_snapshot.prev
+ assert storagepre.pd_snapshot.boxes == [] # for virtualrefs
+ snapshot = storagepre.pd_snapshot.prev
assert snapshot.prev is fs[2].parent_resumedata_snapshot
assert snapshot.boxes == fs[2].env
assert snapshot.boxes is not fs[2].env
@@ -258,14 +270,14 @@
fs[2].pc = 15
vbs = [b1, b2]
vrs = [b3]
- capture_resumedata(fs, vbs, vrs, storage)
+ capture_resumedata(fs, vbs, vrs, storagepre)
- frame_info_list = storage.rd_frame_info_list
+ frame_info_list = storagepre.pd_frame_info_list
assert frame_info_list.prev is fs[2].parent_resumedata_frame_info_list
assert frame_info_list.jitcode == 'code2'
assert frame_info_list.pc == 15
- snapshot = storage.rd_snapshot
+ snapshot = storagepre.pd_snapshot
assert snapshot.boxes == vbs
assert snapshot.boxes is not vbs
@@ -287,13 +299,14 @@
def test_rebuild_from_resumedata():
b1, b2, b3 = [BoxInt(), BoxPtr(), BoxInt()]
c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)]
- storage = Storage()
+ storagepre = StoragePre()
fs = [FakeFrame("code0", 0, -1, b1, c1, b2),
FakeFrame("code1", 3, 7, b3, c2, b1),
FakeFrame("code2", 9, -1, c3, b2)]
- capture_resumedata(fs, None, [], storage)
+ capture_resumedata(fs, None, [], storagepre)
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(storage, memo)
+ storage = Storage()
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
liveboxes = modifier.finish({})
metainterp = MyMetaInterp()
@@ -311,13 +324,14 @@
def test_rebuild_from_resumedata_with_virtualizable():
b1, b2, b3, b4 = [BoxInt(), BoxPtr(), BoxInt(), BoxPtr()]
c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)]
- storage = Storage()
+ storagepre = StoragePre()
fs = [FakeFrame("code0", 0, -1, b1, c1, b2),
FakeFrame("code1", 3, 7, b3, c2, b1),
FakeFrame("code2", 9, -1, c3, b2)]
- capture_resumedata(fs, [b4], [], storage)
+ capture_resumedata(fs, [b4], [], storagepre)
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(storage, memo)
+ storage = Storage()
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
liveboxes = modifier.finish({})
metainterp = MyMetaInterp()
@@ -335,20 +349,22 @@
def test_rebuild_from_resumedata_two_guards():
b1, b2, b3, b4 = [BoxInt(), BoxPtr(), BoxInt(), BoxInt()]
c1, c2, c3 = [ConstInt(1), ConstInt(2), ConstInt(3)]
- storage = Storage()
+ storagepre = StoragePre()
fs = [FakeFrame("code0", 0, -1, b1, c1, b2),
FakeFrame("code1", 3, 7, b3, c2, b1),
FakeFrame("code2", 9, -1, c3, b2)]
- capture_resumedata(fs, None, [], storage)
- storage2 = Storage()
+ capture_resumedata(fs, None, [], storagepre)
+ storagepre2 = StoragePre()
fs = fs[:-1] + [FakeFrame("code2", 10, -1, c3, b2, b4)]
- capture_resumedata(fs, None, [], storage2)
-
+ capture_resumedata(fs, None, [], storagepre2)
+
+ storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(storage, memo)
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
liveboxes = modifier.finish({})
- modifier = ResumeDataVirtualAdder(storage2, memo)
+ storage2 = Storage()
+ modifier = ResumeDataVirtualAdder(storagepre2, storage2, memo)
liveboxes2 = modifier.finish({})
metainterp = MyMetaInterp()
@@ -393,29 +409,31 @@
b1, b2, b3, b4, b5 = [BoxInt(), BoxPtr(), BoxInt(), BoxInt(), BoxInt()]
c1, c2, c3, c4 = [ConstInt(1), ConstInt(2), ConstInt(3),
LLtypeMixin.nodebox.constbox()]
- storage = Storage()
+ storagepre = StoragePre()
fs = [FakeFrame("code0", 0, -1, b1, c1, b2),
FakeFrame("code1", 3, 7, b3, c2, b1),
FakeFrame("code2", 9, -1, c3, b2)]
- capture_resumedata(fs, None, [], storage)
- storage2 = Storage()
+ capture_resumedata(fs, None, [], storagepre)
+ storagepre2 = StoragePre()
fs = fs[:-1] + [FakeFrame("code2", 10, -1, c3, b2, b4)]
- capture_resumedata(fs, None, [], storage2)
-
+ capture_resumedata(fs, None, [], storagepre2)
+
+ storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
values = {b2: virtual_value(b2, b5, c4)}
- modifier = ResumeDataVirtualAdder(storage, memo)
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
liveboxes = modifier.finish(values)
assert len(storage.rd_virtuals) == 1
assert storage.rd_virtuals[0].fieldnums == [tag(-1, TAGBOX),
tag(0, TAGCONST)]
+ storage2 = Storage()
b6 = BoxPtr()
v6 = virtual_value(b6, c2, None)
v6.setfield(LLtypeMixin.nextdescr, v6)
values = {b2: virtual_value(b2, b4, v6), b6: v6}
memo.clear_box_virtual_numbers()
- modifier = ResumeDataVirtualAdder(storage2, memo)
+ modifier = ResumeDataVirtualAdder(storagepre2, storage2, memo)
liveboxes2 = modifier.finish(values)
assert len(storage2.rd_virtuals) == 2
assert storage2.rd_virtuals[0].fieldnums == [tag(len(liveboxes2)-1, TAGBOX),
@@ -454,23 +472,25 @@
b1, b2, b3, b4, b5, b6 = [BoxPtr(), BoxPtr(), BoxInt(), BoxPtr(), BoxInt(), BoxInt()]
c1, c2, c3, c4 = [ConstInt(1), ConstInt(2), ConstInt(3),
LLtypeMixin.nodebox.constbox()]
- storage = Storage()
+ storagepre = StoragePre()
fs = [FakeFrame("code0", 0, -1, c1, b2, b3)]
- capture_resumedata(fs, None, [], storage)
-
+ capture_resumedata(fs, None, [], storagepre)
+
+ storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
values = {b2: virtual_value(b2, b5, c4)}
- modifier = ResumeDataVirtualAdder(storage, memo)
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
liveboxes = modifier.finish(values)
assert len(storage.rd_virtuals) == 1
assert storage.rd_virtuals[0].fieldnums == [tag(-1, TAGBOX),
tag(0, TAGCONST)]
- storage2 = Storage()
+ storagepre2 = StoragePre()
fs = [FakeFrame("code0", 0, -1, b1, b4, b2)]
- capture_resumedata(fs, None, [], storage2)
+ capture_resumedata(fs, None, [], storagepre2)
values[b4] = virtual_value(b4, b6, c4)
- modifier = ResumeDataVirtualAdder(storage2, memo)
+ storage2 = Storage()
+ modifier = ResumeDataVirtualAdder(storagepre2, storage2, memo)
liveboxes = modifier.finish(values)
assert len(storage2.rd_virtuals) == 2
assert storage2.rd_virtuals[1].fieldnums == storage.rd_virtuals[0].fieldnums
@@ -479,16 +499,17 @@
def test_resumedata_top_recursive_virtuals():
b1, b2, b3 = [BoxPtr(), BoxPtr(), BoxInt()]
- storage = Storage()
+ storagepre = StoragePre()
fs = [FakeFrame("code0", 0, -1, b1, b2)]
- capture_resumedata(fs, None, [], storage)
-
+ capture_resumedata(fs, None, [], storagepre)
+
+ storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
v1 = virtual_value(b1, b3, None)
v2 = virtual_value(b2, b3, v1)
v1.setfield(LLtypeMixin.nextdescr, v2)
values = {b1: v1, b2: v2}
- modifier = ResumeDataVirtualAdder(storage, memo)
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
liveboxes = modifier.finish(values)
assert liveboxes == [b3]
assert len(storage.rd_virtuals) == 2
@@ -685,7 +706,7 @@
def test_register_virtual_fields():
b1, b2 = BoxInt(), BoxInt()
vbox = BoxPtr()
- modifier = ResumeDataVirtualAdder(None, None)
+ modifier = ResumeDataVirtualAdder(None, None, None)
modifier.liveboxes_from_env = {}
modifier.liveboxes = {}
modifier.vfieldboxes = {}
@@ -694,7 +715,7 @@
b2: UNASSIGNED}
assert modifier.vfieldboxes == {vbox: [b1, b2]}
- modifier = ResumeDataVirtualAdder(None, None)
+ modifier = ResumeDataVirtualAdder(None, None, None)
modifier.liveboxes_from_env = {vbox: tag(0, TAGVIRTUAL)}
modifier.liveboxes = {}
modifier.vfieldboxes = {}
@@ -711,20 +732,21 @@
assert len(newboxes) == len(expected)
return newboxes
-def make_storage(b1, b2, b3):
- storage = Storage()
+def make_storage_pre(b1, b2, b3):
+ storagepre = StoragePre()
snapshot = Snapshot(None, [b1, ConstInt(1), b1, b2])
snapshot = Snapshot(snapshot, [ConstInt(2), ConstInt(3)])
snapshot = Snapshot(snapshot, [b1, b2, b3])
- storage.rd_snapshot = snapshot
- storage.rd_frame_info_list = None
- return storage
+ storagepre.pd_snapshot = snapshot
+ storagepre.pd_frame_info_list = None
+ return storagepre
def test_virtual_adder_int_constants():
b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**16), ConstInt(-65)]
- storage = make_storage(b1s, b2s, b3s)
+ storagepre = make_storage_pre(b1s, b2s, b3s)
+ storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(storage, memo)
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
liveboxes = modifier.finish({})
assert storage.rd_snapshot is None
metainterp = MyMetaInterp()
@@ -741,16 +763,18 @@
def test_virtual_adder_memo_const_sharing():
b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**16), ConstInt(-65)]
- storage = make_storage(b1s, b2s, b3s)
+ storagepre = make_storage_pre(b1s, b2s, b3s)
+ storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(storage, memo)
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
modifier.finish({})
assert len(memo.consts) == 2
assert storage.rd_consts is memo.consts
b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**17), ConstInt(-65)]
- storage2 = make_storage(b1s, b2s, b3s)
- modifier2 = ResumeDataVirtualAdder(storage2, memo)
+ storagepre2 = make_storage_pre(b1s, b2s, b3s)
+ storage2 = Storage()
+ modifier2 = ResumeDataVirtualAdder(storagepre2, storage2, memo)
modifier2.finish({})
assert len(memo.consts) == 3
assert storage2.rd_consts is memo.consts
@@ -758,9 +782,10 @@
def test_virtual_adder_no_op_renaming():
b1s, b2s, b3s = [BoxInt(1), BoxInt(2), BoxInt(3)]
- storage = make_storage(b1s, b2s, b3s)
+ storagepre = make_storage_pre(b1s, b2s, b3s)
+ storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(storage, memo)
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
b1_2 = BoxInt()
class FakeValue(object):
@@ -790,9 +815,10 @@
def test_virtual_adder_make_constant():
b1s, b2s, b3s = [BoxInt(1), BoxPtr(), BoxInt(3)]
b1s = ConstInt(111)
- storage = make_storage(b1s, b2s, b3s)
+ storagepre = make_storage_pre(b1s, b2s, b3s)
+ storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(storage, memo)
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
liveboxes = modifier.finish({})
b2t, b3t = [BoxPtr(demo55o), BoxInt(33)]
newboxes = _resume_remap(liveboxes, [b2s, b3s], b2t, b3t)
@@ -811,9 +837,10 @@
def test_virtual_adder_make_virtual():
b2s, b3s, b4s, b5s = [BoxPtr(), BoxInt(3), BoxPtr(), BoxPtr()]
c1s = ConstInt(111)
+ storagepre = StoragePre()
storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(storage, memo)
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
modifier.liveboxes_from_env = {}
modifier.liveboxes = {}
modifier.vfieldboxes = {}
@@ -884,9 +911,10 @@
def test_virtual_adder_make_varray():
b2s, b4s = [BoxPtr(), BoxInt(4)]
c1s = ConstInt(111)
+ storagepre = StoragePre()
storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(storage, memo)
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
modifier.liveboxes_from_env = {}
modifier.liveboxes = {}
modifier.vfieldboxes = {}
@@ -936,9 +964,10 @@
def test_virtual_adder_make_vstruct():
b2s, b4s = [BoxPtr(), BoxPtr()]
c1s = ConstInt(111)
+ storagepre = StoragePre()
storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(storage, memo)
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
modifier.liveboxes_from_env = {}
modifier.liveboxes = {}
modifier.vfieldboxes = {}
@@ -978,9 +1007,10 @@
def test_virtual_adder_pending_fields():
b2s, b4s = [BoxPtr(), BoxPtr()]
+ storagepre = StoragePre()
storage = Storage()
memo = ResumeDataLoopMemo(FakeMetaInterpStaticData())
- modifier = ResumeDataVirtualAdder(storage, memo)
+ modifier = ResumeDataVirtualAdder(storagepre, storage, memo)
modifier.liveboxes_from_env = {}
modifier.liveboxes = {}
modifier.vfieldboxes = {}
@@ -1023,7 +1053,7 @@
metainterp_sd = FakeMetaInterpStaticData()
metainterp_sd.options = options
memo = ResumeDataLoopMemo(metainterp_sd)
- modifier = ResumeDataVirtualAdder(None, memo)
+ modifier = ResumeDataVirtualAdder(None, None, memo)
for i in range(5):
assert not modifier._invalidation_needed(5, i)
More information about the Pypy-commit
mailing list