Author: Maciej Fijalkowski <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit