[pypy-commit] pypy resume-refactor: shuffle stuff around, one more test pass

fijal noreply at buildbot.pypy.org
Fri Jan 31 15:56:31 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: resume-refactor
Changeset: r69037:44ef0203c38b
Date: 2014-01-31 15:55 +0100
http://bitbucket.org/pypy/pypy/changeset/44ef0203c38b/

Log:	shuffle stuff around, one more test pass

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
@@ -4,6 +4,7 @@
 from rpython.jit.metainterp.optimizeopt.virtualize import OptVirtualize
 from rpython.jit.metainterp.optimizeopt.heap import OptHeap
 from rpython.jit.metainterp.optimizeopt.vstring import OptString
+from rpython.jit.metainterp.optimizeopt.resume import OptResume
 from rpython.jit.metainterp.optimizeopt.unroll import optimize_unroll
 from rpython.jit.metainterp.optimizeopt.simplify import OptSimplify
 from rpython.jit.metainterp.optimizeopt.pure import OptPure
@@ -13,7 +14,8 @@
 from rpython.rlib.debug import debug_start, debug_stop, debug_print
 
 
-ALL_OPTS = [('intbounds', OptIntBounds),
+ALL_OPTS = [('resume', OptResume),
+            ('intbounds', OptIntBounds),
             ('rewrite', OptRewrite),
             ('virtualize', OptVirtualize),
             ('string', OptString),
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
@@ -347,6 +347,7 @@
     def __init__(self, metainterp_sd, loop, optimizations=None):
         self.metainterp_sd = metainterp_sd
         self.cpu = metainterp_sd.cpu
+        self.delayed_resume_put = None
         self.loop = loop
         self.values = {}
         self.interned_refs = self.cpu.ts.new_ref_dict()
@@ -567,6 +568,10 @@
                 raise ValueError, "invalid optimization"
             self.seen_results[op.result] = None
         self._newoperations.append(op)
+        if (self.delayed_resume_put is not None and
+            self.delayed_resume_put.getarg(0) is op.result):
+            self._newoperations.append(self.delayed_resume_put)
+            self.delayed_resume_put = None
 
     def replace_op(self, old_op, new_op):
         # XXX: Do we want to cache indexes to prevent search?
@@ -671,17 +676,6 @@
         value = self.getvalue(op.getarg(0))
         self.optimizer.opaque_pointers[value] = True
 
-    # the following stuff should go to the default Optimization thing,
-    # pending refactor
-
-    def optimize_ENTER_FRAME(self, op):
-        self.resumebuilder.enter_frame(op.getarg(0).getint(), op.getdescr())
-        self.optimize_default(op)
-
-    def optimize_LEAVE_FRAME(self, op):
-        self.resumebuilder.leave_frame(op)
-        self.optimize_default(op)
-
 dispatch_opt = make_dispatcher_method(Optimizer, 'optimize_',
         default=Optimizer.optimize_default)
 
diff --git a/rpython/jit/metainterp/optimizeopt/resume.py b/rpython/jit/metainterp/optimizeopt/resume.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/metainterp/optimizeopt/resume.py
@@ -0,0 +1,32 @@
+
+from rpython.jit.metainterp.optimizeopt import optimizer
+from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
+
+""" All of this directly emit the ops, without calling emit_operation
+(they also don't have boxes except a resume_put)
+"""
+
+class OptResume(optimizer.Optimization):
+    def optimize_RESUME_PUT(self, op):
+        if op.getarg(0) in self.optimizer.producer:
+            self.optimizer.resumebuilder.resume_put(op)
+        else:
+            self.optimizer.delayed_resume_put = op
+            # otherwise we did not emit the operation just yet
+
+    def optimize_ENTER_FRAME(self, op):
+        rb = self.optimizer.resumebuilder
+        rb.enter_frame(op.getarg(0).getint(), op.getdescr())
+        self.optimizer._newoperations.append(op)
+
+    def optimize_LEAVE_FRAME(self, op):
+        self.optimizer.resumebuilder.leave_frame(op)
+        self.optimizer._newoperations.append(op)
+
+    def optimize_RESUME_SET_PC(self, op):
+        self.optimizer._newoperations.append(op)        
+
+dispatch_opt = make_dispatcher_method(OptResume, 'optimize_',
+        default=OptResume.emit_operation)
+
+OptResume.propagate_forward = dispatch_opt
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -57,17 +57,6 @@
         self.optimizer = UnrollableOptimizer(metainterp_sd, loop, optimizations)
         self.boxes_created_this_iteration = None
 
-    def fix_snapshot(self, jump_args, snapshot):
-        if snapshot is None:
-            return None
-        snapshot_args = snapshot.boxes
-        new_snapshot_args = []
-        for a in snapshot_args:
-            a = self.getvalue(a).get_key_box()
-            new_snapshot_args.append(a)
-        prev = self.fix_snapshot(jump_args, snapshot.prev)
-        return Snapshot(prev, new_snapshot_args)
-
     def propagate_all_forward(self):
         loop = self.optimizer.loop
         self.optimizer.clear_newoperations()
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
@@ -841,11 +841,6 @@
         value.ensure_nonnull()
         self.emit_operation(op)
 
-    def optimize_RESUME_PUT(self, op):
-        if op.getarg(0) in self.optimizer.producer:
-            self.optimizer.resumebuilder.resume_put(op)
-            # otherwise we did not emit the operation just yet
-
 
 dispatch_opt = make_dispatcher_method(OptVirtualize, 'optimize_',
         default=OptVirtualize.emit_operation)
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -437,7 +437,7 @@
     """Inconsistency in the JIT hints."""
 
 ENABLE_ALL_OPTS = (
-    'intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll')
+    'resume:intbounds:rewrite:virtualize:string:earlyforce:pure:heap:unroll')
 
 PARAMETER_DOCS = {
     'threshold': 'number of times a loop has to run for it to become hot',


More information about the pypy-commit mailing list