[pypy-commit] pypy jit-targets: clone the short_boxes to allow it to be reused in some fallabck if the first athempt to optimize fails
hakanardo
noreply at buildbot.pypy.org
Sun Dec 11 12:43:00 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-targets
Changeset: r50372:3b4f0126fae2
Date: 2011-12-11 12:41 +0100
http://bitbucket.org/pypy/pypy/changeset/3b4f0126fae2/
Log: clone the short_boxes to allow it to be reused in some fallabck if
the first athempt to optimize fails
diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py
--- a/pypy/jit/metainterp/compile.py
+++ b/pypy/jit/metainterp/compile.py
@@ -175,6 +175,8 @@
for label in all_target_tokens:
assert isinstance(label, TargetToken)
label.original_jitcell_token = jitcell_token
+ if label.virtual_state and label.short_preamble:
+ metainterp_sd.logger_ops.log_short_preamble([], label.short_preamble)
jitcell_token.target_tokens = all_target_tokens
send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, "loop")
record_loop_or_bridge(metainterp_sd, loop)
@@ -209,7 +211,7 @@
try:
optimize_trace(metainterp_sd, part, jitdriver_sd.warmstate.enable_opts)
except InvalidLoop:
- return None # XXX: Dissable for now
+ #return None # XXX: Dissable for now
# Fall back on jumping to preamble
target_token = label.getdescr()
assert isinstance(target_token, TargetToken)
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
@@ -190,7 +190,7 @@
self.short = target_token.short_preamble
self.short_seen = {}
- self.short_boxes = exported_state.short_boxes
+ self.short_boxes = exported_state.short_boxes.clone()
for box, const in exported_state.constant_inputargs.items():
self.short_seen[box] = True
self.imported_state = exported_state
@@ -216,6 +216,7 @@
for op in exported_state.inputarg_setup_ops:
self.optimizer.send_extra_operation(op)
seen = {}
+
for op in self.short_boxes.operations():
self.ensure_short_op_emitted(op, self.optimizer, seen)
if op and op.result:
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
@@ -566,18 +566,27 @@
self.aliases = {}
self.rename = {}
self.optimizer = optimizer
- for box in surviving_boxes:
- self.potential_ops[box] = None
- optimizer.produce_potential_short_preamble_ops(self)
- self.short_boxes = {}
- self.short_boxes_in_production = {}
+ if surviving_boxes is not None:
+ for box in surviving_boxes:
+ self.potential_ops[box] = None
+ optimizer.produce_potential_short_preamble_ops(self)
- for box in self.potential_ops.keys():
- try:
- self.produce_short_preamble_box(box)
- except BoxNotProducable:
- pass
+ self.short_boxes = {}
+ self.short_boxes_in_production = {}
+
+ for box in self.potential_ops.keys():
+ try:
+ self.produce_short_preamble_box(box)
+ except BoxNotProducable:
+ pass
+
+ def clone(self):
+ sb = ShortBoxes(self.optimizer, None)
+ sb.aliases.update(self.aliases)
+ sb.short_boxes = {}
+ sb.short_boxes.update(self.short_boxes)
+ return sb
def prioritized_alternatives(self, box):
if box not in self.alternatives:
diff --git a/pypy/jit/metainterp/test/test_virtual.py b/pypy/jit/metainterp/test/test_virtual.py
--- a/pypy/jit/metainterp/test/test_virtual.py
+++ b/pypy/jit/metainterp/test/test_virtual.py
@@ -822,6 +822,44 @@
assert res == f(10)
self.check_resops(jump=2)
+ def test_retrace_not_matching_bridge_str(self):
+ @dont_look_inside
+ def external(node):
+ return node.value + 1
+ myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'node', 'node2', 's'])
+ class A():
+ def new(self):
+ return A()
+ def val(self, i):
+ return i + 7
+ class B(A):
+ def new(self):
+ return B()
+ def val(self, i):
+ return i + 42
+ def f(n):
+ s = '*' * n
+ node = self._new()
+ node2 = A()
+ node.value = 0
+ i = 0
+ while i < n:
+ myjitdriver.jit_merge_point(n=n, i=i, node=node, node2=node2, s=s)
+ next = self._new()
+ next.value = node.value + n + node2.val(i)
+ if i != 7:
+ next.value += external(next)
+ else:
+ node2 = B()
+ node = next
+ node2 = node2.new()
+ node.value += len(s)
+ i += 1
+ return node.value
+ res = self.meta_interp(f, [10], repeat=10)
+ assert res == f(10)
+ self.check_resops(jump=2)
+
def test_nested_loops(self):
class Int(object):
def __init__(self, val):
More information about the pypy-commit
mailing list