[pypy-commit] pypy resume-refactor: (fijal, arigo, antocuni, rguillebert) Make the first test pass about
fijal
noreply at buildbot.pypy.org
Wed Aug 28 17:37:31 CEST 2013
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r66403:20e57f63b0cc
Date: 2013-08-28 16:36 +0100
http://bitbucket.org/pypy/pypy/changeset/20e57f63b0cc/
Log: (fijal, arigo, antocuni, rguillebert) Make the first test pass about
the resume logic
diff --git a/rpython/jit/backend/llsupport/assembler.py b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -22,27 +22,17 @@
class GuardToken(object):
- def __init__(self, cpu, gcmap, faildescr, exc,
+ def __init__(self, cpu, gcmap, faildescr, has_floats, exc,
frame_depth, is_guard_not_invalidated, is_guard_not_forced):
assert isinstance(faildescr, AbstractFailDescr)
self.cpu = cpu
+ self.has_floats = has_floats
self.faildescr = faildescr
- #self.gcmap = self.compute_gcmap(gcmap, failargs,
- # fail_locs, frame_depth)
self.exc = exc
+ self.gcmap = gcmap
self.is_guard_not_invalidated = is_guard_not_invalidated
self.is_guard_not_forced = is_guard_not_forced
- def compute_gcmap(self, gcmap, failargs, fail_locs, frame_depth):
- for i in range(len(failargs)):
- arg = failargs[i]
- if arg is None:
- continue
- if arg.type == REF:
- val = fail_locs[i].get_jitframe_position()
- gcmap[val // WORD // 8] |= r_uint(1) << (val % (WORD * 8))
- return gcmap
-
class BaseAssembler(object):
""" Base class for Assembler generator in real backends
@@ -146,11 +136,7 @@
return locs
def store_info_on_descr(self, startspos, guardtok):
- withfloats = False
- for box in guardtok.failargs:
- if box is not None and box.type == FLOAT:
- withfloats = True
- break
+ withfloats = guardtok.has_floats
exc = guardtok.exc
target = self.failure_recovery_code[exc + 2 * withfloats]
fail_descr = cast_instance_to_gcref(guardtok.faildescr)
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
@@ -47,6 +47,9 @@
self.framestack.pop()
self.newops.append(op)
+ def get_position(self):
+ return len(self.newops)
+
def not_implemented_op(self, op):
print "Not implemented", op.getopname()
raise NotImplementedError(op.getopname())
diff --git a/rpython/jit/backend/llsupport/test/test_resume.py b/rpython/jit/backend/llsupport/test/test_resume.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/backend/llsupport/test/test_resume.py
@@ -0,0 +1,42 @@
+
+from rpython.jit.metainterp.history import JitCellToken
+from rpython.jit.codewriter.jitcode import JitCode
+from rpython.jit.tool.oparser import parse
+from rpython.jit.metainterp.optimizeopt.util import equaloplists
+
+class MockJitCode(JitCode):
+ def __init__(self, no):
+ self.no = no
+
+ def num_regs(self):
+ return self.no
+
+ def __repr__(self):
+ return 'MockJitCode(%d)' % self.no
+
+class ResumeTest(object):
+ def setup_method(self, meth):
+ self.cpu = self.CPUClass(None, None)
+ self.cpu.setup_once()
+
+ def test_simple(self):
+ jitcode = MockJitCode(3)
+ loop = parse("""
+ [i0]
+ enter_frame(-1, descr=jitcode)
+ resume_put(i0, 0, 2)
+ guard_true(i0)
+ leave_frame()
+ """, namespace={'jitcode': jitcode})
+ looptoken = JitCellToken()
+ self.cpu.compile_loop(None, loop.inputargs, loop.operations,
+ looptoken)
+ descr = loop.operations[2].getdescr()
+ assert descr.rd_bytecode_position == 2
+ expected_resume = parse("""
+ []
+ enter_frame(-1, descr=jitcode)
+ resume_put(28, 0, 2)
+ leave_frame()
+ """, namespace={'jitcode': jitcode}).operations
+ equaloplists(descr.rd_loop_token.rd_bytecode, expected_resume)
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
@@ -1718,8 +1718,11 @@
guard_opnum == rop.GUARD_NOT_FORCED)
is_guard_not_invalidated = guard_opnum == rop.GUARD_NOT_INVALIDATED
is_guard_not_forced = guard_opnum == rop.GUARD_NOT_FORCED
- gcmap = allocate_gcmap(self, frame_depth, JITFRAME_FIXED_SIZE)
+ gcmap = self._regalloc.get_gcmap()
+ pos = self._regalloc.resumebuilder.get_position()
+ faildescr.rd_bytecode_position = pos
return GuardToken(self.cpu, gcmap, faildescr,
+ self._regalloc.uses_floats(),
exc, frame_depth,
is_guard_not_invalidated, is_guard_not_forced)
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
@@ -334,6 +334,7 @@
self.assembler.mc.mark_op(None) # end of the loop
for arg in inputargs:
self.possibly_free_var(arg)
+ self.assembler.current_clt.rd_bytecode = self.resumebuilder.newops
def flush_loop(self):
# rare case: if the loop is too short, or if we are just after
@@ -907,6 +908,14 @@
gcmap[val // WORD // 8] |= r_uint(1) << (val % (WORD * 8))
return gcmap
+ def uses_floats(self):
+ if self.xrm.reg_bindings:
+ return True
+ for box in self.fm.bindings:
+ if box.type == FLOAT:
+ return True
+ return False
+
def consider_setfield_gc(self, op):
ofs, size, _ = unpack_fielddescr(op.getdescr())
ofs_loc = imm(ofs)
diff --git a/rpython/jit/backend/x86/test/test_resume.py b/rpython/jit/backend/x86/test/test_resume.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/backend/x86/test/test_resume.py
@@ -0,0 +1,8 @@
+
+from rpython.jit.backend.x86.test.test_basic import Jit386Mixin
+from rpython.jit.backend.llsupport.test.test_resume import ResumeTest
+
+class TestResumeX86(Jit386Mixin, ResumeTest):
+ # for the individual tests see
+ # ====> ../../llsupport/test/test_resume.py
+ pass
diff --git a/rpython/jit/metainterp/optimizeopt/util.py b/rpython/jit/metainterp/optimizeopt/util.py
--- a/rpython/jit/metainterp/optimizeopt/util.py
+++ b/rpython/jit/metainterp/optimizeopt/util.py
@@ -158,24 +158,6 @@
remap[op2.result] = op1.result
if op1.getopnum() not in (rop.JUMP, rop.LABEL): # xxx obscure
assert op1.getdescr() == op2.getdescr()
- if op1.getfailargs() or op2.getfailargs():
- assert len(op1.getfailargs()) == len(op2.getfailargs())
- if strict_fail_args:
- for x, y in zip(op1.getfailargs(), op2.getfailargs()):
- if x is None:
- assert remap.get(y, y) is None
- else:
- assert x.same_box(remap.get(y, y))
- else:
- fail_args1 = set(op1.getfailargs())
- fail_args2 = set([remap.get(y, y) for y in op2.getfailargs()])
- for x in fail_args1:
- for y in fail_args2:
- if x.same_box(y):
- fail_args2.remove(y)
- break
- else:
- assert False
assert len(oplist1) == len(oplist2)
print '-'*totwidth
return True
More information about the pypy-commit
mailing list