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

Reply via email to