Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r68856:faf703373bb5
Date: 2014-01-18 15:57 +0100
http://bitbucket.org/pypy/pypy/changeset/faf703373bb5/
Log: finish refactoring the world - now inputframes no longer exists and
we replay the necessary resume ops
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
@@ -34,23 +34,10 @@
self.liveness = LivenessAnalyzer()
self.numbering = {}
self.framestack = []
- locs = None
- start_pos = 0
- xxx
if inputlocs is not None:
- locs = []
- for frame_pos, frame in enumerate(inputframes):
- self.framestack.append(ResumeFrame(len(frame), start_pos))
- for pos_in_frame, box in enumerate(frame):
- if box is None:
- continue
- pos = inputlocs[frame_pos][pos_in_frame]
- self.framestack[-1].registers[pos_in_frame] = box
- self.numbering[box] = pos
- locs.append(Position(pos))
- start_pos += 1
- ResumeBuilder.__init__(self, self, frontend_liveness, descr,
- inputframes, locs)
+ for arg, loc in zip(inputargs, inputlocs):
+ self.numbering[arg] = loc
+ ResumeBuilder.__init__(self, self, frontend_liveness, descr)
def loc(self, box, must_exist=True):
return Position(self.numbering[box])
@@ -142,13 +129,7 @@
newop.getdescr().rd_bytecode_position =
resumebuilder.builder.getpos()
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)
+ bytecode = resumebuilder.finish(self)
for op in operations:
if op.is_guard():
op.getdescr().rd_resume_bytecode = bytecode
@@ -291,7 +272,7 @@
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)
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
@@ -250,6 +250,10 @@
i1b = BoxInt()
i3 = BoxInt()
bridge = [
+ ResOperation(rop.ENTER_FRAME, [ConstInt(-1)], None,
+ descr=jitcode),
+ ResOperation(rop.RESUME_PUT, [i1b, ConstInt(0), ConstInt(0)],
+ None),
ResOperation(rop.INT_LE, [i1b, ConstInt(19)], i3),
ResOperation(rop.GUARD_TRUE, [i3], None, descr=faildescr2),
ResOperation(rop.LEAVE_FRAME, [], None),
diff --git a/rpython/jit/metainterp/compile.py
b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -124,7 +124,7 @@
jitcell_token = make_jitcell_token(jitdriver_sd)
part = create_empty_loop(metainterp)
- part.inputframes = [inputargs[:]]
+ part.inputargs = inputargs[:]
h_ops = history.operations
part.resume_at_jump_descr = resume_at_jump_descr
part.operations = [ResOperation(rop.LABEL, inputargs, None,
descr=TargetToken(jitcell_token))] + \
@@ -140,7 +140,7 @@
all_target_tokens = [target_token]
loop = create_empty_loop(metainterp)
- loop.inputframes = part.inputframes
+ loop.inputargs = part.inputargs
loop.operations = part.operations
loop.quasi_immutable_deps = {}
if part.quasi_immutable_deps:
@@ -198,7 +198,7 @@
assert partial_trace.operations[-1].getopnum() == rop.LABEL
part = create_empty_loop(metainterp)
- part.inputframes = [inputargs[:]]
+ part.inputargs = inputargs[:]
part.resume_at_jump_descr = resume_at_jump_descr
h_ops = history.operations
@@ -253,10 +253,10 @@
def patch_new_loop_to_load_virtualizable_fields(loop, jitdriver_sd):
vinfo = jitdriver_sd.virtualizable_info
extra_ops = []
- inputargs = loop.inputframes[0]
+ inputargs = loop.inputargs
vable_box = inputargs[jitdriver_sd.index_of_virtualizable]
i = jitdriver_sd.num_red_args
- loop.inputframes = [inputargs[:i]]
+ loop.inputargs = inputargs[:i]
for descr in vinfo.static_field_descrs:
assert i < len(inputargs)
box = inputargs[i]
@@ -338,8 +338,7 @@
metainterp_sd.profiler.start_backend()
debug_start("jit-backend")
try:
- assert len(loop.inputframes) == 1
- asminfo = do_compile_loop(metainterp_sd, loop.inputframes[0],
+ asminfo = do_compile_loop(metainterp_sd, loop.inputargs,
operations, original_jitcell_token,
name=loopname)
finally:
@@ -357,7 +356,7 @@
ops_offset = asminfo.ops_offset
else:
ops_offset = None
- metainterp_sd.logger_ops.log_loop(loop.inputframes[0], loop.operations, n,
+ metainterp_sd.logger_ops.log_loop(loop.inputargs, loop.operations, n,
type, ops_offset,
name=loopname)
#
@@ -383,7 +382,7 @@
metainterp_sd.profiler.start_backend()
debug_start("jit-backend")
try:
- asminfo = do_compile_bridge(metainterp_sd, faildescr, inputframes,
+ asminfo = do_compile_bridge(metainterp_sd, faildescr, inputargs,
inputlocs, operations,
original_loop_token)
finally:
@@ -609,13 +608,13 @@
# to the corresponding guard_op and compile from there
assert metainterp.resumekey_original_loop_token is not None
new_loop.original_jitcell_token =
metainterp.resumekey_original_loop_token
- inputframes = metainterp.history.inputframes
+ inputargs = metainterp.history.inputargs
inputlocs = metainterp.history.inputlocs
if not we_are_translated():
self._debug_suboperations = new_loop.operations
propagate_original_jitcell_token(new_loop)
send_bridge_to_backend(metainterp.jitdriver_sd, metainterp.staticdata,
- self, inputframes, inputlocs,
+ self, inputargs, inputlocs,
new_loop.operations,
new_loop.original_jitcell_token)
@@ -803,7 +802,7 @@
# Attempt to use optimize_bridge(). This may return None in case
# it does not work -- i.e. none of the existing old_loop_tokens match.
new_trace = create_empty_loop(metainterp)
- new_trace.inputframes = metainterp.history.inputframes[:]
+ new_trace.inputargs = metainterp.history.inputargs[:]
if metainterp.history.inputlocs is not None:
new_trace.inputlocs = metainterp.history.inputlocs[:]
# clone ops, as optimize_bridge can mutate the ops
@@ -817,7 +816,8 @@
else:
inline_short_preamble = True
try:
- optimize_trace(metainterp_sd, new_trace, state.enable_opts,
inline_short_preamble, inpframes=new_trace.inputframes)
+ optimize_trace(metainterp_sd, new_trace, state.enable_opts,
+ inline_short_preamble)
except InvalidLoop:
debug_print("compile_new_bridge: got an InvalidLoop")
# XXX I am fairly convinced that optimize_bridge cannot actually raise
diff --git a/rpython/jit/metainterp/history.py
b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -675,11 +675,10 @@
def check_consistency_of(inputargs, operations):
seen = {}
all = 0
- for frame in inputargs:
- for box in frame:
- assert isinstance(box, Box), "Loop.inputargs contains %r" %
(box,)
- seen[box] = None
- all += 1
+ for box in inputargs:
+ assert isinstance(box, Box), "Loop.inputargs contains %r" % (box,)
+ seen[box] = None
+ all += 1
assert len(seen) == all, (
"duplicate Box in the Loop.inputargs")
TreeLoop.check_consistency_of_branch(operations, seen)
diff --git a/rpython/jit/metainterp/optimizeopt/__init__.py
b/rpython/jit/metainterp/optimizeopt/__init__.py
--- a/rpython/jit/metainterp/optimizeopt/__init__.py
+++ b/rpython/jit/metainterp/optimizeopt/__init__.py
@@ -47,22 +47,19 @@
return optimizations, unroll
-def optimize_trace(metainterp_sd, loop, enable_opts,
inline_short_preamble=True,
- inpframes=None):
+def optimize_trace(metainterp_sd, loop, enable_opts,
+ inline_short_preamble=True):
"""Optimize loop.operations to remove internal overheadish operations.
"""
- from rpython.jit.resume.backend import flatten
-
debug_start("jit-optimize")
try:
loop.logops = metainterp_sd.logger_noopt.log_loop(
- flatten(loop.inputframes), loop.operations)
+ loop.inputargs, loop.operations)
optimizations, unroll = build_opt_chain(metainterp_sd, enable_opts)
if unroll:
optimize_unroll(metainterp_sd, loop, optimizations,
inline_short_preamble)
else:
- optimizer = Optimizer(metainterp_sd, loop, optimizations,
- inpframes=inpframes)
+ optimizer = Optimizer(metainterp_sd, loop, optimizations)
optimizer.propagate_all_forward()
finally:
debug_stop("jit-optimize")
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -344,8 +344,7 @@
class Optimizer(Optimization):
- def __init__(self, metainterp_sd, loop, optimizations=None,
- inpframes=None):
+ def __init__(self, metainterp_sd, loop, optimizations=None):
self.metainterp_sd = metainterp_sd
self.cpu = metainterp_sd.cpu
self.loop = loop
@@ -368,7 +367,7 @@
self.call_pure_results = loop.call_pure_results
self.set_optimizations(optimizations)
- self.resumebuilder = OptResumeBuilder(self, inpframes)
+ self.resumebuilder = OptResumeBuilder(self)
self.setup()
def set_optimizations(self, optimizations):
diff --git a/rpython/jit/resume/frontend.py b/rpython/jit/resume/frontend.py
--- a/rpython/jit/resume/frontend.py
+++ b/rpython/jit/resume/frontend.py
@@ -205,7 +205,7 @@
self.deadframe = deadframe
AbstractResumeReader.__init__(self, metainterp.staticdata)
- def get_box_value(self, encoded_pos, TP):
+ def get_box_value(self, pos_in_frame, frame_pos, encoded_pos, TP):
if encoded_pos == CLEAR_POSITION:
return None
if encoded_pos in self.cache:
@@ -214,14 +214,21 @@
if tag == TAGBOX:
if TP == INT:
val = self.metainterp.cpu.get_int_value(self.deadframe, pos)
- res = BoxInt(val)
+ box = BoxInt(val)
elif TP == REF:
val = self.metainterp.cpu.get_ref_value(self.deadframe, pos)
- res = BoxPtr(val)
+ box = BoxPtr(val)
else:
xxx
- self.cache[encoded_pos] = res
- return res
+ if pos_in_frame != -1:
+ self.metainterp.history.record(rop.RESUME_PUT,
+ [box, ConstInt(frame_pos),
+ ConstInt(pos_in_frame)],
+ None, None)
+ self.result.append(box)
+ self.locs.append(pos)
+ self.cache[encoded_pos] = box
+ return box
elif tag == TAGSMALLINT:
return ConstInt(pos)
elif tag == TAGCONST:
@@ -233,51 +240,34 @@
for fielddescr, encoded_field_pos in virtual.fields.iteritems():
self.setfield_gc(virtual_box, encoded_field_pos, fielddescr)
self.cache[encoded_pos] = virtual_box
+ if pos_in_frame != -1:
+ self.metainterp.history.record(rop.RESUME_PUT,
+ [virtual_box,
+ ConstInt(frame_pos),
+ ConstInt(pos_in_frame)],
+ None, None)
return virtual_box
def allocate_struct(self, virtual):
return self.metainterp.execute_and_record(rop.NEW, virtual.descr)
def setfield_gc(self, box, encoded_field_pos, fielddescr):
- field_box = self.get_box_value(encoded_field_pos, fielddescr.kind)
+ field_box = self.get_box_value(-1, -1, encoded_field_pos,
+ fielddescr.kind)
self.metainterp.execute_and_record(rop.SETFIELD_GC, fielddescr,
box, field_box)
- def store_int_box(self, res, pos, miframe, i, jitframe_pos):
- box = self.get_box_value(jitframe_pos, INT)
+ def store_int_box(self, pos, miframe, i, jitframe_pos):
+ box = self.get_box_value(pos, i, jitframe_pos, INT)
if box is None:
return
miframe.registers_i[i] = box
- if not isinstance(box, Const):
- res[-1][pos] = box
- def store_ref_box(self, res, pos, miframe, i, jitframe_pos):
- box = self.get_box_value(jitframe_pos, REF)
+ def store_ref_box(self, pos, miframe, i, jitframe_pos):
+ box = self.get_box_value(pos, i, jitframe_pos, REF)
if box is None:
return
miframe.registers_r[i] = box
- tag, index = self.decode(jitframe_pos)
- if tag == TAGBOX:
- res[-1][pos] = box
- elif tag == TAGVIRTUAL:
- self.metainterp.history.record(rop.RESUME_PUT,
- [box, ConstInt(len(res) - 1),
- ConstInt(pos)], None, None)
- # we can't have virtual ints
- return
- xxx
- if jitframe_pos in self.cache:
- box = self.cache[jitframe_pos]
- elif jitframe_pos == -1:
- return
- elif jitframe_pos >= 0:
- box = BoxPtr(self.metainterp.cpu.get_ref_value(self.deadframe,
- jitframe_pos))
- elif jitframe_pos <= -2:
- box = self.consts[-jitframe_pos - 2]
- miframe.registers_r[i] = box
- self.cache[jitframe_pos] = box
- res[-1][pos] = box
def store_float_box(self, res, pos, miframe, i, jitframe_pos):
box = self.get_box_value(jitframe_pos)
@@ -304,26 +294,28 @@
return -1
def finish(self):
- res = []
+ self.result = []
self.cache = {}
+ self.locs = []
for frame in self.framestack:
jitcode = frame.jitcode
- res.append([None] * jitcode.num_regs())
miframe = self.metainterp.newframe(jitcode, record_resume=False)
miframe.pc = frame.pc
pos = 0
for i in range(jitcode.num_regs_i()):
- self.store_int_box(res, pos, miframe, i, frame.registers[pos])
+ self.store_int_box(pos, miframe, i, frame.registers[pos])
pos += 1
for i in range(jitcode.num_regs_r()):
- self.store_ref_box(res, pos, miframe, i, frame.registers[pos])
+ self.store_ref_box(pos, miframe, i, frame.registers[pos])
pos += 1
for i in range(jitcode.num_regs_f()):
- self.store_float_box(res, pos, miframe, i,
frame.registers[pos])
+ self.store_float_box(pos, miframe, i, frame.registers[pos])
pos += 1
self.cache = None
- return res, [[self.get_loc(r) for r in f.registers]
- for f in self.framestack]
+ state = self.result, self.locs
+ self.result = None
+ self.locs = None
+ return state
def rebuild_from_resumedata(metainterp, deadframe, faildescr):
""" Reconstruct metainterp frames from the resumedata
diff --git a/rpython/jit/resume/test/test_frontend.py
b/rpython/jit/resume/test/test_frontend.py
--- a/rpython/jit/resume/test/test_frontend.py
+++ b/rpython/jit/resume/test/test_frontend.py
@@ -111,15 +111,16 @@
metainterp = MockMetaInterp()
metainterp.staticdata = MockStaticData([jitcode], [])
metainterp.cpu = MockCPU()
- inpframes, inplocs = rebuild_from_resumedata(metainterp, "myframe",
descr)
+ inputargs, inplocs = rebuild_from_resumedata(metainterp, "myframe",
+ descr)
assert len(metainterp.framestack) == 1
f = metainterp.framestack[-1]
assert f.registers_i[1].getint() == 103
assert isinstance(f.registers_i[2], Const)
assert f.registers_i[2].getint() == 15
assert f.registers_i[3].getint() == 13
- assert inpframes == [[None, AnyBox(), None, None]]
- assert inplocs == [[-1, 100, -1, -1]]
+ assert len(inputargs) == 1
+ assert inplocs == [100]
def test_nested_call(self):
jitcode1 = JitCode("jitcode")
@@ -165,35 +166,6 @@
assert f.registers_i[2].getint() == 11 + 3
assert f.registers_i[4].getint() == 8 + 3
- def test_bridge(self):
- jitcode1 = JitCode("jitcode")
- jitcode1.setup(num_regs_i=13, num_regs_r=0, num_regs_f=0)
- jitcode1.global_index = 0
- builder = ResumeBytecodeBuilder()
- builder.enter_frame(-1, jitcode1)
- builder.resume_put(TAGBOX | (42 << 2), 0, 0)
- rd1 = builder.build()
- lgt1 = len(rd1)
-
- builder = ResumeBytecodeBuilder()
- builder.resume_put(TAGBOX | (2 << 2), 0, 1)
- rd2 = builder.build()
- lgt2 = len(rd2)
-
- descr = Descr()
- descr.rd_bytecode_position = lgt2
- parent = ResumeBytecode(rd1, [])
- b = ResumeBytecode(rd2, [], parent, parent_position=lgt1)
- descr.rd_resume_bytecode = b
- metainterp = MockMetaInterp()
- metainterp.staticdata = MockStaticData([jitcode1], [])
- metainterp.cpu = MockCPU()
- rebuild_from_resumedata(metainterp, "myframe", descr)
- f = metainterp.framestack[-1]
- assert f.num_nonempty_regs() == 2
- assert f.registers_i[0].getint() == 42 + 3
- assert f.registers_i[1].getint() == 2 + 3
-
def test_new(self):
jitcode1 = JitCode("jitcode")
jitcode1.global_index = 0
@@ -242,7 +214,7 @@
descr.rd_bytecode_position = len(rd)
staticdata = MockStaticData([jitcode1, jitcode2], [])
locs = rebuild_locs_from_resumedata(descr, staticdata)
- assert locs == [[8, 11], [12]]
+ assert locs == [8, 11, 12]
class AssemblerExecuted(Exception):
pass
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit