[pypy-commit] pypy resume-refactor: in progress

fijal noreply at buildbot.pypy.org
Wed Oct 16 16:08:00 CEST 2013


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r67424:7945084fc05d
Date: 2013-10-16 16:07 +0200
http://bitbucket.org/pypy/pypy/changeset/7945084fc05d/

Log:	in progress

diff --git a/rpython/jit/backend/llsupport/regalloc.py b/rpython/jit/backend/llsupport/regalloc.py
--- a/rpython/jit/backend/llsupport/regalloc.py
+++ b/rpython/jit/backend/llsupport/regalloc.py
@@ -326,6 +326,10 @@
             if self.frame_manager is not None:
                 self.frame_manager.mark_as_free(v)
 
+    def free_unused_regs(self):
+        for v in self.reg_bindings:
+            self.possibly_free_var(v)
+
     def possibly_free_vars(self, vars):
         """ Same as 'possibly_free_var', but for all v in vars.
         """
diff --git a/rpython/jit/backend/llsupport/resumebuilder.py b/rpython/jit/backend/llsupport/resumebuilder.py
--- a/rpython/jit/backend/llsupport/resumebuilder.py
+++ b/rpython/jit/backend/llsupport/resumebuilder.py
@@ -75,6 +75,6 @@
                 self._mark_visited(v, loc)
         return len(self.newops)
 
-    def finish(self, parent, clt):
-        return ResumeBytecode(self.newops, parent, clt)
+    def finish(self, parent, parent_position, clt):
+        return ResumeBytecode(self.newops, parent, parent_position, clt)
 
diff --git a/rpython/jit/backend/test/runner_test.py b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -259,75 +259,49 @@
         assert self.cpu.tracker.total_compiled_bridges == 1
         return looptoken
 
-    def test_compile_bridge_with_holes(self):
-        i0 = BoxInt()
-        i1 = BoxInt()
-        i2 = BoxInt()
-        i3 = BoxInt()
-        faildescr1 = BasicFailDescr(1)
-        faildescr2 = BasicFailDescr(2)
-        looptoken = JitCellToken()
-        targettoken = TargetToken()
-        operations = [
-            ResOperation(rop.INT_SUB, [i3, ConstInt(42)], i0),
-            ResOperation(rop.LABEL, [i0], None, descr=targettoken),
-            ResOperation(rop.INT_ADD, [i0, ConstInt(1)], i1),
-            ResOperation(rop.INT_LE, [i1, ConstInt(9)], i2),
-            ResOperation(rop.GUARD_TRUE, [i2], None, descr=faildescr1),
-            ResOperation(rop.JUMP, [i1], None, descr=targettoken),
-            ]
-        inputargs = [i3]
-        operations[4].setfailargs([None, i1, None])
-        self.cpu.compile_loop(None, inputargs, operations, looptoken)
-
-        i1b = BoxInt()
-        i3 = BoxInt()
-        bridge = [
-            ResOperation(rop.INT_LE, [i1b, ConstInt(19)], i3),
-            ResOperation(rop.GUARD_TRUE, [i3], None, descr=faildescr2),
-            ResOperation(rop.JUMP, [i1b], None, descr=targettoken),
-        ]
-        bridge[1].setfailargs([i1b])
-
-        self.cpu.compile_bridge(None, faildescr1, [i1b], bridge, looptoken)
-
-        deadframe = self.cpu.execute_token(looptoken, 2)
-        fail = self.cpu.get_latest_descr(deadframe)
-        assert fail.identifier == 2
-        res = self.cpu.get_int_value(deadframe, 0)
-        assert res == 20
-
     def test_compile_big_bridge_out_of_small_loop(self):
+        jitcode = JitCode("name")
+        jitcode.setup(num_regs_i=1, num_regs_r=0, num_regs_f=0)
         i0 = BoxInt()
         faildescr1 = BasicFailDescr(1)
         looptoken = JitCellToken()
         operations = [
+            ResOperation(rop.ENTER_FRAME, [ConstInt(-1)], None, descr=jitcode),
+            ResOperation(rop.RESUME_PUT, [i0, ConstInt(0), ConstInt(0)], None),
             ResOperation(rop.GUARD_FALSE, [i0], None, descr=faildescr1),
             ResOperation(rop.FINISH, [], None, descr=BasicFinalDescr(2)),
+            ResOperation(rop.LEAVE_FRAME, [], None),
             ]
         inputargs = [i0]
-        operations[0].setfailargs([i0])
         self.cpu.compile_loop(None, inputargs, operations, looptoken)
-
+        jitcode1 = JitCode("name1")
+        jitcode1.setup(num_regs_i=150, num_regs_r=0, num_regs_f=0)
         i1list = [BoxInt() for i in range(150)]
-        bridge = []
+        bridge = [
+            ResOperation(rop.ENTER_FRAME, [ConstInt(13)], None, descr=jitcode1)
+        ]
         iprev = i0
         for i1 in i1list:
             bridge.append(ResOperation(rop.INT_ADD, [iprev, ConstInt(1)], i1))
             iprev = i1
+        for i, i1 in enumerate(i1list):
+            bridge.append(ResOperation(rop.RESUME_PUT, [i1, ConstInt(0), ConstInt(i)], None))
         bridge.append(ResOperation(rop.GUARD_FALSE, [i0], None,
                                    descr=BasicFailDescr(3)))
         bridge.append(ResOperation(rop.FINISH, [], None,
                                    descr=BasicFinalDescr(4)))
-        bridge[-2].setfailargs(i1list)
-
-        self.cpu.compile_bridge(None, faildescr1, [i0], bridge, looptoken)
+        # XXX
+        #bridge[-2].setfailargs(i1list)
+
+        locs = rebuild_locs_from_resumedata(faildescr1)
+        self.cpu.compile_bridge(None, faildescr1, [i0], locs, bridge, looptoken)
 
         deadframe = self.cpu.execute_token(looptoken, 1)
         fail = self.cpu.get_latest_descr(deadframe)
+        locs = rebuild_locs_from_resumedata(fail)
         assert fail.identifier == 3
         for i in range(len(i1list)):
-            res = self.cpu.get_int_value(deadframe, i)
+            res = self.cpu.get_int_value(deadframe, locs[i + 1])
             assert res == 2 + i
 
     def test_finish(self):
diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -476,7 +476,7 @@
         self.update_frame_depth(frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE)
         #
         size_excluding_failure_stuff = self.mc.get_relative_pos()
-        self.resume_bytecode = regalloc.resumebuilder.finish(None, looptoken)
+        self.resume_bytecode = regalloc.resumebuilder.finish(None, 0, looptoken)
         self.write_pending_failure_recoveries()
         full_size = self.mc.get_relative_pos()
         #
@@ -538,7 +538,7 @@
         frame_depth_no_fixed_size = self._assemble(regalloc, inputargs, operations)
         codeendpos = self.mc.get_relative_pos()
         self.resume_bytecode = regalloc.resumebuilder.finish(
-            faildescr.rd_resume_bytecode, original_loop_token)
+            faildescr.rd_resume_bytecode, faildescr.rd_bytecode_position, original_loop_token)
         self.write_pending_failure_recoveries()
         fullsize = self.mc.get_relative_pos()
         #
diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -324,6 +324,9 @@
                 self._consider_force_spill(op)
             else:
                 oplist[op.getopnum()](self, op)
+            if op.is_guard():
+                self.rm.free_unused_regs()
+                self.xrm.free_unused_regs()
             self.possibly_free_vars_for_op(op)
             self.rm._check_invariants()
             self.xrm._check_invariants()


More information about the pypy-commit mailing list