Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: resume-refactor
Changeset: r68723:81bacd53e1b5
Date: 2014-01-17 16:49 +0100
http://bitbucket.org/pypy/pypy/changeset/81bacd53e1b5/

Log:    (fijal, rguillebert) fix test_spill, reintroduce liveness analyser

diff --git a/rpython/jit/resume/backend.py b/rpython/jit/resume/backend.py
--- a/rpython/jit/resume/backend.py
+++ b/rpython/jit/resume/backend.py
@@ -3,31 +3,8 @@
 from rpython.jit.metainterp.history import ConstInt, Box, Const
 from rpython.jit.resume.rescode import ResumeBytecodeBuilder, TAGBOX,\
      ResumeBytecode, TAGVIRTUAL
+from rpython.jit.codewriter.jitcode import JitCode
 
-            # if op.getopnum() == rop.ENTER_FRAME:
-            #     descr = op.getdescr()
-            #     assert isinstance(descr, JitCode)
-            #     self.enter_frame(op.getarg(0).getint(), descr)
-            # elif op.getopnum() == rop.LEAVE_FRAME:
-            #     self.leave_frame()
-            # elif op.getopnum() == rop.RESUME_PUT:
-            #     self.resume_put(op.getarg(0), op.getarg(1).getint(),
-            #                      op.getarg(2).getint())
-            # elif op.getopnum() == rop.RESUME_NEW:
-            #     self.resume_new(op.result, op.getdescr())
-            # elif op.getopnum() == rop.RESUME_SETFIELD_GC:
-            #     self.resume_setfield_gc(op.getarg(0), op.getarg(1),
-            #                             op.getdescr())
-            # elif op.getopnum() == rop.RESUME_SET_PC:
-            #     self.resume_set_pc(op.getarg(0).getint())
-            # elif op.getopnum() == rop.RESUME_CLEAR:
-            #     self.resume_clear(op.getarg(0).getint(),
-            #                       op.getarg(1).getint())
-            # elif not op.is_resume():
-            #     pos += 1
-            #     continue
-            # else:
-            #     xxx
 
 class LivenessAnalyzer(object):
     def __init__(self, inputframes=None):
@@ -61,8 +38,37 @@
     def resume_set_pc(self, pc):
         pass
 
-    def interpret_until(self, *args):
-        pass
+    def interpret_until(self, ops, until, pos=0):
+        while pos < until:
+            op = ops[pos]
+            if not op.is_resume():
+                pos += 1
+                continue
+            if op.getopnum() == rop.ENTER_FRAME:
+                descr = op.getdescr()
+                assert isinstance(descr, JitCode)
+                self.enter_frame(op.getarg(0).getint(), descr)
+            elif op.getopnum() == rop.LEAVE_FRAME:
+                self.leave_frame()
+            elif op.getopnum() == rop.RESUME_PUT:
+                self.resume_put(op.getarg(0), op.getarg(1).getint(),
+                                 op.getarg(2).getint())
+            elif op.getopnum() == rop.RESUME_NEW:
+                self.resume_new(op.result, op.getdescr())
+            elif op.getopnum() == rop.RESUME_SETFIELD_GC:
+                self.resume_setfield_gc(op.getarg(0), op.getarg(1),
+                                        op.getdescr())
+            elif op.getopnum() == rop.RESUME_SET_PC:
+                self.resume_set_pc(op.getarg(0).getint())
+            elif op.getopnum() == rop.RESUME_CLEAR:
+                self.resume_clear(op.getarg(0).getint(),
+                                  op.getarg(1).getint())
+            elif not op.is_resume():
+                pos += 1
+                continue
+            else:
+                xxx
+            pos += 1
 
     def _track(self, allboxes, box):
         if box in self.deps:
@@ -187,11 +193,8 @@
             return
         pos = self.builder.encode(TAGBOX, pos)
         if self.current_attachment[v] != pos:
-            frame_index, frame_pos = self.frontend_pos[v]
-            xxx
-            self.newops.append(ResOperation(rop.RESUME_PUT, [
-                ConstInt(pos), frame_index, frame_pos],
-                None))
+            frame_index, pos_in_frame = self.frontend_pos[v]
+            self.builder.resume_put(pos, frame_index, pos_in_frame)
         self.current_attachment[v] = pos
 
     def mark_resumable_position(self):
diff --git a/rpython/jit/resume/test/test_backend.py 
b/rpython/jit/resume/test/test_backend.py
--- a/rpython/jit/resume/test/test_backend.py
+++ b/rpython/jit/resume/test/test_backend.py
@@ -8,10 +8,10 @@
 from rpython.rtyper.lltypesystem import lltype
 
 class MockJitCode(JitCode):
-    def __init__(self, no):
+    def __init__(self, no, index):
         self.no = no
-        self.global_index = no
-        self.name = 'frame-%d' % no
+        self.global_index = index
+        self.name = 'frame-%d' % index
 
     def num_regs(self):
         return self.no
@@ -33,7 +33,7 @@
         self.cpu.setup_once()
 
     def test_simple(self):
-        jitcode = MockJitCode(1)
+        jitcode = MockJitCode(3, 1)
         loop = parse("""
         [i0]
         enter_frame(-1, descr=jitcode)
@@ -97,6 +97,7 @@
     def test_spill(self):
         jitcode = JitCode("name")
         jitcode.setup(num_regs_i=2, num_regs_r=0, num_regs_f=0)
+        jitcode.global_index = 0
         faildescr1 = BasicFailDescr(1)
         faildescr2 = BasicFailDescr(2)
         loop = parse("""
@@ -114,19 +115,19 @@
         self.cpu.compile_loop(None, loop.inputargs, loop.operations,
                               looptoken)
 
-        expected_resume = parse("""
-        [i2]
-        enter_frame(-1, descr=jitcode)
-        resume_put(1, 0, 1)
-        resume_put(29, 0, 1)
-        leave_frame()
-        """, namespace={'jitcode':jitcode})
+        staticdata = MockStaticData([jitcode], [])
+        expected_resume = preparse("""
+        enter_frame -1 name
+        resume_put (3, 1) 0 1
+        resume_put (3, 29) 0 1
+        """)
         descr1 = loop.operations[3].getdescr()
         descr2 = loop.operations[5].getdescr()
-        assert descr1.rd_bytecode_position == 2
-        assert descr2.rd_bytecode_position == 3
-        equaloplists(descr1.rd_resume_bytecode.opcodes,
-                     expected_resume.operations)
+        assert descr1.rd_bytecode_position == 10
+        assert descr2.rd_bytecode_position == 15
+        res = descr2.rd_resume_bytecode.dump(staticdata,
+                                             descr2.rd_bytecode_position)
+        assert res == expected_resume
 
     def test_bridge(self):
         jitcode = JitCode("name")
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to