[pypy-commit] pypy resume-refactor: fix one missing item for inheriting parent in resumebuilder

fijal noreply at buildbot.pypy.org
Sun Jan 12 14:47:08 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r68611:7f1660207c81
Date: 2014-01-12 14:24 +0100
http://bitbucket.org/pypy/pypy/changeset/7f1660207c81/

Log:	fix one missing item for inheriting parent in resumebuilder

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
@@ -46,13 +46,23 @@
         self.framestack.pop()
 
 class ResumeBuilder(object):
-    def __init__(self, regalloc, frontend_liveness, descr):
+    def __init__(self, regalloc, frontend_liveness, descr, inputframes=None,
+                 inputlocs=None):
         self.newops = []
         self.regalloc = regalloc
         self.current_attachment = {}
         self.frontend_liveness = frontend_liveness
         self.frontend_pos = {}
         self.virtuals = {}
+        if inputlocs is not None:
+            i = 0
+            for frame_pos, frame in enumerate(inputframes):
+                for pos_in_frame, box in enumerate(frame):
+                    loc_pos = inputlocs[i].get_jitframe_position()
+                    self.current_attachment[box] = loc_pos
+                    self.frontend_pos[box] = (ConstInt(frame_pos),
+                                              ConstInt(pos_in_frame))
+                    i += 1
 
     def process(self, op):
         if op.getopnum() == rop.RESUME_PUT:
diff --git a/rpython/jit/backend/llsupport/test/test_resumebuilder.py b/rpython/jit/backend/llsupport/test/test_resumebuilder.py
--- a/rpython/jit/backend/llsupport/test/test_resumebuilder.py
+++ b/rpython/jit/backend/llsupport/test/test_resumebuilder.py
@@ -4,6 +4,7 @@
 from rpython.jit.codewriter.jitcode import JitCode
 from rpython.jit.tool.oparser import parse
 from rpython.jit.metainterp.optimizeopt.util import equaloplists
+from rpython.jit.metainterp.test.test_resume2 import rebuild_locs_from_resumedata
 from rpython.rtyper.lltypesystem import lltype
 
 class MockJitCode(JitCode):
@@ -116,12 +117,12 @@
 
     def test_bridge(self):
         jitcode = JitCode("name")
-        jitcode.setup(num_regs_i=2, num_regs_r=0, num_regs_f=0)
+        jitcode.setup(num_regs_i=1, num_regs_r=0, num_regs_f=0)
         loop = parse("""
         [i0]
         enter_frame(-1, descr=jitcode)
-        resume_put(i0, 0, 0)
         i1 = int_lt(i0, 10)
+        resume_put(i1, 0, 0)
         guard_true(i1)
         leave_frame()
         """, namespace={'jitcode': jitcode})
@@ -129,3 +130,22 @@
         looptoken = JitCellToken()
         self.cpu.compile_loop(None, loop.inputargs, loop.operations,
                               looptoken)
+
+        descr = loop.operations[3].getdescr()
+
+        bridge = parse("""
+        [i0]
+        force_spill(i0)
+        guard_false(i0)
+        """)
+        locs = rebuild_locs_from_resumedata(descr)
+        self.cpu.compile_bridge(None, descr, [bridge.inputargs], locs,
+                                bridge.operations, looptoken)
+
+        descr = bridge.operations[-1].getdescr()
+        expected_resume = parse("""
+        []
+        resume_put(28, 0, 0)
+        """)
+        equaloplists(descr.rd_resume_bytecode.opcodes,
+                     expected_resume.operations)
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
@@ -133,7 +133,8 @@
         self.jump_target_descr = None
         self.final_jump_op = None
 
-    def _prepare(self, inputframes, operations, allgcrefs, descr=None):
+    def _prepare(self, inputframes, operations, allgcrefs, descr=None,
+                 locs=None):
         cpu = self.assembler.cpu
         self.fm = X86FrameManager(cpu.get_baseofs_of_frame_field())
         operations = cpu.gc_ll_descr.rewrite_assembler(cpu, operations,
@@ -141,7 +142,8 @@
         # compute longevity of variables
         x = compute_vars_longevity(inputframes, operations, descr)
         longevity, last_real_usage, frontend_liveness = x
-        self.resumebuilder = ResumeBuilder(self, frontend_liveness, descr)
+        self.resumebuilder = ResumeBuilder(self, frontend_liveness, descr,
+                                           inputframes, locs)
         self.longevity = longevity
         self.last_real_usage = last_real_usage
         self.rm = gpr_reg_mgr_cls(self.longevity,
@@ -165,7 +167,8 @@
 
     def prepare_bridge(self, inputframes, arglocs, operations, allgcrefs,
                        frame_info, descr):
-        operations = self._prepare(inputframes, operations, allgcrefs, descr)
+        operations = self._prepare(inputframes, operations, allgcrefs, descr,
+                                   locs=arglocs)
         self._update_bindings(arglocs, inputframes)
         self.min_bytes_before_label = 0
         return operations


More information about the pypy-commit mailing list