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