Author: Brian Kearns <[email protected]>
Branch: 
Changeset: r70013:5da6957bd86b
Date: 2014-03-17 09:20 -0400
http://bitbucket.org/pypy/pypy/changeset/5da6957bd86b/

Log:    virtual raw buffers force using raw_store rather than int_add +
        setarrayitem_raw

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
@@ -1785,11 +1785,12 @@
     def test_virtual_raw_malloc_force(self):
         ops = """
         [i1]
-        i2 = call('malloc', 10, descr=raw_malloc_descr)
+        i2 = call('malloc', 20, descr=raw_malloc_descr)
         guard_no_exception() []
         setarrayitem_raw(i2, 0, i1, descr=rawarraydescr_char)
         setarrayitem_raw(i2, 2, 456, descr=rawarraydescr_char)
         setarrayitem_raw(i2, 1, 123, descr=rawarraydescr_char)
+        setarrayitem_raw(i2, 1, 789, descr=rawarraydescr_float)
         label('foo') # we expect the buffer to be forced *after* the label
         escape(i2)
         call('free', i2, descr=raw_free_descr)
@@ -1798,13 +1799,12 @@
         expected = """
         [i1]
         label('foo')
-        i2 = call('malloc', 10, descr=raw_malloc_descr)
+        i2 = call('malloc', 20, descr=raw_malloc_descr)
         guard_no_exception() []
-        setarrayitem_raw(i2, 0, i1, descr=rawarraydescr_char)
-        i3 = int_add(i2, 1)
-        setarrayitem_raw(i3, 0, 123, descr=rawarraydescr_char)
-        i4 = int_add(i2, 2)
-        setarrayitem_raw(i4, 0, 456, descr=rawarraydescr_char)
+        raw_store(i2, 0, i1, descr=rawarraydescr_char)
+        raw_store(i2, 1, 123, descr=rawarraydescr_char)
+        raw_store(i2, 2, 456, descr=rawarraydescr_char)
+        raw_store(i2, 8, 789, descr=rawarraydescr_float)
         escape(i2)
         call('free', i2, descr=raw_free_descr)
         jump(i1)
@@ -1827,7 +1827,7 @@
         label('foo')
         i2 = call('malloc', 10, descr=raw_malloc_descr)
         guard_no_exception() []
-        setarrayitem_raw(i2, 0, i1, descr=rawarraydescr)
+        raw_store(i2, 0, i1, descr=rawarraydescr)
         setarrayitem_raw(i2, 2, 456, descr=rawarraydescr_char)
         call('free', i2, descr=raw_free_descr)
         jump(i1)
@@ -1850,7 +1850,7 @@
         label('foo')
         i2 = call('malloc', 10, descr=raw_malloc_descr)
         guard_no_exception() []
-        setarrayitem_raw(i2, 0, i1, descr=rawarraydescr)
+        raw_store(i2, 0, i1, descr=rawarraydescr)
         i3 = getarrayitem_raw(i2, 0, descr=rawarraydescr_char)
         call('free', i2, descr=raw_free_descr)
         jump(i1)
@@ -1913,9 +1913,8 @@
         # these ops are generated by VirtualRawBufferValue._really_force
         i2 = call('malloc', 10, descr=raw_malloc_descr)
         guard_no_exception() []
-        setarrayitem_raw(i2, 0, 42, descr=rawarraydescr_char)
-        i3 = int_add(i2, 5) # 1+4*sizeof(char)
-        setarrayitem_raw(i3, 0, 4242, descr=rawarraydescr_char)
+        raw_store(i2, 0, 42, descr=rawarraydescr_char)
+        raw_store(i2, 5, 4242, descr=rawarraydescr_char)
         # this is generated by VirtualRawSliceValue._really_force
         i4 = int_add(i2, 1)
         escape(i4)
@@ -1943,7 +1942,7 @@
         label('foo')
         i3 = call('malloc', 10, descr=raw_malloc_descr)
         guard_no_exception() []
-        setarrayitem_raw(i3, 0, i2, descr=rawarraydescr)
+        raw_store(i3, 0, i2, descr=rawarraydescr)
         jump(i3)
         """
         self.optimize_loop(ops, expected)
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
@@ -432,22 +432,13 @@
         optforce.emit_operation(self.source_op)
         self.box = self.source_op.result
         for i in range(len(self.buffer.offsets)):
-            # get a pointer to self.box+offset
+            # write the value
             offset = self.buffer.offsets[i]
-            if offset == 0:
-                arraybox = self.box
-            else:
-                arraybox = BoxInt()
-                op = ResOperation(rop.INT_ADD,
-                                  [self.box, ConstInt(offset)], arraybox)
-                optforce.emit_operation(op)
-            #
-            # write the value
             descr = self.buffer.descrs[i]
             itemvalue = self.buffer.values[i]
             itembox = itemvalue.force_box(optforce)
-            op = ResOperation(rop.SETARRAYITEM_RAW,
-                              [arraybox, ConstInt(0), itembox], None,
+            op = ResOperation(rop.RAW_STORE,
+                              [self.box, ConstInt(offset), itembox], None,
                               descr=descr)
             optforce.emit_operation(op)
 
diff --git a/rpython/jit/metainterp/test/test_virtual.py 
b/rpython/jit/metainterp/test/test_virtual.py
--- a/rpython/jit/metainterp/test/test_virtual.py
+++ b/rpython/jit/metainterp/test/test_virtual.py
@@ -1196,7 +1196,7 @@
         assert res == 45
         # make sure that the raw buffer is *not* virtualized because we do not
         # support virtualstate
-        self.check_resops(getarrayitem_raw=2, setarrayitem_raw=2)
+        self.check_resops(getarrayitem_raw=2, raw_store=2)
 
     def test_raw_malloc_only_chars(self):
         mydriver = JitDriver(greens=[], reds = 'auto')
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to