Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r66454:2edb35aac4ad
Date: 2013-08-30 11:39 +0100
http://bitbucket.org/pypy/pypy/changeset/2edb35aac4ad/

Log:    (fijal, antocuni) start fighting with llgraph backend

diff --git a/rpython/jit/backend/llgraph/runner.py 
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -1,7 +1,8 @@
 import py, weakref
 from rpython.jit.backend import model
 from rpython.jit.backend.llgraph import support
-from rpython.jit.backend.llsupport import resumebuilder
+from rpython.jit.backend.llsupport.resumebuilder import ResumeBuilder,\
+     LivenessAnalyzer
 from rpython.jit.metainterp.history import AbstractDescr
 from rpython.jit.metainterp.history import Const, getkind
 from rpython.jit.metainterp.history import INT, REF, FLOAT, VOID
@@ -15,6 +16,42 @@
 from rpython.rlib.rarithmetic import ovfcheck, r_uint, r_ulonglong
 from rpython.rlib.rtimer import read_timestamp
 
+class LLGraphResumeBuilder(ResumeBuilder):
+    def __init__(self):
+        ResumeBuilder.__init__(self, None)
+        self.liveness = LivenessAnalyzer()
+        self.numbering = {}
+
+    def process(self, op):
+        func = getattr(self, 'process_' + op.getopname(), None)
+        if func is not None:
+            func(op)
+
+    def process_enter_frame(self, op):
+        self.liveness.enter_frame(op.getdescr())
+        ResumeBuilder.process_enter_frame(self, op)
+
+    def process_leave_frame(self, op):
+        self.liveness.leave_frame()
+        ResumeBuilder.process_leave_frame(self, op)
+
+    def process_resume_put(self, op):
+        self.liveness.put(op.getarg(0), op.getarg(1).getint(),
+                                  op.getarg(2).getint())
+        ResumeBuilder.process_resume_put(self, op)
+
+    def _find_position_for_box(self, v):
+        if v not in self.numbering:
+            self.numbering[v] = len(self.numbering)
+        return self.numbering[v]
+
+    def get_numbering(self, mapping, op):
+        numbering = []
+        for f in self.liveness.framestack:
+            for v in f:
+                numbering.append(mapping(v))
+        return numbering
+
 class LLTrace(object):
     has_been_freed = False
     invalid = False
@@ -34,8 +71,11 @@
         #
         self.inputargs = map(mapping, inputargs)
         self.operations = []
-        self.liveness = resumebuilder.LivenessAnalyzer()
+        resumebuilder = LLGraphResumeBuilder()
         for op in operations:
+            if op.is_resume():
+                resumebuilder.process(op)
+                continue
             if op.getdescr() is not None:
                 if op.is_guard() or op.getopnum() == rop.FINISH:
                     newdescr = op.getdescr()
@@ -47,6 +87,10 @@
                                        map(mapping, op.getarglist()),
                                        mapping(op.result),
                                        newdescr)
+            if op.is_guard():
+                newop.failargs = resumebuilder.get_numbering(mapping, op)
+                newop.failarg_numbers = resumebuilder.get_numbering(
+                    lambda x: resumebuilder.numbering[x], op)
             self.operations.append(newop)
 
 class WeakrefDescr(AbstractDescr):
@@ -694,11 +738,17 @@
     # -----------------------------------------------------
 
     def fail_guard(self, descr, saved_data=None):
+        values = {}
+        for i in range(len(self.current_op.failargs)):
+            arg = self.current_op.failargs[i]
+            value = self.env[arg]
+            index = self.current_op.failarg_numbers[i]
+            values[index] = value
         if hasattr(descr, '_llgraph_bridge'):
             target = (descr._llgraph_bridge, -1)
-            raise Jump(target, self.frontend_env)
+            raise Jump(target, values)
         else:
