[pypy-commit] pypy default: Store values in pure_operations instead of ops (I wonder what it changes,

fijal noreply at buildbot.pypy.org
Sun Dec 21 11:34:16 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: 
Changeset: r75043:0d5b714ce13a
Date: 2014-12-19 15:48 +0200
http://bitbucket.org/pypy/pypy/changeset/0d5b714ce13a/

Log:	Store values in pure_operations instead of ops (I wonder what it
	changes, actually)

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
@@ -299,8 +299,8 @@
     def make_constant_int(self, box, intconst):
         return self.optimizer.make_constant_int(box, intconst)
 
-    def make_equal_to(self, box, value):
-        return self.optimizer.make_equal_to(box, value)
+    def make_equal_to(self, box, value, replace=False):
+        return self.optimizer.make_equal_to(box, value, replace=replace)
 
     def get_constant_box(self, box):
         return self.optimizer.get_constant_box(box)
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
@@ -25,6 +25,7 @@
         else:
             nextop = None
 
+        args = None
         if canfold:
             for i in range(op.numargs()):
                 if self.get_constant_box(op.getarg(i)) is None:
@@ -39,15 +40,11 @@
 
             # did we do the exact same operation already?
             args = self.optimizer.make_args_key(op)
-            oldop = self.pure_operations.get(args, None)
-            if oldop is not None and oldop.getdescr() is op.getdescr():
-                assert oldop.getopnum() == op.getopnum()
-                self.optimizer.make_equal_to(op.result,
-                                             self.getvalue(oldop.result),
-                                             True)
+            oldvalue = self.pure_operations.get(args, None)
+            if oldvalue is not None:
+                self.optimizer.make_equal_to(op.result, oldvalue, True)
                 return
             else:
-                self.pure_operations[args] = op
                 self.remember_emitting_pure(op)
 
         # otherwise, the operation remains
@@ -56,6 +53,8 @@
             self.optimizer.bool_boxes[self.getvalue(op.result)] = None
         if nextop:
             self.emit_operation(nextop)
+        if args is not None:
+            self.pure_operations[args] = self.getvalue(op.result)
 
     def optimize_CALL_PURE(self, op):
         # Step 1: check if all arguments are constant
@@ -69,16 +68,15 @@
         # Step 2: check if all arguments are the same as a previous
         # CALL_PURE.
         args = self.optimizer.make_args_key(op)
-        oldop = self.pure_operations.get(args, None)
-        if oldop is not None and oldop.getdescr() is op.getdescr():
-            assert oldop.getopnum() == op.getopnum()
+        oldvalue = self.pure_operations.get(args, None)
+        if oldvalue is not None:
             # this removes a CALL_PURE that has the same (non-constant)
             # arguments as a previous CALL_PURE.
-            self.make_equal_to(op.result, self.getvalue(oldop.result))
+            self.make_equal_to(op.result, oldvalue)
             self.last_emitted_operation = REMOVED
             return
         else:
-            self.pure_operations[args] = op
+            self.pure_operations[args] = self.getvalue(op.result)
             self.remember_emitting_pure(op)
 
         # replace CALL_PURE with just CALL
@@ -103,15 +101,12 @@
         op = ResOperation(opnum, args, result)
         key = self.optimizer.make_args_key(op)
         if key not in self.pure_operations:
-            self.pure_operations[key] = op
+            self.pure_operations[key] = self.getvalue(op.result)
 
     def has_pure_result(self, opnum, args, descr):
         op = ResOperation(opnum, args, None, descr)
         key = self.optimizer.make_args_key(op)
-        op = self.pure_operations.get(key, None)
-        if op is None:
-            return False
-        return op.getdescr() is descr
+        return self.pure_operations.get(key, None) is not None
 
     def get_pure_result(self, key):
         return self.pure_operations.get(key, None)
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -33,9 +33,8 @@
         dispatch_opt(self, op)
 
     def try_boolinvers(self, op, targs):
-        oldop = self.get_pure_result(targs)
-        if oldop is not None and oldop.getdescr() is op.getdescr():
-            value = self.getvalue(oldop.result)
+        value = self.get_pure_result(targs)
+        if value is not None:
             if value.is_constant():
                 if value.box.same_constant(CONST_1):
                     self.make_constant(op.result, CONST_0)
@@ -59,9 +58,9 @@
         if oldopnum != -1:
             targs = self.optimizer.make_args_key(ResOperation(oldopnum, [args[1], args[0]],
                                                               None))
-            oldop = self.get_pure_result(targs)
-            if oldop is not None and oldop.getdescr() is op.getdescr():
-                self.make_equal_to(op.result, self.getvalue(oldop.result))
+            value = self.get_pure_result(targs)
+            if value is not None:
+                self.optimizer.make_equal_to(op.result, value, True)
                 return True
 
         if op.boolreflex == -1:


More information about the pypy-commit mailing list