[pypy-commit] pypy resume-refactor: (fijal, rguillebert) finish porting llgraph backend
fijal
noreply at buildbot.pypy.org
Sun Jan 12 15:56:54 CET 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r68616:003f6f6d91dd
Date: 2014-01-12 15:56 +0100
http://bitbucket.org/pypy/pypy/changeset/003f6f6d91dd/
Log: (fijal, rguillebert) finish porting 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
@@ -2,7 +2,7 @@
from rpython.jit.backend import model
from rpython.jit.backend.llgraph import support
from rpython.jit.backend.resumebuilder import ResumeBuilder,\
- LivenessAnalyzer
+ LivenessAnalyzer, compute_vars_longevity, flatten
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
@@ -16,47 +16,78 @@
from rpython.rlib.rarithmetic import ovfcheck, r_uint, r_ulonglong
from rpython.rlib.rtimer import read_timestamp
+class Position(object):
+ def __init__(self, pos):
+ self.pos = pos
+
+ def get_jitframe_position(self):
+ return self.pos
+
+class ResumeFrame(object):
+ def __init__(self, num, start_pos):
+ self.registers = [None] * num
+ self.start_pos = start_pos
+
class LLGraphResumeBuilder(ResumeBuilder):
- def __init__(self):
- ResumeBuilder.__init__(self, None)
+ def __init__(self, frontend_liveness, descr, inputframes, inputlocs):
self.liveness = LivenessAnalyzer()
self.numbering = {}
+ self.framestack = []
+ locs = []
+ start_pos = 0
+ for frame_pos, frame in enumerate(inputframes):
+ if inputlocs is not None:
+ self.framestack.append(ResumeFrame(len(frame), start_pos))
+ for pos_in_frame, box in enumerate(frame):
+ if inputlocs is not None:
+ pos = inputlocs[frame_pos][pos_in_frame]
+ self.framestack[-1].registers[pos_in_frame] = box
+ else:
+ pos = len(self.numbering)
+ self.numbering[box] = pos
+ locs.append(Position(pos))
+ start_pos += len(frame)
+ ResumeBuilder.__init__(self, self, frontend_liveness, descr,
+ inputframes, locs)
+
+ def loc(self, box, must_exist=True):
+ return Position(self.numbering[box])
def process(self, op):
- func = getattr(self, 'process_' + op.getopname(), None)
- if func is not None:
- func(op)
+ getattr(self, 'process_' + op.getopname())(op)
+ ResumeBuilder.process(self, op)
def process_enter_frame(self, op):
- self.liveness.enter_frame(op.getdescr())
- ResumeBuilder.process_enter_frame(self, op)
+ if self.framestack:
+ prev_frame = self.framestack[-1]
+ start_pos = prev_frame.start_pos + len(prev_frame.registers)
+ else:
+ start_pos = 0
+ self.framestack.append(ResumeFrame(op.getdescr().num_regs(), start_pos))
def process_leave_frame(self, op):
- self.liveness.leave_frame()
- ResumeBuilder.process_leave_frame(self, op)
+ self.framestack.pop()
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]
+ box = op.getarg(0)
+ frame_pos = op.getarg(1).getint()
+ pos_in_frame = op.getarg(2).getint()
+ i = self.framestack[frame_pos].start_pos + pos_in_frame
+ self.numbering[box] = i
+ self.framestack[frame_pos].registers[pos_in_frame] = box
def get_numbering(self, mapping, op):
- numbering = []
- for f in self.liveness.framestack:
- for v in f:
- numbering.append(mapping(v))
- return numbering
-
+ lst = []
+ for frame in self.framestack:
+ for reg in frame.registers:
+ lst.append(mapping(reg))
+ return lst
+
class LLTrace(object):
has_been_freed = False
invalid = False
- def __init__(self, inputargs, operations):
+ def __init__(self, inputframes, operations, descr, locs=None):
# We need to clone the list of operations because the
# front-end will mutate them under our feet again. We also
# need to make sure things get freed.
@@ -69,10 +100,13 @@
newbox = _cache[box] = box.__class__()
return newbox
#
- self.inputargs = map(mapping, inputargs)
+ self.inputargs = map(mapping, flatten(inputframes))
self.operations = []
- xxxx
- resumebuilder = LLGraphResumeBuilder()
+ x = compute_vars_longevity(inputframes, operations, descr)
+ longevity, last_real_usage, frontend_liveness = x
+
+ resumebuilder = LLGraphResumeBuilder(frontend_liveness, descr,
+ inputframes, locs)
for op in operations:
if op.is_resume():
resumebuilder.process(op)
@@ -90,10 +124,20 @@
newdescr)
if op.is_guard():
newop.failargs = resumebuilder.get_numbering(mapping, op)
- newop.failarg_numbers = resumebuilder.get_numbering(
- lambda x: resumebuilder.numbering[x], op)
+ newop.getdescr().rd_bytecode_position = len(resumebuilder.newops)
self.operations.append(newop)
+ if descr is None:
+ parent = None
+ parent_position = 0
+ else:
+ parent = descr.rd_resume_bytecode
+ parent_position = descr.rd_bytecode_position
+ bytecode = resumebuilder.finish(parent, parent_position, self)
+ for op in operations:
+ if op.is_guard():
+ op.getdescr().rd_resume_bytecode = bytecode
+
class WeakrefDescr(AbstractDescr):
def __init__(self, realdescr):
self.realdescrref = weakref.ref(realdescr)
@@ -232,16 +276,16 @@
name=''):
clt = model.CompiledLoopToken(self, looptoken.number)
looptoken.compiled_loop_token = clt
- lltrace = LLTrace(inputargs, operations, None)
+ lltrace = LLTrace([inputargs], operations, None)
clt._llgraph_loop = lltrace
clt._llgraph_alltraces = [lltrace]
self._record_labels(lltrace)
- def compile_bridge(self, logger, faildescr, inputargs, operations,
+ def compile_bridge(self, logger, faildescr, inputframes, locs, operations,
original_loop_token, log=True):
clt = original_loop_token.compiled_loop_token
clt.compiling_a_bridge()
- lltrace = LLTrace(inputargs, operations, faildescr)
+ lltrace = LLTrace(inputframes, operations, faildescr, locs)
faildescr._llgraph_bridge = lltrace
clt._llgraph_alltraces.append(lltrace)
self._record_labels(lltrace)
@@ -317,7 +361,7 @@
assert isinstance(frame, LLFrame)
assert frame.forced_deadframe is None
values = []
- for box in frame.force_guard_op.getfailargs():
+ for box in frame.force_guard_op.failargs:
if box is not None:
if box is not frame.current_op.result:
value = frame.env[box]
@@ -739,12 +783,11 @@
# -----------------------------------------------------
def fail_guard(self, descr, saved_data=None):
- values = {}
+ 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
+ values.append(value)
if hasattr(descr, '_llgraph_bridge'):
target = (descr._llgraph_bridge, -1)
raise Jump(target, values)
More information about the pypy-commit
mailing list