[pypy-svn] r65873 - in pypy/branch/pyjitpl5/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Mon Jun 22 23:41:26 CEST 2009
Author: arigo
Date: Mon Jun 22 23:41:21 2009
New Revision: 65873
Modified:
pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py
Log:
Arrays in virtualizables, step 2. Done, as far as I see :-)
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py Mon Jun 22 23:41:21 2009
@@ -1439,12 +1439,23 @@
vinfo = self.staticdata.virtualizable_info
if vinfo is not None:
# xxx only write back the fields really modified
- vbox = self.virtualizable_boxes[vinfo.num_static_extra_boxes]
+ vbox = self.virtualizable_boxes[-1]
for i in range(vinfo.num_static_extra_boxes):
fieldbox = self.virtualizable_boxes[i]
self.execute_and_record(rop.SETFIELD_GC, [vbox, fieldbox],
descr=vinfo.static_field_descrs[i])
- # XXX use array_field_descrs too!
+ i = vinfo.num_static_extra_boxes
+ virtualizable = vbox.getptr(vinfo.VTYPEPTR)
+ for k in range(vinfo.num_arrays):
+ abox = self.execute_and_record(rop.GETFIELD_GC, [vbox],
+ descr=vinfo.array_field_descrs[k])
+ for j in range(vinfo.get_array_length(virtualizable, k)):
+ itembox = self.virtualizable_boxes[i]
+ i += 1
+ self.execute_and_record(rop.SETARRAYITEM_GC,
+ [abox, ConstInt(j), itembox],
+ descr=vinfo.array_descrs[k])
+ assert i + 1 == len(self.virtualizable_boxes)
class GenerateMergePoint(Exception):
def __init__(self, args, target_loop):
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_virtualizable.py Mon Jun 22 23:41:21 2009
@@ -175,6 +175,34 @@
self.check_loops(getfield_gc=0, setfield_gc=0,
getarrayitem_gc=0, setarrayitem_gc=0)
+ def test_synchronize_arrays_in_return(self):
+ myjitdriver = JitDriver(greens = [], reds = ['n', 'xy2'],
+ virtualizables = ['xy2'])
+ ARRAY = lltype.GcArray(lltype.Signed)
+ def g(xy2, n):
+ while n > 0:
+ myjitdriver.can_enter_jit(xy2=xy2, n=n)
+ myjitdriver.jit_merge_point(xy2=xy2, n=n)
+ xy2.inst_l2[0] += xy2.inst_x
+ n -= 1
+ def f(n):
+ xy2 = self.setup2()
+ xy2.inst_x = 2
+ xy2.inst_l1 = lltype.malloc(ARRAY, 2)
+ xy2.inst_l1[0] = 1941309
+ xy2.inst_l1[1] = 2941309
+ xy2.inst_l2 = lltype.malloc(ARRAY, 1)
+ xy2.inst_l2[0] = 10000
+ m = 10
+ while m > 0:
+ g(xy2, n)
+ m -= 1
+ return xy2.inst_l2[0]
+ assert f(18) == 10360
+ res = self.meta_interp(f, [18])
+ assert res == 10360
+ self.check_loops(getfield_gc=0, setfield_gc=0)
+
class ImplicitVirtualizableTests:
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/warmspot.py Mon Jun 22 23:41:21 2009
@@ -495,6 +495,7 @@
ARRAYITEMTYPES.append(ARRAYPTR.TO.OF)
#
self.num_static_extra_boxes = len(static_fields)
+ self.num_arrays = len(array_fields)
self.static_field_to_extra_box = dict(
[(name, i) for (i, name) in enumerate(static_fields)])
self.array_field_counter = dict(
@@ -506,9 +507,10 @@
cpu = warmrunnerdesc.cpu
self.static_field_descrs = [cpu.fielddescrof(VTYPEPTR.TO, name)
for name in static_fields]
- self.array_field_descrs = [
- cpu.arraydescrof(getattr(VTYPEPTR.TO, name).TO)
- for name in array_fields]
+ self.array_field_descrs = [cpu.fielddescrof(VTYPEPTR.TO, name)
+ for name in array_fields]
+ self.array_descrs = [cpu.arraydescrof(getattr(VTYPEPTR.TO, name).TO)
+ for name in array_fields]
#
def read_boxes(cpu, virtualizable):
boxes = []
@@ -559,8 +561,16 @@
lst = getattr(virtualizable, fieldname)
index += len(lst)
j = j + 1
- else:
- assert False, "invalid arrayindex"
+ assert False, "invalid arrayindex"
+ #
+ def get_array_length(virtualizable, arrayindex):
+ j = 0
+ for _, fieldname in unroll_array_fields:
+ if arrayindex == j:
+ lst = getattr(virtualizable, fieldname)
+ return len(lst)
+ j = j + 1
+ assert False, "invalid arrayindex"
#
unroll_static_fields = unrolling_iterable(zip(FIELDTYPES,
static_fields))
@@ -570,6 +580,7 @@
self.write_boxes = write_boxes
self.check_boxes = check_boxes
self.get_index_in_array = get_index_in_array
+ self.get_array_length = get_array_length
def _freeze_(self):
return True
More information about the Pypy-commit
mailing list