Author: Hakan Ardo <ha...@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): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit