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