[pypy-commit] pypy result-in-resops: string concat

fijal noreply at buildbot.pypy.org
Wed Sep 26 14:37:04 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57608:a02c588271f1
Date: 2012-09-26 14:14 +0200
http://bitbucket.org/pypy/pypy/changeset/a02c588271f1/

Log:	string concat

diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -179,8 +179,7 @@
                 self.pure(args[0], rop.INT_ADD, result, args[1])
                 self.pure(args[1], rop.INT_SUB, args[0], result)
             elif opnum == rop.INT_MUL_OVF:
-                xxxx
-                self.pure(rop.INT_MUL, args[:], result)
+                self.pure(result, rop.INT_MUL, args[0], args[1])
         self.emit_operation(op)
 
     def optimize_GUARD_OVERFLOW(self, op):
@@ -225,8 +224,7 @@
         v2 = self.getvalue(op.getarg(1))
         resbound = v1.intbound.mul_bound(v2.intbound)
         if resbound.bounded():
-            xxx
-            op = op.copy_and_change(rop.INT_MUL)
+            op = self.optimizer.copy_and_change(op, rop.INT_MUL)
         self.emit_operation(op)
         r = self.getvalue(op)
         r.intbound.intersect(resbound)
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
@@ -4027,7 +4027,7 @@
     def test_str_concat_1(self):
         ops = """
         [p1, p2]
-        p3 = call(0, p1, p2, descr=strconcatdescr)
+        p3 = call_r(0, p1, p2, descr=strconcatdescr)
         jump(p2, p3)
         """
         expected = """
diff --git a/pypy/jit/metainterp/optimizeopt/vstring.py b/pypy/jit/metainterp/optimizeopt/vstring.py
--- a/pypy/jit/metainterp/optimizeopt/vstring.py
+++ b/pypy/jit/metainterp/optimizeopt/vstring.py
@@ -6,7 +6,7 @@
 from pypy.jit.metainterp.optimizeopt.optimizer import llhelper, REMOVED
 from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method
 from pypy.jit.metainterp.resoperation import rop, Const, ConstInt, ConstPtr,\
-     BoxInt, BoxPtr, REF, INT, create_resop_1
+     BoxInt, REF, INT, create_resop_1, create_resop_2, create_resop
 from pypy.rlib.objectmodel import specialize, we_are_translated
 from pypy.rlib.unroll import unrolling_iterable
 from pypy.rpython import annlowlevel
@@ -60,10 +60,9 @@
             return None
         self.ensure_nonnull()
         self.force_box(string_optimizer)
-        # ???
-        #lengthop = create_resop_1(mode.STRLEN, 0, box)
-        string_optimizer.emit_operation(lengthbox)
-        return lengthbox
+        lengthop = create_resop_1(mode.STRLEN, 0, self.op)
+        string_optimizer.emit_operation(lengthop)
+        return lengthop
 
     @specialize.arg(1)
     def get_constant_string_spec(self, mode):
@@ -86,9 +85,8 @@
 class VAbstractStringValue(virtualize.AbstractVirtualValue):
     _attrs_ = ('mode',)
 
-    def __init__(self, keybox, source_op, mode):
-        virtualize.AbstractVirtualValue.__init__(self, keybox,
-                                                 source_op)
+    def __init__(self, op, mode):
+        virtualize.AbstractVirtualValue.__init__(self, op)
         self.mode = mode
 
     def _really_force(self, optforce):
@@ -104,14 +102,14 @@
                 c_s = get_const_ptr_for_unicode(s)
                 self.make_constant(c_s)
                 return
-        assert self.source_op is not None
-        self.box = box = self.source_op.result
+        self.forced = True
         lengthbox = self.getstrlen(optforce, self.mode, None)
-        op = ResOperation(self.mode.NEWSTR, [lengthbox], box)
+        op = create_resop_1(self.mode.NEWSTR, llhelper.NULLREF, lengthbox)
+        optforce.replace(self.op, op)
         if not we_are_translated():
             op.name = 'FORCE'
         optforce.emit_operation(op)
-        self.initialize_forced_string(optforce, box, CONST_0, self.mode)
+        self.initialize_forced_string(optforce, op, CONST_0, self.mode)
 
     def initialize_forced_string(self, string_optimizer, targetbox,
                                  offsetbox, mode):
@@ -178,7 +176,7 @@
     def initialize_forced_string(self, string_optimizer, targetbox,
                                  offsetbox, mode):
         for i in range(len(self._chars)):
-            assert isinstance(targetbox, BoxPtr)   # ConstPtr never makes sense
+            assert not targetbox.is_constant()
             charvalue = self.getitem(i)
             if charvalue is not None:
                 charbox = charvalue.force_box(string_optimizer)
@@ -321,7 +319,7 @@
         for i in range(lengthbox.value):
             charbox = _strgetitem(string_optimizer, srcbox, srcoffsetbox, mode)
             srcoffsetbox = _int_add(string_optimizer, srcoffsetbox, CONST_1)
-            assert isinstance(targetbox, BoxPtr)   # ConstPtr never makes sense
+            assert not targetbox.is_constant()
             string_optimizer.emit_operation(ResOperation(mode.STRSETITEM, [targetbox,
                                                                            offsetbox,
                                                                            charbox],
@@ -332,10 +330,9 @@
             nextoffsetbox = _int_add(string_optimizer, offsetbox, lengthbox)
         else:
             nextoffsetbox = None
-        assert isinstance(targetbox, BoxPtr)   # ConstPtr never makes sense
-        op = ResOperation(mode.COPYSTRCONTENT, [srcbox, targetbox,
-                                                srcoffsetbox, offsetbox,
-                                                lengthbox], None)
+        assert not targetbox.is_constant()
+        op = create_resop(mode.COPYSTRCONTENT, None, [srcbox, targetbox,
+                          srcoffsetbox, offsetbox, lengthbox])
         string_optimizer.emit_operation(op)
         offsetbox = nextoffsetbox
     return offsetbox
@@ -350,9 +347,9 @@
         return box1
     if string_optimizer is None:
         return None
-    resbox = BoxInt()
-    string_optimizer.emit_operation(ResOperation(rop.INT_ADD, [box1, box2], resbox))
-    return resbox
+    resop = create_resop_2(rop.INT_ADD, 0, box1, box2)
+    string_optimizer.emit_operation(resop)
+    return resop
 
 def _int_sub(string_optimizer, box1, box2):
     if isinstance(box2, ConstInt):
@@ -384,17 +381,18 @@
     def new(self):
         return OptString()
 
-    def make_vstring_plain(self, box, source_op, mode):
-        vvalue = VStringPlainValue(box, source_op, mode)
-        self.make_equal_to(box, vvalue)
+    def make_vstring_plain(self, op, mode):
+        vvalue = VStringPlainValue(op, mode)
+        self.setvalue(op, vvalue)
         return vvalue
 
-    def make_vstring_concat(self, box, source_op, mode):
-        vvalue = VStringConcatValue(box, source_op, mode)
-        self.make_equal_to(box, vvalue)
+    def make_vstring_concat(self, op, mode):
+        vvalue = VStringConcatValue(op, mode)
+        self.setvalue(op, vvalue)
         return vvalue
 
     def make_vstring_slice(self, box, source_op, mode):
+        xxx
         vvalue = VStringSliceValue(box, source_op, mode)
         self.make_equal_to(box, vvalue)
         return vvalue
@@ -411,7 +409,7 @@
             # build a new one with the ConstInt argument
             if not isinstance(op.getarg(0), ConstInt):
                 op = ResOperation(mode.NEWSTR, [length_box], op.result)
-            vvalue = self.make_vstring_plain(op.result, op, mode)
+            vvalue = self.make_vstring_plain(op, mode)
             vvalue.setup(length_box.getint())
         else:
             self.getvalue(op.result).ensure_nonnull()
@@ -439,11 +437,8 @@
     def _optimize_STRGETITEM(self, op, mode):
         value = self.getvalue(op.getarg(0))
         vindex = self.getvalue(op.getarg(1))
-        vresult = self.strgetitem(value, vindex, mode, op.result)
-        if op.result in self.optimizer.values:
-            assert self.getvalue(op.result) is vresult
-        else:
-            self.make_equal_to(op.result, vresult)
+        vresult = self.strgetitem(value, vindex, mode, op)
+        self.setvalue(op, vresult)
 
     def strgetitem(self, value, vindex, mode, resbox=None):
         value.ensure_nonnull()
@@ -457,7 +452,7 @@
         #
         if isinstance(value, VStringPlainValue):  # even if no longer virtual
             if vindex.is_constant():
-                result = value.getitem(vindex.box.getint())
+                result = value.getitem(vindex.op.getint())
                 if result is not None:
                     return result
         #
@@ -548,7 +543,7 @@
                     return
         self.emit_operation(op)
     optimize_CALL_f = optimize_CALL_i
-    optimize_CALL_p = optimize_CALL_i
+    optimize_CALL_r = optimize_CALL_i
     optimize_CALL_N = optimize_CALL_i
 
     optimize_CALL_PURE_i = optimize_CALL_i
@@ -583,7 +578,7 @@
         vright = self.getvalue(op.getarg(2))
         vleft.ensure_nonnull()
         vright.ensure_nonnull()
-        value = self.make_vstring_concat(op.result, op, mode)
+        value = self.make_vstring_concat(op, mode)
         value.setup(vleft, vright)
         return True
 


More information about the pypy-commit mailing list