[pypy-commit] pypy resume-refactor: (fijal, rguillebert) support for the very basic resume_new
fijal
noreply at buildbot.pypy.org
Thu Jan 16 15:16:03 CET 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r68699:5ce191fc13ab
Date: 2014-01-16 15:15 +0100
http://bitbucket.org/pypy/pypy/changeset/5ce191fc13ab/
Log: (fijal, rguillebert) support for the very basic resume_new
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
@@ -5,6 +5,7 @@
ImmutableIntUnbounded, \
IntLowerBound, MININT, MAXINT
from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
+from rpython.jit.metainterp.optimizeopt.resumeopt import OptResumeBuilder
from rpython.jit.metainterp.resoperation import rop, ResOperation, AbstractResOp
from rpython.jit.metainterp.typesystem import llhelper
from rpython.tool.pairtype import extendabletype
@@ -363,7 +364,7 @@
self.call_pure_results = loop.call_pure_results
self.set_optimizations(optimizations)
- self.resume_stack = []
+ self.resumebuilder = OptResumeBuilder(self)
self.setup()
def set_optimizations(self, optimizations):
@@ -387,7 +388,7 @@
o.force_at_end_of_preamble()
def flush(self):
- self.resume_flush()
+ self.resumebuilder.resume_flush()
for o in self.optimizations:
o.flush()
@@ -547,11 +548,13 @@
self.metainterp_sd.profiler.count(jitprof.Counters.OPT_OPS)
if op.is_guard():
self.metainterp_sd.profiler.count(jitprof.Counters.OPT_GUARDS)
+ pendingfields = self.pendingfields
self.pendingfields = None
if self.replaces_guard and op in self.replaces_guard:
self.replace_op(self.replaces_guard[op], op)
del self.replaces_guard[op]
return
+ self.resumebuilder.guard_seen(op, pendingfields)
elif op.can_raise():
self.exception_might_have_happened = True
if op.result:
@@ -676,23 +679,13 @@
# pending refactor
def optimize_ENTER_FRAME(self, op):
- self.resume_stack.append(op)
+ self.resumebuilder.enter_frame(op.getarg(0).getint(), op.getdescr())
+ self.optimize_default(op)
def optimize_LEAVE_FRAME(self, op):
- if self.resume_stack:
- self.resume_stack.pop()
- else:
- self.emit_operation(op)
-
- def optimize_RESUME_PUT(self, op):
- self.resume_flush()
+ self.resumebuilder.leave_frame(op)
self.optimize_default(op)
- def resume_flush(self):
- for op in self.resume_stack:
- self.emit_operation(op)
- self.resume_stack = []
-
dispatch_opt = make_dispatcher_method(Optimizer, 'optimize_',
default=Optimizer.optimize_default)
diff --git a/rpython/jit/metainterp/optimizeopt/resumeopt.py b/rpython/jit/metainterp/optimizeopt/resumeopt.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/metainterp/optimizeopt/resumeopt.py
@@ -0,0 +1,67 @@
+
+from rpython.jit.metainterp.history import ConstInt, BoxPtr
+from rpython.jit.metainterp.resoperation import rop, ResOperation
+from rpython.jit.codewriter.jitcode import JitCode
+
+class ResumeFrame(object):
+ def __init__(self, pc, jitcode):
+ self.pc = pc
+ assert isinstance(jitcode, JitCode)
+ self.jitcode = jitcode
+ self.boxes = [None] * jitcode.num_regs()
+
+class OptResumeBuilder(object):
+ def __init__(self, opt):
+ self.framestack = []
+ self.last_flushed_pos = 0
+ self.opt = opt
+ self.virtuals = {}
+
+ def enter_frame(self, pc, jitcode):
+ self.framestack.append(ResumeFrame(pc, jitcode))
+
+ def leave_frame(self, op):
+ #if self.last_flushed_pos < len(self.framestack) - 1:
+ # self.emit_missing_enter_frame()
+ #else:
+ # self.opt.emit_operation(op)
+ # self.last_flushed_pos -= 1
+ self.framestack.pop()
+
+ def resume_flush(self):
+ return
+ for i in range(self.last_flushed_pos, len(self.framestack)):
+ frame = self.framestack[i]
+ resop = ResOperation(rop.ENTER_FRAME, [ConstInt(frame.pc)],
+ None, descr=frame.jitcode)
+ self.opt.emit_operation(resop)
+ self.last_flushed_pos = len(self.framestack)
+
+ def resume_put(self, op):
+ self.resume_flush()
+ box = op.getarg(0)
+ value = self.opt.getvalue(box)
+ if value.is_virtual():
+ op = ResOperation(rop.RESUME_PUT, [value.resume_box,
+ op.getarg(1),
+ op.getarg(2)], None)
+ self.opt._newoperations.append(op)
+ else:
+ self.opt.emit_operation(op)
+ #no = op.getarg(2).getint()
+ #box = self.opt.getvalue(op.getarg(0)).box
+ #self.framestack[op.getarg(1).getint()].boxes[no] = box
+
+ def new_virtual(self, box):
+ xxx
+ self.optimizer.emit_operation(rop.RESUME_NEW)
+
+ def new_virtual_struct(self, box, vstruct, structdescr):
+ newbox = BoxPtr()
+ vstruct.resume_box = newbox
+ op = ResOperation(rop.RESUME_NEW, [], newbox, descr=structdescr)
+ self.opt._newoperations.append(op)
+
+ def guard_seen(self, op, pendingfields):
+ #xxx
+ pass
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -454,6 +454,27 @@
"""
self.optimize_loop(ops, expected)
+ def test_virtual_resume_info(self):
+ ops = """
+ [i0]
+ enter_frame(-1, descr=jitcode)
+ p0 = new(descr=ssize)
+ resume_put(p0, 0, 0)
+ guard_true(i0)
+ leave_frame()
+ finish()
+ """
+ expected = """
+ [i0]
+ enter_frame(-1, descr=jitcode)
+ p0 = resume_new(descr=ssize)
+ resume_put(p0, 0, 0)
+ guard_true(i0)
+ leave_frame()
+ finish()
+ """
+ self.optimize_loop(ops, expected)
+
def test_ooisnull_oononnull_via_virtual(self):
ops = """
[p0]
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -14,7 +14,7 @@
class AbstractVirtualValue(optimizer.OptValue):
- _attrs_ = ('keybox', 'source_op', '_cached_vinfo')
+ _attrs_ = ('keybox', 'source_op', '_cached_vinfo', 'resume_box')
box = None
level = optimizer.LEVEL_NONNULL
is_about_raw = False
@@ -491,6 +491,7 @@
def make_virtual(self, known_class, box, source_op=None):
vvalue = VirtualValue(self.optimizer.cpu, known_class, box, source_op)
+ self.optimizer.resumebuilder.new_virtual(box)
self.make_equal_to(box, vvalue)
return vvalue
@@ -505,6 +506,8 @@
def make_vstruct(self, structdescr, box, source_op=None):
vvalue = VStructValue(self.optimizer.cpu, structdescr, box, source_op)
+ self.optimizer.resumebuilder.new_virtual_struct(box, vvalue,
+ structdescr)
self.make_equal_to(box, vvalue)
return vvalue
@@ -825,6 +828,9 @@
value.ensure_nonnull()
self.emit_operation(op)
+ def optimize_RESUME_PUT(self, op):
+ self.optimizer.resumebuilder.resume_put(op)
+
dispatch_opt = make_dispatcher_method(OptVirtualize, 'optimize_',
default=OptVirtualize.emit_operation)
More information about the pypy-commit
mailing list