[pypy-svn] r79764 - in pypy/branch/out-of-line-guards/pypy/jit/metainterp: optimizeopt test

fijal at codespeak.net fijal at codespeak.net
Thu Dec 2 22:17:23 CET 2010


Author: fijal
Date: Thu Dec  2 22:17:20 2010
New Revision: 79764

Modified:
   pypy/branch/out-of-line-guards/pypy/jit/metainterp/optimizeopt/optimizer.py
   pypy/branch/out-of-line-guards/pypy/jit/metainterp/optimizeopt/rewrite.py
   pypy/branch/out-of-line-guards/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
A lot of fighting and a simple optimization (test was written, just not
implemented)


Modified: pypy/branch/out-of-line-guards/pypy/jit/metainterp/optimizeopt/optimizer.py
==============================================================================
--- pypy/branch/out-of-line-guards/pypy/jit/metainterp/optimizeopt/optimizer.py	(original)
+++ pypy/branch/out-of-line-guards/pypy/jit/metainterp/optimizeopt/optimizer.py	Thu Dec  2 22:17:20 2010
@@ -199,6 +199,8 @@
         self.interned_refs = self.cpu.ts.new_ref_dict()
         self.resumedata_memo = resume.ResumeDataLoopMemo(metainterp_sd)
         self.bool_boxes = {}
+        self.int_to_bool_nullity = {} # a mapping from bool boxes to
+        # respective ints, to know their value
         self.loop_invariant_results = {}
         self.pure_operations = args_dict()
         self.producer = {}

Modified: pypy/branch/out-of-line-guards/pypy/jit/metainterp/optimizeopt/rewrite.py
==============================================================================
--- pypy/branch/out-of-line-guards/pypy/jit/metainterp/optimizeopt/rewrite.py	(original)
+++ pypy/branch/out-of-line-guards/pypy/jit/metainterp/optimizeopt/rewrite.py	Thu Dec  2 22:17:20 2010
@@ -196,9 +196,26 @@
         self.optimize_guard(op, constbox, emit_operation)
 
     def optimize_GUARD_TRUE(self, op):
+        value = self.getvalue(op.getarg(0))
+        v = self.optimizer.int_to_bool_nullity.get(value)
+        if v:
+            v, int_is_true = v
+            if int_is_true:
+                if not v.is_nonnull():
+                    v.make_nonnull(len(self.optimizer.newoperations) - 1)
+            else:
+                v.make_constant(ConstInt(0))
         self.optimize_guard(op, CONST_1)
 
     def optimize_GUARD_FALSE(self, op):
+        value = self.getvalue(op.getarg(0))
+        v = self.optimizer.int_to_bool_nullity.get(value)
+        if v:
+            v, int_is_true = v
+            if int_is_true:
+                v.make_constant(ConstInt(0))
+            elif not v.is_nonnull():
+                v.make_nonnull(len(self.optimizer.newoperations) - 1)
         self.optimize_guard(op, CONST_0)
 
     def optimize_GUARD_CLASS(self, op):
@@ -270,13 +287,18 @@
             self.emit_operation(op)
 
     def optimize_INT_IS_TRUE(self, op):
-        if self.getvalue(op.getarg(0)) in self.optimizer.bool_boxes:
-            self.make_equal_to(op.result, self.getvalue(op.getarg(0)))
+        v = self.getvalue(op.getarg(0))
+        if v in self.optimizer.bool_boxes:
+            self.make_equal_to(op.result, v)
             return
         self._optimize_nullness(op, op.getarg(0), True)
+        self.optimizer.int_to_bool_nullity[self.getvalue(op.result)] = (v, True)
 
     def optimize_INT_IS_ZERO(self, op):
+        v = self.getvalue(op.getarg(0))
         self._optimize_nullness(op, op.getarg(0), False)
+        self.optimizer.int_to_bool_nullity[self.getvalue(op.result)] = (v,
+                                                                        False)
 
     def _optimize_oois_ooisnot(self, op, expect_isnot):
         value0 = self.getvalue(op.getarg(0))

Modified: pypy/branch/out-of-line-guards/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/out-of-line-guards/pypy/jit/metainterp/test/test_optimizeopt.py	(original)
+++ pypy/branch/out-of-line-guards/pypy/jit/metainterp/test/test_optimizeopt.py	Thu Dec  2 22:17:20 2010
@@ -537,7 +537,6 @@
         self.optimize_loop(ops, 'Not', expected)
 
     def test_int_is_true_is_zero(self):
-        py.test.skip("XXX implement me")
         ops = """
         [i0]
         i1 = int_is_true(i0)
@@ -554,6 +553,23 @@
         """
         self.optimize_loop(ops, 'Not', expected)
 
+    def test_int_is_true_is_zero2(self):
+        ops = """
+        [i0]
+        i2 = int_is_zero(i0)
+        guard_false(i2) []
+        i1 = int_is_true(i0)
+        guard_true(i1) []
+        jump(i0)
+        """
+        expected = """
+        [i0]
+        i1 = int_is_zero(i0)
+        guard_false(i1) []
+        jump(i0)
+        """
+        self.optimize_loop(ops, 'Not', expected)
+
     def test_ooisnull_oononnull_2(self):
         ops = """
         [p0]
@@ -4543,7 +4559,6 @@
         # not obvious, because of the exception UnicodeDecodeError that
         # can be raised by ll_str2unicode()
 
-
 ##class TestOOtype(OptimizeOptTest, OOtypeMixin):
 
 ##    def test_instanceof(self):



More information about the Pypy-commit mailing list