[pypy-commit] pypy default: Emit strgetiteim from the string optimization in a way that allows it to be seen by other optimizers.
alex_gaynor
noreply at buildbot.pypy.org
Thu Jun 23 01:47:19 CEST 2011
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch:
Changeset: r45066:fe17cc28746d
Date: 2011-06-22 16:52 -0700
http://bitbucket.org/pypy/pypy/changeset/fe17cc28746d/
Log: Emit strgetiteim from the string optimization in a way that allows
it to be seen by other optimizers.
diff --git a/pypy/jit/metainterp/optimizeopt/string.py b/pypy/jit/metainterp/optimizeopt/string.py
--- a/pypy/jit/metainterp/optimizeopt/string.py
+++ b/pypy/jit/metainterp/optimizeopt/string.py
@@ -348,7 +348,7 @@
optimizer.emit_operation(ResOperation(rop.INT_SUB, [box1, box2], resbox))
return resbox
-def _strgetitem(optimizer, strbox, indexbox, mode):
+def _strgetitem(optimization, strbox, indexbox, mode):
if isinstance(strbox, ConstPtr) and isinstance(indexbox, ConstInt):
if mode is mode_string:
s = strbox.getref(lltype.Ptr(rstr.STR))
@@ -357,7 +357,7 @@
s = strbox.getref(lltype.Ptr(rstr.UNICODE))
return ConstInt(ord(s.chars[indexbox.getint()]))
resbox = BoxInt()
- optimizer.emit_operation(ResOperation(mode.STRGETITEM, [strbox, indexbox],
+ optimization.emit_operation(ResOperation(mode.STRGETITEM, [strbox, indexbox],
resbox))
return resbox
@@ -440,8 +440,7 @@
if vindex.is_constant():
return value.getitem(vindex.box.getint())
#
- resbox = _strgetitem(self.optimizer,
- value.force_box(),vindex.force_box(), mode)
+ resbox = _strgetitem(self, value.force_box(), vindex.force_box(), mode)
return self.getvalue(resbox)
def optimize_STRLEN(self, op):
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -4480,6 +4480,24 @@
# not obvious, because of the exception UnicodeDecodeError that
# can be raised by ll_str2unicode()
+ def test_strgetitem_repeated(self):
+ ops = """
+ [p0, i0]
+ i1 = strgetitem(p0, i0)
+ i2 = strgetitem(p0, i0)
+ i3 = int_eq(i1, i2)
+ guard_true(i3) []
+ escape(i2)
+ jump(p0, i0)
+ """
+ expected = """
+ [p0, i0]
+ i1 = strgetitem(p0, i0)
+ escape(i1)
+ jump(p0, i0)
+ """
+ self.optimize_loop(ops, expected)
+
##class TestOOtype(BaseTestOptimizeBasic, OOtypeMixin):
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
@@ -5323,7 +5323,6 @@
"""
expected = """
[p0, i0]
- i1 = strgetitem(p0, i0)
jump(p0, i0)
"""
self.optimize_loop(ops, expected)
@@ -5338,7 +5337,6 @@
"""
expected = """
[p0, i0]
- i1 = unicodegetitem(p0, i0)
jump(p0, i0)
"""
self.optimize_loop(ops, expected)
More information about the pypy-commit
mailing list