[pypy-commit] pypy result-in-resops: fix the pure ops and some cleanups

fijal noreply at buildbot.pypy.org
Tue Sep 25 23:39:52 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57588:a8e4c82af18c
Date: 2012-09-25 23:39 +0200
http://bitbucket.org/pypy/pypy/changeset/a8e4c82af18c/

Log:	fix the pure ops and some cleanups

diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -141,6 +141,7 @@
         # b.has_lower
         if b.has_lower and b.has_upper:
             # Synthesize the reverse op for optimize_default to reuse
+            xxx
             self.pure(rop.INT_RSHIFT, [op, op.getarg(1)], op.getarg(0))
 
     def optimize_INT_RSHIFT(self, op):
@@ -170,14 +171,16 @@
             # Else, synthesize the non overflowing op for optimize_default to
             # reuse, as well as the reverse op
             elif opnum == rop.INT_ADD_OVF:
-                self.pure(rop.INT_ADD, result.getint(), args[0], args[1])
-                self.pure(rop.INT_SUB, args[0].getint(), result, args[1])
-                self.pure(rop.INT_SUB, args[1].getint(), result, args[0])
+                self.pure(result, rop.INT_ADD, args[0], args[1])
+                self.pure(args[0], rop.INT_SUB, result, args[1])
+                self.pure(args[1], rop.INT_SUB, result, args[0])
             elif opnum == rop.INT_SUB_OVF:
+                xxxx
                 self.pure(rop.INT_SUB, args[:], result)
                 self.pure(rop.INT_ADD, [result, args[1]], args[0])
                 self.pure(rop.INT_SUB, [args[0], result], args[1])
             elif opnum == rop.INT_MUL_OVF:
+                xxxx
                 self.pure(rop.INT_MUL, args[:], result)
         self.emit_operation(op)
 
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -320,9 +320,9 @@
         return self.optimizer.new_const_item(arraydescr)
 
     @specialize.arg(1)
-    def pure(self, opnum, result, arg0, arg1):
+    def pure(self, oldop, opnum, arg0, arg1=None):
         if self.optimizer.optpure:
-            self.optimizer.optpure.pure(opnum, result, arg0, arg1)
+            self.optimizer.optpure.pure(oldop, opnum, arg0, arg1)
 
     def has_pure_result(self, op_key):
         if self.optimizer.optpure:
diff --git a/pypy/jit/metainterp/optimizeopt/pure.py b/pypy/jit/metainterp/optimizeopt/pure.py
--- a/pypy/jit/metainterp/optimizeopt/pure.py
+++ b/pypy/jit/metainterp/optimizeopt/pure.py
@@ -1,12 +1,14 @@
 from pypy.jit.metainterp.optimizeopt.optimizer import Optimization, REMOVED
-from pypy.jit.metainterp.resoperation import rop, create_resop_2, create_resop_1
+from pypy.jit.metainterp.resoperation import rop, create_resop_2,\
+     create_resop_1, example_for_opnum
 from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method,\
-     ArgsSet
+     ArgsDict
+from pypy.rlib.objectmodel import specialize
 
 class OptPure(Optimization):
     def __init__(self):
         self.posponedop = None
-        self.pure_operations = ArgsSet()
+        self.pure_operations = ArgsDict()
         self.emitted_pure_operations = []
 
     def propagate_forward(self, op):
@@ -40,11 +42,10 @@
             # did we do the exact same operation already?
             oldop = self.pure_operations.get(op)
             if oldop is not None:
-                assert oldop.getopnum() == op.getopnum()
                 self.replace(op, oldop)
                 return
             else:
-                self.pure_operations.add(op)
+                self.pure_operations.set(op, op)
                 self.remember_emitting_pure(op)
 
         # otherwise, the operation remains
@@ -65,7 +66,7 @@
                 self.last_emitted_operation = REMOVED
                 return
             else:
-                self.pure_operations.add(op)
+                self.pure_operations.set(op, op)
                 self.remember_emitting_pure(op)
 
             # replace CALL_PURE with just CALL
@@ -93,12 +94,14 @@
     def setup(self):
         self.optimizer.optpure = self
 
-    def pure(self, opnum, result, arg0, arg1=None):
+    @specialize.arg(2)
+    def pure(self, oldop, opnum, arg0, arg1=None):
+        result = example_for_opnum(opnum)
         if arg1 is None:
             op = create_resop_1(opnum, result, arg0)
         else:
             op = create_resop_2(opnum, result, arg0, arg1)
-        self.pure_operations.add(op)
+        self.pure_operations.set(op, oldop)
 
     def has_pure_result(self, op_key):
         op = self.pure_operations.get(op_key)
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -93,8 +93,8 @@
         else:
             self.emit_operation(op)
             # Synthesize the reverse ops for optimize_default to reuse
-            self.pure(rop.INT_ADD, op.getarg(0).getint(), op, op.getarg(1))
-            self.pure(rop.INT_SUB, op.getarg(1).getint(), op.getarg(0), op)
+            self.pure(op.getarg(0), rop.INT_ADD, op, op.getarg(1))
+            self.pure(op.getarg(1), rop.INT_SUB, op.getarg(0), op)
 
     def optimize_INT_ADD(self, op):
         arg1 = op.getarg(0)
