Author: Hakan Ardo <[email protected]>
Branch: jit-short_from_state
Changeset: r45768:5c992bef0561
Date: 2011-07-20 10:19 +0200
http://bitbucket.org/pypy/pypy/changeset/5c992bef0561/
Log: allow boxes to be replaced during initial setup of the peeled loop
optimizer
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
@@ -6460,12 +6460,25 @@
call(i843, descr=nonwritedescr)
jump(p9)
"""
+ preamble = """
+ [p9]
+ i843 = strlen(p9)
+ call(i843, descr=nonwritedescr)
+ jump(p9, i843)
+ """
+ short = """
+ [p9]
+ i843 = strlen(p9)
+ i848 = int_ge(i843, 0)
+ guard_true(i848)[]
+ jump(p9, i843)
+ """
expected = """
[p9, i2]
call(i2, descr=nonwritedescr)
jump(p9, i2)
"""
- self.optimize_loop(ops, expected)
+ self.optimize_loop(ops, expected, preamble, expected_short=short)
def test_loopinvariant_strlen_with_bound(self):
ops = """
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
@@ -241,6 +241,10 @@
value = preamble_optimizer.getvalue(op.result)
for guard in value.make_guards(op.result):
self.optimizer.send_extra_operation(guard)
+ newresult =
self.optimizer.getvalue(op.result).get_key_box()
+ if newresult is not op.result:
+ self.short_boxes.alias(newresult, op.result)
+
self.optimizer.flush()
self.optimizer.emitting_dissabled = False
@@ -259,7 +263,8 @@
# preamble_optimizer.send_extra_operation(jumpop)
# return
loop.inputargs = inputargs
- jmp = ResOperation(rop.JUMP, loop.inputargs[:], None)
+ args = [self.short_boxes.original(a) for a in inputargs]
+ jmp = ResOperation(rop.JUMP, args, None)
jmp.setdescr(loop.token)
loop.preamble.operations.append(jmp)
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py
b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -458,6 +458,7 @@
self.potential_ops = {}
optimizer.produce_potential_short_preamble_ops(self)
+ self.aliases = {}
self.short_boxes = {}
for box in surviving_boxes:
self.short_boxes[box] = None
@@ -502,3 +503,11 @@
def has_producer(self, box):
return box in self.short_boxes
+ def alias(self, newbox, oldbox):
+ self.short_boxes[newbox] = self.short_boxes[oldbox]
+ self.aliases[newbox] = oldbox
+
+ def original(self, box):
+ while box in self.aliases:
+ box = self.aliases[box]
+ return box
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit