[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