[pypy-commit] pypy default: I think we no longer need the 'create_ops' flag. It was added as
arigo
pypy.commits at gmail.com
Sat Feb 25 04:03:33 EST 2017
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r90348:da6be6540744
Date: 2017-02-25 10:03 +0100
http://bitbucket.org/pypy/pypy/changeset/da6be6540744/
Log: I think we no longer need the 'create_ops' flag. It was added as
replacement for a limitation of the previous state of the world, but
there is no reason to keep that logic. Added a test that shows
better results without it (it's a case I've seen in pypy, and the
removed 'strlen' means a guard afterwards will be dropped)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -4840,6 +4840,21 @@
"""
self.optimize_strunicode_loop(ops, expected)
+ def test_nonvirtual_newstr_strlen(self):
+ ops = """
+ [p0]
+ p1 = call_r(0, p0, s"X", descr=strconcatdescr)
+ i0 = strlen(p1)
+ finish(i0)
+ """
+ expected = """
+ [p0]
+ i2 = strlen(p0)
+ i4 = int_add(i2, 1)
+ finish(i4)
+ """
+ self.optimize_strunicode_loop(ops, expected)
+
def test_copy_long_string_to_virtual(self):
ops = """
[]
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -60,7 +60,6 @@
self.length = length
self._is_virtual = is_virtual
self.mode = mode
- self.length = length
def getlenbound(self, mode):
from rpython.jit.metainterp.optimizeopt import intutils
@@ -110,12 +109,11 @@
return self.string_copy_parts(op, string_optimizer, targetbox,
offsetbox, mode)
- def getstrlen(self, op, string_optimizer, mode, create_ops=True):
+ def getstrlen(self, op, string_optimizer, mode):
+ assert op is not None
if self.lgtop is not None:
return self.lgtop
assert not self.is_virtual()
- if not create_ops:
- return None
lengthop = ResOperation(mode.STRLEN, [op])
lengthop.set_forwarded(self.getlenbound(mode))
self.lgtop = lengthop
@@ -172,7 +170,8 @@
def is_virtual(self):
return self._is_virtual
- def getstrlen(self, op, string_optimizer, mode, create_ops=True):
+ def getstrlen(self, op, string_optimizer, mode):
+ assert op is not None
if self.lgtop is None:
self.lgtop = ConstInt(len(self._chars))
return self.lgtop
@@ -251,7 +250,8 @@
return s1[start : start + length]
return None
- def getstrlen(self, op, string_optimizer, mode, create_ops=True):
+ def getstrlen(self, op, string_optimizer, mode):
+ assert op is not None
return self.lgtop
def _visitor_walk_recursive(self, instbox, visitor, optimizer):
@@ -280,20 +280,19 @@
def is_virtual(self):
return self._is_virtual
- def getstrlen(self, op, string_optimizer, mode, create_ops=True):
+ def getstrlen(self, op, string_optimizer, mode):
+ assert op is not None
if self.lgtop is not None:
return self.lgtop
lefti = string_optimizer.getptrinfo(self.vleft)
- len1box = lefti.getstrlen(self.vleft, string_optimizer, mode,
- create_ops)
+ len1box = lefti.getstrlen(self.vleft, string_optimizer, mode)
if len1box is None:
return None
righti = string_optimizer.getptrinfo(self.vright)
- len2box = righti.getstrlen(self.vright, string_optimizer, mode,
- create_ops)
+ len2box = righti.getstrlen(self.vright, string_optimizer, mode)
if len2box is None:
return None
- self.lgtop = _int_add(string_optimizer, len1box, len2box, create_ops)
+ self.lgtop = _int_add(string_optimizer, len1box, len2box)
# ^^^ may still be None, if string_optimizer is None
return self.lgtop
@@ -371,7 +370,7 @@
offsetbox = nextoffsetbox
return offsetbox
-def _int_add(string_optimizer, box1, box2, create_ops=True):
+def _int_add(string_optimizer, box1, box2):
if isinstance(box1, ConstInt):
if box1.value == 0:
return box2
@@ -379,8 +378,6 @@
return ConstInt(box1.value + box2.value)
elif isinstance(box2, ConstInt) and box2.value == 0:
return box1
- if not create_ops:
- return None
op = ResOperation(rop.INT_ADD, [box1, box2])
string_optimizer.send_extra_operation(op)
return op
@@ -529,9 +526,10 @@
return self._optimize_STRLEN(op, mode_unicode)
def _optimize_STRLEN(self, op, mode):
- opinfo = self.getptrinfo(op.getarg(0))
+ arg1 = self.get_box_replacement(op.getarg(0))
+ opinfo = self.getptrinfo(arg1)
if opinfo:
- lgtop = opinfo.getstrlen(op, self, mode, False)
+ lgtop = opinfo.getstrlen(arg1, self, mode)
if lgtop is not None:
self.make_equal_to(op, lgtop)
return
@@ -700,11 +698,11 @@
i2 = self.getptrinfo(arg2)
#
if i1:
- l1box = i1.getstrlen(arg1, self, mode, create_ops=False)
+ l1box = i1.getstrlen(arg1, self, mode)
else:
l1box = None
if i2:
- l2box = i2.getstrlen(arg2, self, mode, create_ops=False)
+ l2box = i2.getstrlen(arg2, self, mode)
else:
l2box = None
if (l1box is not None and l2box is not None and
@@ -742,7 +740,7 @@
l2box = None
l1box = None
if i2:
- l2box = i2.getstrlen(arg2, self, mode, create_ops=False)
+ l2box = i2.getstrlen(arg2, self, mode)
if isinstance(l2box, ConstInt):
if l2box.value == 0:
if i1 and i1.is_nonnull():
@@ -760,7 +758,7 @@
return True, None
if l2box.value == 1:
if i1:
- l1box = i1.getstrlen(arg1, self, mode, False)
+ l1box = i1.getstrlen(arg1, self, mode)
if isinstance(l1box, ConstInt) and l1box.value == 1:
# comparing two single chars
vchar1 = self.strgetitem(None, arg1, optimizer.CONST_0,
@@ -799,7 +797,7 @@
i2 = self.getptrinfo(arg2)
l2box = None
if i2:
- l2box = i2.getstrlen(arg1, self, mode, create_ops=False)
+ l2box = i2.getstrlen(arg1, self, mode)
if l2box:
l2info = self.getintbound(l2box)
if l2info.is_constant():
@@ -822,12 +820,14 @@
return False, None
def opt_call_stroruni_STR_CMP(self, op, mode):
- i1 = self.getptrinfo(op.getarg(1))
- i2 = self.getptrinfo(op.getarg(2))
+ arg1 = self.get_box_replacement(op.getarg(1))
+ arg2 = self.get_box_replacement(op.getarg(2))
+ i1 = self.getptrinfo(arg1)
+ i2 = self.getptrinfo(arg2)
if not i1 or not i2:
return False, None
- l1box = i1.getstrlen(None, self, mode, False)
- l2box = i2.getstrlen(None, self, mode, False)
+ l1box = i1.getstrlen(arg1, self, mode)
+ l2box = i2.getstrlen(arg2, self, mode)
if (l1box is not None and l2box is not None and
isinstance(l1box, ConstInt) and
isinstance(l2box, ConstInt) and
More information about the pypy-commit
mailing list