Author: Maciej Fijalkowski <[email protected]>
Branch: resume-refactor
Changeset: r68854:2b6d417a7f05
Date: 2014-01-18 15:00 +0100
http://bitbucket.org/pypy/pypy/changeset/2b6d417a7f05/
Log: Finish few bits and bobs to pass test_loop again
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
@@ -817,7 +817,7 @@
else:
inline_short_preamble = True
try:
- optimize_trace(metainterp_sd, new_trace, state.enable_opts,
inline_short_preamble)
+ optimize_trace(metainterp_sd, new_trace, state.enable_opts,
inline_short_preamble, inpframes=new_trace.inputframes)
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/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,7 +47,8 @@
return optimizations, unroll
-def optimize_trace(metainterp_sd, loop, enable_opts,
inline_short_preamble=True):
+def optimize_trace(metainterp_sd, loop, enable_opts,
inline_short_preamble=True,
+ inpframes=None):
"""Optimize loop.operations to remove internal overheadish operations.
"""
from rpython.jit.resume.backend import flatten
@@ -60,7 +61,8 @@
if unroll:
optimize_unroll(metainterp_sd, loop, optimizations,
inline_short_preamble)
else:
- optimizer = Optimizer(metainterp_sd, loop, optimizations)
+ optimizer = Optimizer(metainterp_sd, loop, optimizations,
+ inpframes=inpframes)
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,7 +344,8 @@
class Optimizer(Optimization):
- def __init__(self, metainterp_sd, loop, optimizations=None):
+ def __init__(self, metainterp_sd, loop, optimizations=None,
+ inpframes=None):
self.metainterp_sd = metainterp_sd
self.cpu = metainterp_sd.cpu
self.loop = loop
@@ -367,7 +368,7 @@
self.call_pure_results = loop.call_pure_results
self.set_optimizations(optimizations)
- self.resumebuilder = OptResumeBuilder(self)
+ self.resumebuilder = OptResumeBuilder(self, inpframes)
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
@@ -155,9 +155,13 @@
if encoded_pos == CLEAR_POSITION:
return
tag, index = self.decode(encoded_pos)
- if tag & TAGBOX:
+ if tag == TAGBOX:
curbh.registers_i[i] = self.cpu.get_int_value(self.deadframe,
index)
- return
+ elif tag == TAGSMALLINT:
+ curbh.registers_i[i] = index
+ else:
+ xxx
+ return
xxx
if jitframe_pos >= 0:
curbh.registers_i[i] = self.cpu.get_int_value(
@@ -169,9 +173,13 @@
if encoded_pos == CLEAR_POSITION:
return
tag, index = self.decode(encoded_pos)
- if tag & TAGBOX:
+ if tag == TAGBOX:
curbh.registers_r[i] = self.cpu.get_ref_value(self.deadframe,
index)
- return
+ elif tag == TAGCONST:
+ curbh.registers_r[i] = self.consts[index].getref_base()
+ else:
+ xxx
+ return
xxxx
if jitframe_pos >= 0:
curbh.registers_r[i] = self.cpu.get_ref_value(
@@ -207,6 +215,9 @@
if TP == INT:
val = self.metainterp.cpu.get_int_value(self.deadframe, pos)
res = BoxInt(val)
+ elif TP == REF:
+ val = self.metainterp.cpu.get_ref_value(self.deadframe, pos)
+ res = BoxPtr(val)
else:
xxx
self.cache[encoded_pos] = res
diff --git a/rpython/jit/resume/optimizer.py b/rpython/jit/resume/optimizer.py
--- a/rpython/jit/resume/optimizer.py
+++ b/rpython/jit/resume/optimizer.py
@@ -4,18 +4,25 @@
from rpython.jit.codewriter.jitcode import JitCode
class ResumeFrame(object):
- def __init__(self, pc, jitcode):
+ def __init__(self, pc, jitcode, no=-1):
self.pc = pc
- assert isinstance(jitcode, JitCode)
- self.jitcode = jitcode
- self.values = [None] * jitcode.num_regs()
+ if jitcode is None:
+ assert no >= 0
+ self.values = [None] * no
+ else:
+ assert isinstance(jitcode, JitCode)
+ self.jitcode = jitcode
+ self.values = [None] * jitcode.num_regs()
class OptResumeBuilder(object):
- def __init__(self, opt):
+ def __init__(self, opt, inpframes=None):
self.framestack = []
self.last_flushed_pos = 0
self.opt = opt
self.virtuals = {}
+ if inpframes is not None:
+ for frame in inpframes:
+ self.framestack.append(ResumeFrame(0, None, len(frame)))
def enter_frame(self, pc, jitcode):
self.framestack.append(ResumeFrame(pc, jitcode))
diff --git a/rpython/jit/resume/reader.py b/rpython/jit/resume/reader.py
--- a/rpython/jit/resume/reader.py
+++ b/rpython/jit/resume/reader.py
@@ -58,8 +58,7 @@
self.virtuals[index].fields[descr] = fieldpos
def resume_clear(self, frame_no, frontend_position):
- xxx
- self.framestack[frame_no].registers[frontend_position] = -1
+ self.framestack[frame_no].registers[frontend_position] =
rescode.CLEAR_POSITION
def resume_set_pc(self, pc):
self.framestack[-1].pc = pc
@@ -112,7 +111,10 @@
self.resume_setfield_gc(structpos, fieldpos, descr)
pos += 7
elif op == rescode.RESUME_CLEAR:
- xxx
+ frame_pos = self.read(pos + 1)
+ pos_in_frame = self.read(pos + 2)
+ self.resume_clear(frame_pos, pos_in_frame)
+ pos += 3
elif op == rescode.RESUME_SET_PC:
pc = self.read_short(pos + 1)
self.resume_set_pc(pc)
@@ -140,11 +142,17 @@
def resume_new(self, v_pos, descr):
self.l.append("%d = resume_new %d" % (v_pos, descr.global_descr_index))
+ def leave_frame(self):
+ self.l.append("leave_frame")
+
def resume_setfield_gc(self, structpos, fieldpos, descr):
stag, sindex = self.decode(structpos)
ftag, findex = self.decode(fieldpos)
self.l.append("resume_setfield_gc (%d, %d) (%d, %d) %d" % (
stag, sindex, ftag, findex, descr.global_descr_index))
+ def resume_set_pc(self, pc):
+ self.l.append("set_resume_pc %d" % pc)
+
def finish(self):
return "\n".join(self.l)
diff --git a/rpython/jit/resume/rescode.py b/rpython/jit/resume/rescode.py
--- a/rpython/jit/resume/rescode.py
+++ b/rpython/jit/resume/rescode.py
@@ -63,7 +63,8 @@
def encode_const(self, const):
if isinstance(const, ConstInt) and 0 <= const.getint() < 0x4000:
return TAGSMALLINT | (const.getint() << 2)
- xxx
+ self.consts.append(const)
+ return TAGCONST | ((len(self.consts) - 1) << 2)
def resume_set_pc(self, pc):
self.write(RESUME_SET_PC)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit