[pypy-commit] pypy virtual-raw-store-load: raw_load/raw_store take offset not index
bdkearns
noreply at buildbot.pypy.org
Sun Mar 16 22:40:25 CET 2014
Author: Brian Kearns <bdkearns at gmail.com>
Branch: virtual-raw-store-load
Changeset: r69983:a56510bcbcc8
Date: 2014-03-16 14:30 -0700
http://bitbucket.org/pypy/pypy/changeset/a56510bcbcc8/
Log: raw_load/raw_store take offset not index
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,7 +1894,7 @@
"""
self.optimize_loop(ops, expected)
- def test_virtual_raw_store_load(self):
+ def test_virtual_raw_store_raw_load(self):
ops = """
[i1]
i0 = call('malloc', 10, descr=raw_malloc_descr)
@@ -1911,6 +1911,23 @@
"""
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
@@ -788,8 +788,6 @@
value.ensure_nonnull()
self.emit_operation(op)
- optimize_RAW_LOAD = optimize_GETARRAYITEM_RAW
-
def optimize_SETARRAYITEM_RAW(self, op):
value = self.getvalue(op.getarg(0))
if value.is_virtual():
@@ -807,7 +805,46 @@
value.ensure_nonnull()
self.emit_operation(op)
- optimize_RAW_STORE = optimize_SETARRAYITEM_RAW
+ 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)
+ self.make_equal_to(op.result, 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_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))
More information about the pypy-commit
mailing list