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