@@ -110,8 +110,8 @@
         else:
             self.emit_operation(op)
             # Synthesize the reverse op for optimize_default to reuse
-            self.pure(rop.INT_SUB, op.getarg(0).getint(), op, op.getarg(1))
-            self.pure(rop.INT_SUB, op.getarg(1).getint(), op, op.getarg(0))
+            self.pure(op.getarg(0), rop.INT_SUB, op, op.getarg(1))
+            self.pure(op.getarg(1), rop.INT_SUB, op, op.getarg(0))
 
     def optimize_INT_MUL(self, op):
         v1 = self.getvalue(op.getarg(0))
@@ -172,24 +172,22 @@
         # work in all cases, including NaN and inf
         for lhs, rhs in [(arg1, arg2), (arg2, arg1)]:
             v1 = self.getvalue(lhs)
-            v2 = self.getvalue(rhs)
 
             if v1.is_constant():
                 if v1.op.getfloat() == 1.0:
-                    self.make_equal_to(op, v2)
+                    self.replace(op, rhs)
                     return
                 elif v1.op.getfloat() == -1.0:
-                    self.emit_operation(ResOperation(
-                        rop.FLOAT_NEG, [rhs], op
-                    ))
+                    new_op = create_resop_1(rop.FLOAT_NEG, 0.0, rhs)
+                    self.replace(op, new_op)
+                    self.emit_operation(new_op)
                     return
         self.emit_operation(op)
-        self.pure(rop.FLOAT_MUL, op.getfloat(), arg2, arg1)
+        self.pure(op, rop.FLOAT_MUL, arg2, arg1)
 
     def optimize_FLOAT_NEG(self, op):
-        v1 = op.getarg(0)
         self.emit_operation(op)
-        self.pure(rop.FLOAT_NEG, [op], v1)
+        self.pure(op.getarg(0), rop.FLOAT_NEG, op)
 
     def optimize_guard(self, op, constbox, emit_operation=True):
         value = self.getvalue(op.getarg(0))
@@ -508,10 +506,12 @@
         self.emit_operation(op)
 
     def optimize_CAST_PTR_TO_INT(self, op):
+        xxx
         self.pure(rop.CAST_INT_TO_PTR, [op], op.getarg(0))
         self.emit_operation(op)
 
     def optimize_CAST_INT_TO_PTR(self, op):
+        xxx
         self.pure(rop.CAST_PTR_TO_INT, [op], op.getarg(0))
         self.emit_operation(op)
 
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -2307,13 +2307,13 @@
         ops = """
         [f0]
         f1 = float_mul(1.0, f0)
-        f2 = escape(f1)
-        jump(f2)
+        escape(f1)
+        jump(f1)
         """
         expected = """
         [f0]
-        f2 = escape(f0)
-        jump(f2)
+        escape(f0)
+        jump(f0)
         """
         self.optimize_loop(ops, expected)
 
@@ -2321,28 +2321,28 @@
         ops = """
         [f0]
         f1 = float_mul(f0, -1.0)
-        f2 = escape(f1)
-        jump(f2)
+        escape(f1)
+        jump(f1)
         """
         expected = """
         [f0]
         f1 = float_neg(f0)
-        f2 = escape(f1)
-        jump(f2)
+        escape(f1)
+        jump(f1)
         """
         self.optimize_loop(ops, expected)
 
         ops = """
         [f0]
         f1 = float_mul(-1.0, f0)
-        f2 = escape(f1)
-        jump(f2)
+        escape(f1)
+        jump(f1)
         """
         expected = """
         [f0]
         f1 = float_neg(f0)
-        f2 = escape(f1)
-        jump(f2)
+        escape(f1)
+        jump(f1)
         """
         self.optimize_loop(ops, expected)
 
diff --git a/pypy/jit/metainterp/optimizeopt/util.py b/pypy/jit/metainterp/optimizeopt/util.py
--- a/pypy/jit/metainterp/optimizeopt/util.py
+++ b/pypy/jit/metainterp/optimizeopt/util.py
@@ -128,6 +128,9 @@
             if has_value:
                 a.values = self.values[:]
             return a
+
+        def __repr__(self):
+            return 'ArgsSet(%s)' % ([item for item in self.buckets if item is not None],)
     return ArgsSet
 ArgsSet = new_args_set()
 ArgsDict = new_args_set(True)
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -1673,6 +1673,15 @@
     rop.PTR_NE: rop.PTR_NE,
     }
 
+ at specialize.memo()
+def example_for_opnum(opnum):
+    if opclasses[opnum].type == INT:
+        return 0
+    elif opclasses[opnum].type == FLOAT:
+        return 0.0
+    else:
+        return lltype.nullptr(llmemory.GCREF.TO)
+
 opboolinvers = [-1] * len(opclasses)
 opboolreflex = [-1] * len(opclasses)
 for k, v in _opboolreflex.iteritems():


More information about the pypy-commit mailing list