[pypy-commit] pypy result-in-resops: go for full replacement, so we can chain them

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


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57587:44551643eed7
Date: 2012-09-25 17:31 +0200
http://bitbucket.org/pypy/pypy/changeset/44551643eed7/

Log:	go for full replacement, so we can chain them

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
@@ -213,8 +213,7 @@
         v2 = self.getvalue(op.getarg(1))
         resbound = v1.intbound.sub_bound(v2.intbound)
         if resbound.bounded():
-            xxx
-            op = op.copy_and_change(rop.INT_SUB)
+            op = self.optimizer.copy_and_change(op, rop.INT_SUB)
         self.emit_operation(op) # emit the op
         r = self.getvalue(op)
         r.intbound.intersect(resbound)
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
@@ -426,6 +426,11 @@
         self.resumedata_memo.forget_numberings(virtualbox)
 
     def getvalue(self, box):
+        try:
+            while True:
+                box = box.get_extra("optimize_replace")
+        except KeyError:
+            pass
         if box.is_constant():
             if box.type == REF:
                 if not box.getref_base():
@@ -447,7 +452,7 @@
 
     def setvalue(self, box, value):
         assert not box.is_constant()
-        assert  not box.has_extra("optimize_value")
+        assert not box.has_extra("optimize_value")
         box.set_extra("optimize_value", value)
 
     def copy_op_if_modified_by_optimization(self, op):
@@ -471,7 +476,7 @@
         if isinstance(box, Const):
             return box
         try:
-            value = box.get_extra("optimize_value")
+            value = self.getvalue(box)
             self.ensure_imported(value)
         except KeyError:
             return None
@@ -491,9 +496,9 @@
     def replace(self, what, with_):
         assert isinstance(what, AbstractValue)
         assert isinstance(with_, AbstractValue)
-        val = self.getvalue(with_)
-        # completely remove the old optimize value
-        what.set_extra("optimize_value", val)
+        assert not what.has_extra("optimize_replace")
+        assert not what.is_constant()
+        what.set_extra("optimize_replace", with_)
 
     def make_constant(self, box, constbox):
         self.getvalue(box).make_constant(constbox)
@@ -543,8 +548,10 @@
             self.first_optimization.propagate_forward(op)
         for arg in self.loop.inputargs:
             arg.del_extra("optimize_value")
+            arg.del_extra("optimize_replace")
         for op in self.loop.operations:
             op.del_extra("optimize_value")
+            op.del_extra("optimize_replace")
         self.loop.operations = self.get_newoperations()
         self.loop.quasi_immutable_deps = self.quasi_immutable_deps
         # accumulate counters
@@ -561,17 +568,17 @@
             self.getvalue(op).is_bool_box = True
         self._emit_operation(op)
 
-    def get_value_replacement(self, v):
+    def get_value_replacement(self, box):
         try:
-            value = v.get_extra("optimize_value")
+            value = self.getvalue(box)
         except KeyError:
             return None
         else:
             self.ensure_imported(value)
-            value = value.force_box(self)
-            if value is v:
+            forced_box = value.force_box(self)
+            if forced_box is box:
                 return None
-            return value
+            return forced_box
 
     @specialize.argtype(0)
     def _emit_operation(self, op):
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
@@ -80,17 +80,16 @@
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
         if v1.is_null():
-            self.make_equal_to(op, v2)
+            self.replace(op, op.getarg(1))
         elif v2.is_null():
-            self.make_equal_to(op, v1)
+            self.replace(op, op.getarg(0))
         else:
             self.emit_operation(op)
 
     def optimize_INT_SUB(self, op):
-        v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
         if v2.is_constant() and v2.op.getint() == 0:
-            self.make_equal_to(op, v1)
+            self.replace(op, op.getarg(0))
         else:
             self.emit_operation(op)
             # Synthesize the reverse ops for optimize_default to reuse
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
@@ -2294,13 +2294,13 @@
         ops = """
         [f0]
         f1 = float_mul(f0, 1.0)
-        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)
 
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
@@ -658,6 +658,8 @@
         'llgraph_var2index': 'llgraph internal attribute',
         'optimize_value': 'value replacement for the optimizer. only valid for'
                           ' the length of optimization pass',
+        'optimize_replace': 'replacement for the op by another op, can be '
+                            'chained',
     }
 
     extras = None


More information about the pypy-commit mailing list