Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77596:16e9621a82bd
Date: 2015-05-26 20:16 +0200
http://bitbucket.org/pypy/pypy/changeset/16e9621a82bd/

Log:    enough to pass the first string equality test

diff --git a/rpython/jit/metainterp/optimizeopt/info.py 
b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -334,7 +334,7 @@
     def get_constant_string_spec(self, optforce, mode):
         return self._unpack_str(mode)
     
-    def getstrlen(self, op, string_optimizer, mode, ignored):
+    def getstrlen(self, op, string_optimizer, mode, create_ops=True):
         return ConstInt(len(self._unpack_str(mode)))
 
     def string_copy_parts(self, op, string_optimizer, targetbox, offsetbox,
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
@@ -87,7 +87,7 @@
                 optforce.get_box_replacement(op).set_forwarded(c_s)
                 return
         self._is_virtual = False
-        lengthbox = self.getstrlen(op, optforce, self.mode, None)
+        lengthbox = self.getstrlen(op, optforce, self.mode)
         newop = ResOperation(self.mode.NEWSTR, [lengthbox])
         if not we_are_translated():
             newop.name = 'FORCE'
@@ -104,19 +104,19 @@
         return self.string_copy_parts(op, string_optimizer, targetbox,
                                       offsetbox, mode)
 
-    def getstrlen(self, op, string_optimizer, mode, lengthop):
+    def getstrlen(self, op, string_optimizer, mode, create_ops=True):
         if self.lgtop is not None:
             return self.lgtop
-        if string_optimizer is None:
+        assert not self.is_virtual()
+        #if lengthop is not None:
+        #    xxx
+        #    box = self.force_box(op, string_optimizer)
+        #    lengthop = string_optimizer.optimizer.replace_op_with(lengthop,
+        #        mode.STRLEN, [box])
+        #else:
+        if not create_ops:
             return None
-        assert not self.is_virtual()
-        if lengthop is not None:
-            xxx
-            box = self.force_box(op, string_optimizer)
-            lengthop = string_optimizer.optimizer.replace_op_with(lengthop,
-                mode.STRLEN, [box])
-        else:
-            lengthop = ResOperation(mode.STRLEN, [op])
+        lengthop = ResOperation(mode.STRLEN, [op])
         self.lgtop = lengthop
         string_optimizer.emit_operation(lengthop)
         return lengthop
@@ -126,7 +126,7 @@
          # Copies the pointer-to-string 'self' into the target string
          # given by 'targetbox', at the specified offset.  Returns the offset
          # at the end of the copy.
-         lengthbox = self.getstrlen(op, string_optimizer, mode, None)
+         lengthbox = self.getstrlen(op, string_optimizer, mode)
          srcbox = self.force_box(op, string_optimizer)
          return copy_str_content(string_optimizer, srcbox, targetbox,
                                  CONST_0, offsetbox, lengthbox, mode)
@@ -149,7 +149,7 @@
     def is_virtual(self):
         return self._is_virtual
 
-    def getstrlen(self, op, string_optimizer, mode, lengthop):
+    def getstrlen(self, op, string_optimizer, mode, create_ops=True):
         if self.lgtop is None:
             self.lgtop = ConstInt(len(self._chars))
         return self.lgtop
@@ -190,18 +190,20 @@
     def is_virtual(self):
         return self._is_virtual
 
-    def getstrlen(self, op, string_optimizer, mode, ignored):
+    def getstrlen(self, op, string_optimizer, mode, create_ops=True):
         if self.lgtop is not None:
             return self.lgtop
         lefti = string_optimizer.getptrinfo(self.vleft)
-        len1box = lefti.getstrlen(self.vleft, string_optimizer, mode, None)
+        len1box = lefti.getstrlen(self.vleft, string_optimizer, mode,
+                                  create_ops)
         if len1box is None:
             return None
         righti = string_optimizer.getptrinfo(self.vright)
-        len2box = righti.getstrlen(self.vright, string_optimizer, mode, None)
+        len2box = righti.getstrlen(self.vright, string_optimizer, mode,
+                                   create_ops)
         if len2box is None:
             return None
-        self.lgtop = _int_add(string_optimizer, len1box, len2box)
+        self.lgtop = _int_add(string_optimizer, len1box, len2box, create_ops)
             # ^^^ may still be None, if string_optimizer is None
         return self.lgtop
 
@@ -527,7 +529,7 @@
         offsetbox = nextoffsetbox
     return offsetbox
 
-def _int_add(string_optimizer, box1, box2):
+def _int_add(string_optimizer, box1, box2, create_ops=True):
     if isinstance(box1, ConstInt):
         if box1.value == 0:
             return box2
@@ -535,7 +537,7 @@
             return ConstInt(box1.value + box2.value)
     elif isinstance(box2, ConstInt) and box2.value == 0:
         return box1
-    if string_optimizer is None:
+    if not create_ops:
         return None
     op = ResOperation(rop.INT_ADD, [box1, box2])
     string_optimizer.send_extra_operation(op)
@@ -653,13 +655,14 @@
                 if result is not None:
                     return result
         #
-        if isinstance(value, VStringConcatValue) and vindex.is_constant():
-            len1box = value.left.getstrlen(self, mode, None)
+        if isinstance(sinfo, VStringConcatInfo) and vindex.is_constant():
+            leftinfo = self.getptrinfo(sinfo.vleft)
+            len1box = leftinfo.getstrlen(sinfo.vleft, self, mode)
             if isinstance(len1box, ConstInt):
-                index = vindex.box.getint()
+                index = vindex.getint()
                 len1 = len1box.getint()
                 if index < len1:
-                    return self.strgetitem(value.left, vindex, mode)
+                    return self.strgetitem(sinfo.vleft, leftinfo, vindex, mode)
                 else:
                     vindex = optimizer.ConstantIntValue(ConstInt(index - len1))
                     return self.strgetitem(value.right, vindex, mode)
@@ -824,11 +827,13 @@
         return True
 
     def opt_call_stroruni_STR_EQUAL(self, op, mode):
-        v1 = self.getvalue(op.getarg(1))
-        v2 = self.getvalue(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)
         #
-        l1box = v1.getstrlen(None, mode, None)
-        l2box = v2.getstrlen(None, mode, None)
+        l1box = i1.getstrlen(arg1, self, mode, create_ops=False)
+        l2box = i2.getstrlen(arg2, self, mode, create_ops=False)
         if (l1box is not None and l2box is not None and
             isinstance(l1box, ConstInt) and
             isinstance(l2box, ConstInt) and
@@ -837,7 +842,7 @@
             self.make_constant(op, CONST_0)
             return True
         #
-        if self.handle_str_equal_level1(v1, v2, op, mode):
+        if self.handle_str_equal_level1(arg1, arg2, op, mode):
             return True
         if self.handle_str_equal_level1(v2, v1, op, mode):
             return True
@@ -856,8 +861,10 @@
             return True
         return False
 
-    def handle_str_equal_level1(self, v1, v2, resultop, mode):
-        l2box = v2.getstrlen(None, mode, None)
+    def handle_str_equal_level1(self, arg1, arg2, resultop, mode):
+        i1 = self.getptrinfo(arg1)
+        i2 = self.getptrinfo(arg2)
+        l2box = i2.getstrlen(arg1, self, mode, create_ops=False)
         if isinstance(l2box, ConstInt):
             if l2box.value == 0:
                 lengthbox = v1.getstrlen(self, mode, None)
@@ -868,15 +875,14 @@
                 seo(op)
                 return True
             if l2box.value == 1:
-                l1box = v1.getstrlen(None, mode, None)
+                l1box = i1.getstrlen(arg1, self, mode, False)
                 if isinstance(l1box, ConstInt) and l1box.value == 1:
                     # comparing two single chars
-                    vchar1 = self.strgetitem(v1, optimizer.CVAL_ZERO, mode)
-                    vchar2 = self.strgetitem(v2, optimizer.CVAL_ZERO, mode)
+                    vchar1 = self.strgetitem(arg1, i1, optimizer.CONST_0, mode)
+                    vchar2 = self.strgetitem(arg2, i2, optimizer.CONST_0, mode)
                     seo = self.optimizer.send_extra_operation
                     op = self.optimizer.replace_op_with(resultop, rop.INT_EQ,
-                          [vchar1.force_box(self), vchar2.force_box(self)],
-                        descr=DONT_CHANGE)
+                                [vchar1, vchar2], descr=DONT_CHANGE)
                     seo(op)
                     return True
                 if isinstance(v1, VStringSliceValue):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to