[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