Author: Carl Friedrich Bolz-Tereick <[email protected]>
Branch:
Changeset: r92274:c6568dda3266
Date: 2017-08-28 11:50 +0200
http://bitbucket.org/pypy/pypy/changeset/c6568dda3266/
Log: optimize this sequence:
i2 = int_is_zero(i0) guard_false(i2) i1 = int_is_true(i0)
guard_true(i1)
(happens quite often in rpython list code, it seems)
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py
b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -10,7 +10,7 @@
from rpython.jit.metainterp.optimizeopt.info import INFO_NONNULL, INFO_NULL
from rpython.jit.metainterp.optimizeopt.util import _findall,
make_dispatcher_method
from rpython.jit.metainterp.resoperation import rop, ResOperation, opclasses,\
- OpHelpers
+ OpHelpers, AbstractResOp
from rpython.rlib.rarithmetic import highest_bit
from rpython.rtyper.lltypesystem import llmemory
from rpython.rtyper import rclass
@@ -490,6 +490,11 @@
def postprocess_GUARD_TRUE(self, op):
box = self.get_box_replacement(op.getarg(0))
+ if (isinstance(box, AbstractResOp) and
+ box.getopnum() == rop.INT_IS_TRUE):
+ # we can't use the (current) range analysis for this because
+ # "anything but 0" is not a valid range
+ self.pure_from_args(rop.INT_IS_ZERO, [box.getarg(0)], CONST_0)
self.make_constant(box, CONST_1)
def optimize_GUARD_FALSE(self, op):
@@ -497,6 +502,11 @@
def postprocess_GUARD_FALSE(self, op):
box = self.get_box_replacement(op.getarg(0))
+ if (isinstance(box, AbstractResOp) and
+ box.getopnum() == rop.INT_IS_ZERO):
+ # we can't use the (current) range analysis for this because
+ # "anything but 0" is not a valid range
+ self.pure_from_args(rop.INT_IS_TRUE, [box.getarg(0)], CONST_1)
self.make_constant(box, CONST_0)
def optimize_ASSERT_NOT_NONE(self, op):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -288,7 +288,6 @@
self.optimize_loop(ops, expected)
def test_int_is_true_is_zero(self):
- py.test.skip("XXX implement me")
ops = """
[i0]
i1 = int_is_true(i0)
@@ -305,6 +304,22 @@
"""
self.optimize_loop(ops, expected)
+ ops = """
+ [i0]
+ i2 = int_is_zero(i0)
+ guard_false(i2) []
+ i1 = int_is_true(i0)
+ guard_true(i1) []
+ jump(i0)
+ """
+ expected = """
+ [i0]
+ i2 = int_is_zero(i0)
+ guard_false(i2) []
+ jump(i0)
+ """
+ self.optimize_loop(ops, expected)
+
def test_int_is_zero_int_is_true(self):
ops = """
[i0]
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit