[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