[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