[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