[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