[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