[pypy-commit] pypy recent-pure-ops: a bit random progress

fijal noreply at buildbot.pypy.org
Mon Mar 2 18:09:39 CET 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: recent-pure-ops
Changeset: r76220:0b3667fb138c
Date: 2015-02-28 16:08 +0200
http://bitbucket.org/pypy/pypy/changeset/0b3667fb138c/

Log:	a bit random progress

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
@@ -452,6 +452,9 @@
     def getvalue(self, box):
         return self.optimizer.getvalue(box)
 
+    def get_box_replacement(self, box):
+        return self.optimizer.get_box_replacement(box)
+
     def make_constant(self, box, constbox):
         return self.optimizer.make_constant(box, constbox)
 
@@ -845,16 +848,6 @@
                 descr.make_a_counter_per_value(op)
         return op
 
-    def make_args_key(self, op):
-        n = op.numargs()
-        args = [None] * (n + 2)
-        for i in range(n):
-            arg = self.get_box_replacement(op.getarg(i))
-            args[i] = arg
-        args[n] = ConstInt(op.getopnum())
-        args[n + 1] = op.getdescr()
-        return args
-
     def optimize_default(self, op):
         self.emit_operation(op)
 
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
@@ -15,31 +15,34 @@
         self.next_index = (next_index + 1) % self.REMEMBER_LIMIT
         self.lst[next_index] = op
 
-    def lookup1(self, box0):
+    def lookup1(self, box0, descr):
         for i in range(self.REMEMBER_LIMIT):
             op = self.lst[i]
             if op is None:
                 break
-            if op.getarg(0).same_box(box0):
+            if op.getarg(0).same_box(box0) and op.getdescr() is descr:
                 return op
         return None
 
-    def lookup2(self, box0, box1):
+    def lookup2(self, box0, box1, descr):
         for i in range(self.REMEMBER_LIMIT):
             op = self.lst[i]
             if op is None:
                 break
-            if op.getarg(0).same_box(box0) and op.getarg(1).same_box(box1):
+            if (op.getarg(0).same_box(box0) and op.getarg(1).same_box(box1)
+                and op.getdescr() is descr):
                 return op
         return None
 
     def lookup(self, optimizer, op):
         numargs = op.numargs()
         if numargs == 1:
-            return self.lookup1(optimizer.get_box_replacement(op.getarg(0)))
+            return self.lookup1(optimizer.get_box_replacement(op.getarg(0)),
+                                op.getdescr())
         elif numargs == 2:
             return self.lookup2(optimizer.get_box_replacement(op.getarg(0)),
-                                optimizer.get_box_replacement(op.getarg(1)))
+                                optimizer.get_box_replacement(op.getarg(1)),
+                                op.getdescr())
         else:
             assert False
 
@@ -67,7 +70,6 @@
         else:
             nextop = None
 
-        args = None
         if canfold:
             for i in range(op.numargs()):
                 if self.get_constant_box(op.getarg(i)) is None:
@@ -150,17 +152,18 @@
 
     def pure(self, opnum, args, result):
         op = ResOperation(opnum, args, result)
-        key = self.optimizer.make_args_key(op)
-        if key not in self.pure_operations:
-            self.pure_operations[key] = self.getvalue(result)
+        recentops = self.getrecentops(opnum)
+        recentops.add(op)
 
     def has_pure_result(self, opnum, args, descr):
+        return False
         op = ResOperation(opnum, args, None, descr)
         key = self.optimizer.make_args_key(op)
         return self.pure_operations.get(key, None) is not None
 
-    def get_pure_result(self, key):
-        return self.pure_operations.get(key, None)
+    def get_pure_result(self, op):
+        recentops = self.getrecentops(op.getopnum())
+        return recentops.lookup(self.optimizer, op)
 
     def produce_potential_short_preamble_ops(self, sb):
         ops = sb.optimizer._newoperations
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
@@ -26,15 +26,15 @@
 
     def propagate_forward(self, op):
         if op.boolinverse != -1 or op.boolreflex != -1:
-            args = self.optimizer.make_args_key(op)
-            if self.find_rewritable_bool(op, args):
+            if self.find_rewritable_bool(op):
                 return
 
         dispatch_opt(self, op)
 
     def try_boolinvers(self, op, targs):
-        value = self.get_pure_result(targs)
-        if value is not None:
+        op = self.get_pure_result(targs)
+        if op is not None:
+            value = self.getvalue(op.result)
             if value.is_constant():
                 if value.box.same_constant(CONST_1):
                     self.make_constant(op.result, CONST_0)
@@ -46,30 +46,30 @@
         return False
 
 
-    def find_rewritable_bool(self, op, args):
+    def find_rewritable_bool(self, op):
         oldopnum = op.boolinverse
+        arg0 = op.getarg(0)
+        arg1 = op.getarg(1)
         if oldopnum != -1:
-            targs = self.optimizer.make_args_key(ResOperation(oldopnum, [args[0], args[1]],
-                                                              None))
-            if self.try_boolinvers(op, targs):
+            top = ResOperation(oldopnum, [arg0, arg1], None)
+            if self.try_boolinvers(op, top):
                 return True
 
         oldopnum = op.boolreflex # FIXME: add INT_ADD, INT_MUL
         if oldopnum != -1:
-            targs = self.optimizer.make_args_key(ResOperation(oldopnum, [args[1], args[0]],
-                                                              None))
-            value = self.get_pure_result(targs)
-            if value is not None:
-                self.optimizer.make_equal_to(op.result, value, True)
+            top = ResOperation(oldopnum, [arg0, arg1], None)
+            oldop = self.get_pure_result(top)
+            if oldop is not None:
+                self.optimizer.make_equal_to(op.result, self.getvalue(oldop),
+                                             True)
                 return True
 
         if op.boolreflex == -1:
             return False
         oldopnum = opclasses[op.boolreflex].boolinverse
         if oldopnum != -1:
-            targs = self.optimizer.make_args_key(
-                ResOperation(oldopnum, [args[1], args[0]], None))
-            if self.try_boolinvers(op, targs):
+            top = ResOperation(oldopnum, [arg1, arg0], None)
+            if self.try_boolinvers(op, top):
                 return True
 
         return False


More information about the pypy-commit mailing list