Author: Antonio Cuni <[email protected]>
Branch: virtual-raw-mallocs
Changeset: r59508:872f7ed4c308
Date: 2012-12-19 18:25 +0100
http://bitbucket.org/pypy/pypy/changeset/872f7ed4c308/
Log: implement virtualstate for virtual raw buffers: it has a lot of code
in common with normal arrays, we should try to factor it out
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -782,8 +782,6 @@
"""
self.optimize_loop(ops, expected)
-
-
def test_p123_simple(self):
ops = """
[i1, p2, p3]
@@ -1888,6 +1886,22 @@
"""
self.optimize_loop(ops, expected)
+ def test_virtual_raw_malloc_virtualstate(self):
+ ops = """
+ [i0]
+ i1 = getarrayitem_raw(i0, 0, descr=rawarraydescr)
+ i2 = int_add(i1, 1)
+ call('free', i0, descr=raw_free_descr)
+ i3 = call('malloc', 10, descr=raw_malloc_descr)
+ setarrayitem_raw(i3, 0, i2, descr=rawarraydescr)
+ jump(i3)
+ """
+ expected = """
+ [i1]
+ i2 = int_add(i1, 1)
+ jump(i2)
+ """
+ self.optimize_loop(ops, expected)
def test_duplicate_getfield_1(self):
ops = """
diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py
b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -374,6 +374,21 @@
self.size = size
self.buffer = RawBuffer()
+ def getitem_raw(self, offset, length, descr):
+ return self.buffer.read_value(offset, length, descr)
+
+ def setitem_raw(self, offset, length, descr, value):
+ self.buffer.write_value(offset, length, descr, value)
+
+ def force_at_end_of_preamble(self, already_forced, optforce):
+ if self in already_forced:
+ return self
+ already_forced[self] = self
+ for i in range(len(self.buffer.values)):
+ value = self.buffer.values[i]
+ self.buffer.values[i] =
value.force_at_end_of_preamble(already_forced, optforce)
+ return self
+
def _really_force(self, optforce):
op = self.source_op
assert op is not None
@@ -401,11 +416,19 @@
descr=descr)
optforce.emit_operation(op)
- def setitem_raw(self, offset, length, descr, value):
- self.buffer.write_value(offset, length, descr, value)
+ def get_args_for_fail(self, modifier):
+ if self.box is None and not modifier.already_seen_virtual(self.keybox):
+ # checks for recursion: it is False unless
+ # we have already seen the very same keybox
+ itemboxes = []
+ for itemvalue in self.buffer.values:
+ itemboxes.append(itemvalue.get_key_box())
+ modifier.register_virtual_fields(self.keybox, itemboxes)
+ for itemvalue in self.buffer.values:
+ itemvalue.get_args_for_fail(modifier)
- def getitem_raw(self, offset, length, descr):
- return self.buffer.read_value(offset, length, descr)
+ def _make_virtual(self, modifier):
+ return modifier.make_vrawbuffer()
class VirtualRawSliceValue(AbstractVirtualValue):
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py
b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -287,6 +287,56 @@
debug_print(indent + 'VArrayStructStateInfo(%d):' % self.position)
+class VRawBufferStateInfo(AbstractVirtualStateInfo):
+ def __init__(self):
+ pass
+
+ def _enum(self, virtual_state):
+ for s in self.fieldstate:
+ s.enum(virtual_state)
+
+ def generalization_of(self, other, renum, bad):
+ assert self.position != -1
+ if self.position in renum:
+ if renum[self.position] == other.position:
+ return True
+ bad[self] = True
+ bad[other] = True
+ return False
+ renum[self.position] = other.position
+ if not self._generalization_of(other):
+ bad[self] = True
+ bad[other] = True
+ return False
+ if len(self.fieldstate) != len(other.fieldstate):
+ bad[self] = True
+ bad[other] = True
+ return False
+ for i in range(len(self.fieldstate)):
+ if not self.fieldstate[i].generalization_of(other.fieldstate[i],
+ renum, bad):
+ bad[self] = True
+ bad[other] = True
+ return False
+ return True
+
+ def _generalization_of(self, other):
+ return isinstance(other, VRawBufferStateInfo)
+
+ def enum_forced_boxes(self, boxes, value, optimizer):
+ if not isinstance(value, virtualize.VirtualRawBufferValue):
+ raise BadVirtualState
+ if not value.is_virtual():
+ raise BadVirtualState
+ for i in range(len(self.fieldstate)):
+ try:
+ v = value.buffer.values[i]
+ except IndexError:
+ raise BadVirtualState
+ s = self.fieldstate[i]
+ if s.position > self.position:
+ s.enum_forced_boxes(boxes, v, optimizer)
+
class NotVirtualStateInfo(AbstractVirtualStateInfo):
def __init__(self, value, is_opaque=False):
self.is_opaque = is_opaque
@@ -579,6 +629,9 @@
def make_varraystruct(self, arraydescr, fielddescrs):
return VArrayStructStateInfo(arraydescr, fielddescrs)
+ def make_vrawbuffer(self):
+ return VRawBufferStateInfo()
+
class BoxNotProducable(Exception):
pass
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit