Author: Brian Kearns <[email protected]>
Branch: 
Changeset: r69986:9fca5c72c344
Date: 2014-03-16 18:11 -0400
http://bitbucket.org/pypy/pypy/changeset/9fca5c72c344/

Log:    merge virtual-raw-store-load

diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -1894,6 +1894,40 @@
         """
         self.optimize_loop(ops, expected)
 
+    def test_virtual_raw_store_raw_load(self):
+        ops = """
+        [i1]
+        i0 = call('malloc', 10, descr=raw_malloc_descr)
+        raw_store(i0, 0, i1, descr=rawarraydescr)
+        i2 = raw_load(i0, 0, descr=rawarraydescr)
+        i3 = int_add(i1, i2)
+        call('free', i0, descr=raw_free_descr)
+        jump(i3)
+        """
+        expected = """
+        [i1]
+        i2 = int_add(i1, i1)
+        jump(i2)
+        """
+        self.optimize_loop(ops, expected)
+
+    def test_virtual_raw_store_getarrayitem_raw(self):
+        ops = """
+        [f1]
+        i0 = call('malloc', 16, descr=raw_malloc_descr)
+        raw_store(i0, 8, f1, descr=rawarraydescr_float)
+        f2 = getarrayitem_raw(i0, 1, descr=rawarraydescr_float)
+        f3 = float_add(f1, f2)
+        call('free', i0, descr=raw_free_descr)
+        jump(f3)
+        """
+        expected = """
+        [f1]
+        f2 = float_add(f1, f1)
+        jump(f2)
+        """
+        self.optimize_loop(ops, expected)
+
     def test_duplicate_getfield_1(self):
         ops = """
         [p1, p2]
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py 
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -226,6 +226,8 @@
                                                   hints={'nolength': True}))
     rawarraydescr_char = cpu.arraydescrof(lltype.Array(lltype.Char,
                                                        hints={'nolength': 
True}))
+    rawarraydescr_float = cpu.arraydescrof(lltype.Array(lltype.Float,
+                                                        hints={'nolength': 
True}))
 
     fc_array = lltype.GcArray(
         lltype.Struct(
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py 
b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -779,11 +779,12 @@
                 offset, itemsize, descr = self._unpack_arrayitem_raw_op(op, 
indexbox)
                 try:
                     itemvalue = value.getitem_raw(offset, itemsize, descr)
-                    self.make_equal_to(op.result, itemvalue)
                 except InvalidRawOperation:
                     box = value.force_box(self)
                     op.setarg(0, box)
                     self.emit_operation(op)
+                else:
+                    self.make_equal_to(op.result, itemvalue)
                 return
         value.ensure_nonnull()
         self.emit_operation(op)
@@ -805,6 +806,48 @@
         value.ensure_nonnull()
         self.emit_operation(op)
 
+    def _unpack_raw_load_store_op(self, op, offsetbox):
+        offset = offsetbox.getint()
+        cpu = self.optimizer.cpu
+        descr = op.getdescr()
+        itemsize = cpu.unpack_arraydescr_size(descr)[1]
+        return offset, itemsize, descr
+
+    def optimize_RAW_LOAD(self, op):
+        value = self.getvalue(op.getarg(0))
+        if value.is_virtual():
+            offsetbox = self.get_constant_box(op.getarg(1))
+            if offsetbox is not None:
+                offset, itemsize, descr = self._unpack_raw_load_store_op(op, 
offsetbox)
+                try:
+                    itemvalue = value.getitem_raw(offset, itemsize, descr)
+                except InvalidRawOperation:
+                    box = value.force_box(self)
+                    op.setarg(0, box)
+                    self.emit_operation(op)
+                else:
+                    self.make_equal_to(op.result, itemvalue)
+                return
+        value.ensure_nonnull()
+        self.emit_operation(op)
+
+    def optimize_RAW_STORE(self, op):
+        value = self.getvalue(op.getarg(0))
+        if value.is_virtual():
+            offsetbox = self.get_constant_box(op.getarg(1))
+            if offsetbox is not None:
+                offset, itemsize, descr = self._unpack_raw_load_store_op(op, 
offsetbox)
+                itemvalue = self.getvalue(op.getarg(2))
+                try:
+                    value.setitem_raw(offset, itemsize, descr, itemvalue)
+                except InvalidRawOperation:
+                    box = value.force_box(self)
+                    op.setarg(0, box)
+                    self.emit_operation(op)
+                return
+        value.ensure_nonnull()
+        self.emit_operation(op)
+
     def optimize_GETINTERIORFIELD_GC(self, op):
         value = self.getvalue(op.getarg(0))
         if value.is_virtual():
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to