-            raise ExecutionFinished(LLDeadFrame(descr, self.frontend_env,
+            raise ExecutionFinished(LLDeadFrame(descr, values,
                                                 self.last_exception,
                                                 saved_data))
 
@@ -819,9 +869,6 @@
     def execute_jump(self, descr, *args):
         raise Jump(descr._llgraph_target, args)
 
-    def execute_resume_put(self, descr, box, depth, position):
-        xxx
-
     def _do_math_sqrt(self, value):
         import math
         y = support.cast_from_floatstorage(lltype.Float, value)
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
@@ -31,13 +31,14 @@
         oplist[op.getopnum()](self, op)
 
     def process_enter_frame(self, op):
-        self.framestack.append(None)
+        self.framestack.append(op.getdescr())
         self.newops.append(op)
 
+    def _find_position_for_box(self, v):
+        return self.regalloc.loc(v).get_jitframe_position()
+
     def process_resume_put(self, op):
-        v = op.getarg(0)
-        loc = self.regalloc.loc(v)
-        pos = loc.get_jitframe_position()
+        pos = self._find_position_for_box(op.getarg(0))
         self.newops.append(op.copy_and_change(rop.BACKEND_PUT,
                                               args=[ConstInt(pos),
                                                     op.getarg(1),
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
@@ -162,13 +162,13 @@
         looptoken = JitCellToken()
         targettoken = TargetToken()
         jitcode = JitCode("name")
-        jitcode.setup()
+        jitcode.setup(num_regs_i=1, num_regs_r=0, num_regs_f=0)
         operations = [
             ResOperation(rop.ENTER_FRAME, [ConstInt(-1)], None, descr=jitcode),
             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.RESUME_PUT, [i2, ConstInt(0), ConstInt(0)],
+            ResOperation(rop.RESUME_PUT, [i1, ConstInt(0), ConstInt(0)],
                          None),
             ResOperation(rop.GUARD_TRUE, [i2], None, descr=BasicFailDescr(2)),
             ResOperation(rop.LEAVE_FRAME, [], None),
diff --git a/rpython/jit/metainterp/resume2.py 
b/rpython/jit/metainterp/resume2.py
--- a/rpython/jit/metainterp/resume2.py
+++ b/rpython/jit/metainterp/resume2.py
@@ -4,10 +4,6 @@
 from rpython.jit.codewriter.jitcode import JitCode
 
 class AbstractResumeReader(object):
-    def __init__(self, metainterp, deadframe):
-        self.metainterp = metainterp
-        self.deadframe = deadframe
-
     def rebuild(self, faildescr):
         bytecode = faildescr.rd_loop.rd_bytecode
         pos = faildescr.rd_bytecode_position
@@ -30,21 +26,11 @@
                 xxx
             pos += 1
 
-    def enter_frame(self, pc, jitcode):
-        if pc != -1:
-            self.metainterp.framestack[-1].pc = pc
-        self.metainterp.newframe(jitcode)
-
-    def leave_frame(self):
-        self.metainterp.popframe()
-
     def put(self, jitframe_index, depth, frontend_position):
         jitcode = self.metainterp.framestack[-1].jitcode
-        cpu = self.metainterp.cpu
         frame = self.metainterp.framestack[- depth - 1]
         if frontend_position < jitcode.num_regs_i():
-            self.write_int(frame, frontend_position,
-                           cpu.get_int_value(self.deadframe, jitframe_index))
+            self.write_int(frame, frontend_position, jitframe_index)
         elif frontend_position < (jitcode.num_regs_r() + jitcode.num_regs_i()):
             xxx
         else:
@@ -55,7 +41,21 @@
     pass
 
 class BoxResumeReader(AbstractResumeReader):
-    def write_int(self, frame, pos, value):
+    def __init__(self, metainterp, deadframe):
+        self.metainterp = metainterp
+        self.deadframe = deadframe
+
+    def enter_frame(self, pc, jitcode):
+        if pc != -1:
+            self.metainterp.framestack[-1].pc = pc
+        self.metainterp.newframe(jitcode)
+
+    def leave_frame(self):
+        self.metainterp.popframe()
+
+    def write_int(self, frame, pos, jitframe_index):
+        cpu = self.metainterp.cpu
+        value = cpu.get_int_value(self.deadframe, jitframe_index)
         frame.registers_i[pos] = BoxInt(value)
 
 def rebuild_from_resumedata(metainterp, deadframe, faildescr):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to