[pypy-commit] pypy default: Assuming quite a few ops are pure, remove the need to store a crazy dict

fijal noreply at buildbot.pypy.org
Mon Jan 12 14:28:29 CET 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: 
Changeset: r75304:99d27b9b9c8a
Date: 2015-01-12 15:28 +0200
http://bitbucket.org/pypy/pypy/changeset/99d27b9b9c8a/

Log:	Assuming quite a few ops are pure, remove the need to store a crazy
	dict of "emitted_pure_operations"

diff --git a/rpython/jit/metainterp/optimizeopt/pure.py b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -7,7 +7,7 @@
     def __init__(self):
         self.postponed_op = None
         self.pure_operations = args_dict()
-        self.emitted_pure_operations = {}
+        self.call_pure_positions = []
 
     def propagate_forward(self, op):
         dispatch_opt(self, op)
@@ -26,7 +26,6 @@
             nextop = None
 
         args = None
-        remember = None
         if canfold:
             for i in range(op.numargs()):
                 if self.get_constant_box(op.getarg(i)) is None:
@@ -45,8 +44,6 @@
             if oldvalue is not None:
                 self.optimizer.make_equal_to(op.result, oldvalue, True)
                 return
-            else:
-                remember = op
 
         # otherwise, the operation remains
         self.emit_operation(op)
@@ -56,8 +53,6 @@
             self.emit_operation(nextop)
         if args is not None:
             self.pure_operations[args] = self.getvalue(op.result)
-        if remember:
-            self.remember_emitting_pure(remember)
 
     def optimize_CALL_PURE(self, op):
         # Step 1: check if all arguments are constant
@@ -85,7 +80,7 @@
         args = op.getarglist()
         self.emit_operation(ResOperation(rop.CALL, args, op.result,
                                          op.getdescr()))
-        self.remember_emitting_pure(op)
+        self.call_pure_positions.append(len(self.optimizer._newoperations) - 1)
 
     def optimize_GUARD_NO_EXCEPTION(self, op):
         if self.last_emitted_operation is REMOVED:
@@ -114,13 +109,17 @@
     def get_pure_result(self, key):
         return self.pure_operations.get(key, None)
 
-    def remember_emitting_pure(self, op):
-        if self.optimizer.exporting_state:
-            op = self.optimizer.get_op_replacement(op)
-            self.emitted_pure_operations[op] = True
-
     def produce_potential_short_preamble_ops(self, sb):
-        for op in self.emitted_pure_operations:
+        ops = sb.optimizer._newoperations
+        for i, op in enumerate(ops):
+            if op.is_always_pure():
+                sb.add_potential(op)
+            if op.is_ovf() and ops[i + 1].getopnum() == rop.GUARD_NO_OVERFLOW:
+                sb.add_potential(op)
+        for i in self.call_pure_positions:
+            op = ops[i]
+            assert op.getopnum() == rop.CALL
+            op = op.copy_and_change(rop.CALL_PURE)
             sb.add_potential(op)
 
 dispatch_opt = make_dispatcher_method(OptPure, 'optimize_',
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
@@ -5527,6 +5527,5 @@
         """
         self.optimize_loop(ops, ops)
 
-
 class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
     pass


More information about the pypy-commit mailing list