[pypy-commit] pypy jit-targets: ensure loops are freed
hakanardo
noreply at buildbot.pypy.org
Mon Nov 7 12:49:24 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-targets
Changeset: r48859:712c04e8e94d
Date: 2011-11-07 11:09 +0100
http://bitbucket.org/pypy/pypy/changeset/712c04e8e94d/
Log: ensure loops are freed
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
@@ -80,6 +80,7 @@
if descr.original_jitcell_token is not original_jitcell_token:
assert descr.original_jitcell_token is not None
original_jitcell_token.record_jump_to(descr.original_jitcell_token)
+ descr.exported_state = None
op._descr = None # clear reference, mostly for tests
# record this looptoken on the QuasiImmut used in the code
if loop.quasi_immutable_deps is not None:
@@ -673,7 +674,7 @@
pass
-def compile_trace(metainterp, resumekey, retraced=False):
+def compile_trace(metainterp, resumekey, start_resumedescr=None):
"""Try to compile a new bridge leading from the beginning of the history
to some existing place.
"""
@@ -689,6 +690,7 @@
# clone ops, as optimize_bridge can mutate the ops
new_trace.operations = [op.clone() for op in metainterp.history.operations]
+ new_trace.start_resumedescr = start_resumedescr
metainterp_sd = metainterp.staticdata
state = metainterp.jitdriver_sd.warmstate
if isinstance(resumekey, ResumeAtPositionDescr):
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
@@ -115,13 +115,11 @@
original_jump_args = targetop.getarglist()
jump_args = [self.getvalue(a).get_key_box() for a in original_jump_args]
- # FIXME: I dont thnik we need this anymore
- if self.optimizer.loop.start_resumedescr:
- start_resumedescr = self.optimizer.loop.start_resumedescr.clone_if_mutable()
- assert isinstance(start_resumedescr, ResumeGuardDescr)
- start_resumedescr.rd_snapshot = self.fix_snapshot(jump_args, start_resumedescr.rd_snapshot)
- else:
- start_resumedescr = None
+ assert self.optimizer.loop.start_resumedescr
+ start_resumedescr = self.optimizer.loop.start_resumedescr.clone_if_mutable()
+ assert isinstance(start_resumedescr, ResumeGuardDescr)
+ start_resumedescr.rd_snapshot = self.fix_snapshot(jump_args, start_resumedescr.rd_snapshot)
+ # FIXME: I dont thnik we need fix_snapshot anymore
modifier = VirtualStateAdder(self.optimizer)
virtual_state = modifier.get_virtual_state(jump_args)
@@ -180,8 +178,7 @@
self.imported_state = exported_state
self.inputargs = targetop.getarglist()
self.initial_virtual_state = target_token.virtual_state
- #self.start_resumedescr = target_token.start_resumedescr
- self.start_resumedescr = self.optimizer.loop.start_resumedescr
+ self.start_resumedescr = target_token.start_resumedescr
seen = {}
for box in self.inputargs:
@@ -328,14 +325,7 @@
for i in range(len(short)):
short[i] = inliner.inline_op(short[i])
- if target_token.start_resumedescr is None: # FIXME: Hack!
- target_token.start_resumedescr = self.start_resumedescr.clone_if_mutable()
- fix = Inliner(self.optimizer.loop.operations[-1].getarglist(),
- self.optimizer.loop.inputargs)
-
- fix.inline_descr_inplace(target_token.start_resumedescr)
- else:
- target_token.start_resumedescr = self.start_resumedescr.clone_if_mutable()
+ target_token.start_resumedescr = self.start_resumedescr.clone_if_mutable()
inliner.inline_descr_inplace(target_token.start_resumedescr)
# Forget the values to allow them to be freed
diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py
--- a/pypy/jit/metainterp/pyjitpl.py
+++ b/pypy/jit/metainterp/pyjitpl.py
@@ -1936,7 +1936,7 @@
# from the interpreter.
if not self.partial_trace:
# FIXME: Support a retrace to be a bridge as well as a loop
- self.compile_trace(live_arg_boxes)
+ self.compile_trace(live_arg_boxes, resumedescr)
# raises in case it works -- which is the common case, hopefully,
# at least for bridges starting from a guard.
@@ -2042,7 +2042,7 @@
self.history.operations = None
raise GenerateMergePoint(live_arg_boxes, target_token.cell_token)
- def compile_trace(self, live_arg_boxes):
+ def compile_trace(self, live_arg_boxes, start_resumedescr):
num_green_args = self.jitdriver_sd.num_green_args
greenkey = live_arg_boxes[:num_green_args]
target_jitcell_token = self.get_procedure_token(greenkey)
@@ -2052,7 +2052,7 @@
self.history.record(rop.JUMP, live_arg_boxes[num_green_args:], None,
descr=target_jitcell_token)
try:
- target_token = compile.compile_trace(self, self.resumekey)
+ target_token = compile.compile_trace(self, self.resumekey, start_resumedescr)
finally:
self.history.operations.pop() # remove the JUMP
if target_token is not None: # raise if it *worked* correctly
diff --git a/pypy/jit/metainterp/test/test_ajit.py b/pypy/jit/metainterp/test/test_ajit.py
--- a/pypy/jit/metainterp/test/test_ajit.py
+++ b/pypy/jit/metainterp/test/test_ajit.py
@@ -288,9 +288,7 @@
assert res == f(6, 15)
gc.collect()
- #assert not [wr for wr in wr_loops if wr()]
- for loop in [wr for wr in wr_loops if wr()]:
- assert loop().name == 'short preamble'
+ assert not [wr for wr in wr_loops if wr()]
def test_string(self):
def f(n):
More information about the pypy-commit
mailing list