[pypy-commit] pypy jit-short_from_state: make optimize_STRGETITEM reusing original result box when emitted
hakanardo
noreply at buildbot.pypy.org
Wed Jul 20 10:19:36 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r45762:298d0583fc21
Date: 2011-07-17 17:05 +0200
http://bitbucket.org/pypy/pypy/changeset/298d0583fc21/
Log: make optimize_STRGETITEM reusing original result box when emitted
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
@@ -6467,6 +6467,62 @@
"""
self.optimize_loop(ops, expected)
+ def test_loopinvariant_strgetitem(self):
+ ops = """
+ [p9, i1]
+ i843 = strgetitem(p9, i1)
+ call(i843, descr=nonwritedescr)
+ jump(p9, i1)
+ """
+ expected = """
+ [p9, i1, i2]
+ call(i2, descr=nonwritedescr)
+ jump(p9, i1, i2)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_loopinvariant_unicodelen(self):
+ ops = """
+ [p9]
+ i843 = unicodelen(p9)
+ call(i843, descr=nonwritedescr)
+ jump(p9)
+ """
+ expected = """
+ [p9, i2]
+ call(i2, descr=nonwritedescr)
+ jump(p9, i2)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_loopinvariant_unicodegetitem(self):
+ ops = """
+ [p9, i1]
+ i843 = unicodegetitem(p9, i1)
+ call(i843, descr=nonwritedescr)
+ jump(p9, i1)
+ """
+ expected = """
+ [p9, i1, i2]
+ call(i2, descr=nonwritedescr)
+ jump(p9, i1, i2)
+ """
+ self.optimize_loop(ops, expected)
+
+ def test_loopinvariant_arraylen(self):
+ ops = """
+ [p9]
+ i843 = arraylen_gc(p9)
+ call(i843, descr=nonwritedescr)
+ jump(p9)
+ """
+ expected = """
+ [p9, i2]
+ call(i2, descr=nonwritedescr)
+ jump(p9, i2)
+ """
+ self.optimize_loop(ops, expected)
+
def test_duplicated_virtual(self):
ops = """
[p1, p2]
diff --git a/pypy/jit/metainterp/optimizeopt/vstring.py b/pypy/jit/metainterp/optimizeopt/vstring.py
--- a/pypy/jit/metainterp/optimizeopt/vstring.py
+++ b/pypy/jit/metainterp/optimizeopt/vstring.py
@@ -349,7 +349,7 @@
optimizer.emit_operation(ResOperation(rop.INT_SUB, [box1, box2], resbox))
return resbox
-def _strgetitem(optimization, strbox, indexbox, mode):
+def _strgetitem(optimization, strbox, indexbox, mode, resbox=None):
if isinstance(strbox, ConstPtr) and isinstance(indexbox, ConstInt):
if mode is mode_string:
s = strbox.getref(lltype.Ptr(rstr.STR))
@@ -357,6 +357,7 @@
else:
s = strbox.getref(lltype.Ptr(rstr.UNICODE))
return ConstInt(ord(s.chars[indexbox.getint()]))
+ if not resbox:
resbox = BoxInt()
optimization.emit_operation(ResOperation(mode.STRGETITEM, [strbox, indexbox],
resbox))
@@ -427,10 +428,11 @@
def _optimize_STRGETITEM(self, op, mode):
value = self.getvalue(op.getarg(0))
vindex = self.getvalue(op.getarg(1))
- vresult = self.strgetitem(value, vindex, mode)
+ vresult = self.strgetitem(value, vindex, mode, op.result)
+ if op.result not in self.optimizer.values:
self.make_equal_to(op.result, vresult)
- def strgetitem(self, value, vindex, mode):
+ def strgetitem(self, value, vindex, mode, result=None):
value.ensure_nonnull()
#
if value.is_virtual() and isinstance(value, VStringSliceValue):
@@ -444,7 +446,7 @@
if vindex.is_constant():
return value.getitem(vindex.box.getint())
#
- resbox = _strgetitem(self, value.force_box(), vindex.force_box(), mode)
+ resbox = _strgetitem(self, value.force_box(), vindex.force_box(), mode, result)
return self.getvalue(resbox)
def optimize_STRLEN(self, op):
More information about the pypy-commit
mailing list