[pypy-commit] pypy jit-short_from_state: Some extra debug prints. Make optimize_STRLEN keep the original result box if the strlen op is emitted.

hakanardo noreply at buildbot.pypy.org
Sat Jul 16 14:59:45 CEST 2011


Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r45662:a8eedb9a9b64
Date: 2011-07-16 14:59 +0200
http://bitbucket.org/pypy/pypy/changeset/a8eedb9a9b64/

Log:	Some extra debug prints. Make optimize_STRLEN keep the original
	result box if the strlen op is emitted.

diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -6453,6 +6453,20 @@
         """
         self.optimize_loop(ops, expected)
         
+    def test_loopinvariant_strlen(self):
+        ops = """
+        [p9]
+        i843 = strlen(p9)
+        call(i843, descr=nonwritedescr)
+        jump(p9)
+        """
+        expected = """
+        [p9, i2]
+        call(i2, descr=nonwritedescr)
+        jump(p9, i2)
+        """
+        self.optimize_loop(ops, expected)
+        
 
 class TestLLtype(OptimizeOptTest, LLtypeMixin):
     pass
diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -184,7 +184,7 @@
             virtual_state = modifier.get_virtual_state(jump_args)
             values = [self.getvalue(arg) for arg in jump_args]
             inputargs = virtual_state.make_inputargs(values)
-            short_inputargs = virtual_state.make_inputargs(values, keyboxes=True)            
+            short_inputargs = virtual_state.make_inputargs(values, keyboxes=True)
 
             self.constant_inputargs = {}
             for box in jump_args: 
@@ -201,6 +201,20 @@
             self.optimizer = self.optimizer.new()
             loop.quasi_immutable_deps = self.optimizer.quasi_immutable_deps
 
+            logops = self.optimizer.loop.logops
+            if logops:
+                args = ", ".join([logops.repr_of_arg(arg) for arg in inputargs])
+                debug_print('inputargs: ' + args)
+                args = ", ".join([logops.repr_of_arg(arg) for arg in short_inputargs])
+                debug_print('short inputargs: ' + args)
+                debug_start('jit-short-boxes')
+                for box, op in self.short_boxes.items():
+                    if op:
+                        debug_print(logops.repr_of_arg(box) + ': ' + logops.repr_of_resop(op))
+                    else:
+                        debug_print(logops.repr_of_arg(box) + ': None')
+                debug_stop('jit-short-boxes')
+
             # Force virtuals amoung the jump_args of the preamble to get the
             # operations needed to setup the proper state of those virtuals
             # in the peeled loop
@@ -229,7 +243,7 @@
                         self.optimizer.send_extra_operation(guard)
             self.optimizer.flush()
             self.optimizer.emitting_dissabled = False
-            
+
             initial_inputargs_len = len(inputargs)
             self.inliner = Inliner(loop.inputargs, jump_args)
 
@@ -351,8 +365,12 @@
             args = op.getarglist()
             if op.is_guard():
                 args = args + op.getfailargs()
-            
+
+            if self.optimizer.loop.logops:
+                debug_print('OP: ' + self.optimizer.loop.logops.repr_of_resop(op))
             for a in args:
+                if self.optimizer.loop.logops:
+                    debug_print('A:  ' + self.optimizer.loop.logops.repr_of_arg(a))
                 self.import_box(a, inputargs, short, short_jumpargs,
                                 jumpargs, short_seen)
             i += 1
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
@@ -47,7 +47,7 @@
 class __extend__(optimizer.OptValue):
     """New methods added to the base class OptValue for this file."""
 
-    def getstrlen(self, optimization, mode):
+    def getstrlen(self, optimization, mode, lengthbox=None):
         if mode is mode_string:
             s = self.get_constant_string_spec(mode_string)
             if s is not None:
@@ -60,7 +60,8 @@
             return None
         self.ensure_nonnull()
         box = self.force_box()
-        lengthbox = BoxInt()
+        if not lengthbox:
+            lengthbox = BoxInt()
         optimization.emit_operation(ResOperation(mode.STRLEN, [box], lengthbox))
         return lengthbox
 
@@ -124,7 +125,7 @@
         assert 0 <= start <= stop <= len(longerlist)
         self._chars = longerlist[start:stop]
 
-    def getstrlen(self, _, mode):
+    def getstrlen(self, _, mode, lengthbox=None):
         if self._lengthbox is None:
             self._lengthbox = ConstInt(len(self._chars))
         return self._lengthbox
@@ -185,7 +186,7 @@
         self.left = left
         self.right = right
 
-    def getstrlen(self, optimizer, mode):
+    def getstrlen(self, optimizer, mode, lengthbox=None):
         if self.lengthbox is None:
             len1box = self.left.getstrlen(optimizer, mode)
             if len1box is None:
@@ -249,7 +250,7 @@
         self.vstart = vstart
         self.vlength = vlength
 
-    def getstrlen(self, _, mode):
+    def getstrlen(self, _, mode, lengthbox=None):
         return self.vlength.force_box()
 
     @specialize.arg(1)
@@ -453,8 +454,9 @@
 
     def _optimize_STRLEN(self, op, mode):
         value = self.getvalue(op.getarg(0))
-        lengthbox = value.getstrlen(self, mode)
-        self.make_equal_to(op.result, self.getvalue(lengthbox))
+        lengthbox = value.getstrlen(self, mode, op.result)
+        if lengthbox is not op.result:
+            self.make_equal_to(op.result, self.getvalue(lengthbox))
 
     def optimize_CALL(self, op):
         # dispatch based on 'oopspecindex' to a method that handles


More information about the pypy-commit mailing list