[pypy-svn] pypy guard-improvements: Transplant changes from out-of-line guards that are relevant to

fijal commits-noreply at bitbucket.org
Tue Jan 11 14:52:55 CET 2011


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: guard-improvements
Changeset: r40582:9c5843aa1475
Date: 2011-01-11 15:49 +0200
http://bitbucket.org/pypy/pypy/changeset/9c5843aa1475/

Log:	Transplant changes from out-of-line guards that are relevant to
	optimizeopt. Notably: ccf0847294c0 2a4d96bbfa36 f5a2268e3ceb

diff --git a/pypy/jit/metainterp/test/test_optimizeopt.py b/pypy/jit/metainterp/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/test/test_optimizeopt.py
@@ -553,7 +553,6 @@
         self.optimize_loop(ops, expected, preamble)
 
     def test_int_is_true_is_zero(self):
-        py.test.skip("XXX implement me")
         ops = """
         [i0]
         i1 = int_is_true(i0)
@@ -570,6 +569,23 @@
         """
         self.optimize_loop(ops, 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]
@@ -5258,7 +5274,6 @@
         # can be raised by ll_str2unicode()
 
 
-
 ##class TestOOtype(OptimizeOptTest, OOtypeMixin):
 
 ##    def test_instanceof(self):

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
@@ -226,9 +226,26 @@
         self.optimize_guard(op, constbox, emit_operation, dryrun)
 
     def optimize_GUARD_TRUE(self, op, dryrun=False):
+        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(CONST_0)
         self.optimize_guard(op, CONST_1, dryrun=dryrun)
 
     def optimize_GUARD_FALSE(self, op, dryrun=False):
+        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, dryrun=dryrun)
 
     def optimize_GUARD_CLASS(self, op, dryrun=False):
@@ -304,13 +321,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))

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
@@ -238,6 +238,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 = {}


More information about the Pypy-commit mailing list