Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77605:2a035324c0f8
Date: 2015-05-27 09:07 +0200
http://bitbucket.org/pypy/pypy/changeset/2a035324c0f8/

Log:    blind fixes on str equality

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
@@ -5,7 +5,8 @@
 from rpython.jit.metainterp.optimizeopt.optimizer import CONST_0, CONST_1
 from rpython.jit.metainterp.optimizeopt.optimizer import llhelper, REMOVED
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
-from rpython.jit.metainterp.resoperation import rop, ResOperation, DONT_CHANGE
+from rpython.jit.metainterp.resoperation import rop, ResOperation, 
DONT_CHANGE,\
+     AbstractResOp
 from rpython.jit.metainterp.optimizeopt import info
 from rpython.rlib.objectmodel import specialize, we_are_translated
 from rpython.rlib.unroll import unrolling_iterable
@@ -558,17 +559,14 @@
     if lgt.is_constant() and lgt.getint() <= M:
         # up to M characters are done "inline", i.e. with STRGETITEM/STRSETITEM
         # instead of just a COPYSTRCONTENT.
-        xxx
-        for i in range(lengthbox.value):
+        for i in range(lengthbox.getint()):
             charbox = _strgetitem(string_optimizer, srcbox, srcoffsetbox, mode)
             srcoffsetbox = _int_add(string_optimizer, srcoffsetbox, CONST_1)
             assert not isinstance(targetbox, Const)# ConstPtr never makes sense
-            string_optimizer.emit_operation(ResOperation(mode.STRSETITEM, 
[targetbox,
-                                                                           
offsetbox,
-                                                                           
charbox]))
+            string_optimizer.emit_operation(ResOperation(mode.STRSETITEM,
+                    [targetbox, offsetbox, charbox]))
             offsetbox = _int_add(string_optimizer, offsetbox, CONST_1)
     else:
-        uuu
         if need_next_offset:
             nextoffsetbox = _int_add(string_optimizer, offsetbox, lengthbox)
         else:
@@ -684,7 +682,7 @@
 
     def _optimize_STRGETITEM(self, op, mode):
         res = self.strgetitem(op, op.getarg(0), op.getarg(1), mode)
-        if res is not None:
+        if res is not None and not isinstance(res, AbstractResOp):
             self.make_equal_to(op, res)
 
     def strgetitem(self, op, s, index, mode):
@@ -869,6 +867,8 @@
     def opt_call_stroruni_STR_EQUAL(self, op, mode):
         arg1 = self.get_box_replacement(op.getarg(1))
         arg2 = self.get_box_replacement(op.getarg(2))
+        self.make_nonnull_str(arg1, mode)
+        self.make_nonnull_str(arg2, mode)
         i1 = self.getptrinfo(arg1)
         i2 = self.getptrinfo(arg2)
         #
@@ -884,20 +884,19 @@
         #
         if self.handle_str_equal_level1(arg1, arg2, op, mode):
             return True
-        if self.handle_str_equal_level1(v2, v1, op, mode):
+        if self.handle_str_equal_level1(arg2, arg1, op, mode):
             return True
-        if self.handle_str_equal_level2(v1, v2, op, mode):
+        if self.handle_str_equal_level2(arg1, arg2, op, mode):
             return True
-        if self.handle_str_equal_level2(v2, v1, op, mode):
+        if self.handle_str_equal_level2(arg2, arg1, op, mode):
             return True
         #
-        if v1.is_nonnull() and v2.is_nonnull():
+        if i1.is_nonnull() and i2.is_nonnull():
             if l1box is not None and l2box is not None and 
l1box.same_box(l2box):
                 do = EffectInfo.OS_STREQ_LENGTHOK
             else:
                 do = EffectInfo.OS_STREQ_NONNULL
-            self.generate_modified_call(do, [v1.force_box(self),
-                                             v2.force_box(self)], op, mode)
+            self.generate_modified_call(do, [arg1, arg2], op, mode)
             return True
         return False
 
@@ -935,37 +934,40 @@
                                                      resultop, mode)
                     return True
         #
-        if v2.is_null():
-            if v1.is_nonnull():
+        if i2.is_null():
+            if i1.is_nonnull():
                 self.make_constant(resultop, CONST_0)
                 return True
-            if v1.is_null():
+            if i1.is_null():
                 self.make_constant(resultop, CONST_1)
                 return True
             op = self.optimizer.replace_op_with(resultop, rop.PTR_EQ,
-                                                [v1.force_box(self),
-                                                 llhelper.CONST_NULL],
-                descr=DONT_CHANGE)
+                                                [arg1, llhelper.CONST_NULL],
+                                                descr=DONT_CHANGE)
             self.emit_operation(op)
             return True
         #
         return False
 
-    def handle_str_equal_level2(self, v1, v2, resultbox, mode):
-        l2box = v2.getstrlen(None, mode, None)
-        if isinstance(l2box, ConstInt):
-            if l2box.value == 1:
-                vchar = self.strgetitem(v2, optimizer.CVAL_ZERO, mode)
-                if v1.is_nonnull():
-                    do = EffectInfo.OS_STREQ_NONNULL_CHAR
-                else:
-                    do = EffectInfo.OS_STREQ_CHECKNULL_CHAR
-                self.generate_modified_call(do, [v1.force_box(self),
-                                                 vchar.force_box(self)], 
resultbox,
-                                            mode)
-                return True
-        #
-        if v1.is_virtual() and isinstance(v1, VStringSliceValue):
+    def handle_str_equal_level2(self, arg1, arg2, resultbox, mode):
+        i1 = self.getptrinfo(arg1)
+        i2 = self.getptrinfo(arg2)
+        l2box = i2.getstrlen(arg1, self, mode, create_ops=False)
+        if l2box:
+            l2info = self.getintbound(l2box)
+            if l2info.is_constant():
+                if l2info.getint() == 1:
+                    vchar = self.strgetitem(v2, optimizer.CVAL_ZERO, mode)
+                    if v1.is_nonnull():
+                        do = EffectInfo.OS_STREQ_NONNULL_CHAR
+                    else:
+                        do = EffectInfo.OS_STREQ_CHECKNULL_CHAR
+                    self.generate_modified_call(do, [v1.force_box(self),
+                                                     vchar.force_box(self)], 
resultbox,
+                                                mode)
+                    return True
+            #
+        if i1.is_virtual() and isinstance(i1, VStringSliceInfo):
             if v2.is_nonnull():
                 do = EffectInfo.OS_STREQ_SLICE_NONNULL
             else:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to