Author: Armin Rigo <[email protected]>
Branch:
Changeset: r76110:36e8e37db37a
Date: 2015-02-24 17:39 +0100
http://bitbucket.org/pypy/pypy/changeset/36e8e37db37a/
Log: Unify INT_IS_TRUE and INT_IS_ZERO here
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py
b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -495,19 +495,15 @@
if v2.getintbound().intersect(v1.getintbound()):
self.propagate_bounds_backward(op.getarg(1))
- def propagate_bounds_INT_IS_TRUE(self, op):
+ def _propagate_int_is_true_or_zero(self, op, constnonzero, constzero):
r = self.getvalue(op.result)
if r.is_constant():
- if r.box.same_constant(CONST_1):
+ if r.box.same_constant(constnonzero):
v1 = self.getvalue(op.getarg(0))
if v1.getintbound().known_ge(IntBound(0, 0)):
v1.getintbound().make_gt(IntBound(0, 0))
self.propagate_bounds_backward(op.getarg(0))
-
- def propagate_bounds_INT_IS_ZERO(self, op):
- r = self.getvalue(op.result)
- if r.is_constant():
- if r.box.same_constant(CONST_1):
+ elif r.box.same_constant(constzero):
v1 = self.getvalue(op.getarg(0))
# Clever hack, we can't use self.make_constant_int yet because
# the args aren't in the values dictionary yet so it runs into
@@ -516,6 +512,12 @@
v1.getintbound().make_lt(IntBound(1, 1))
self.propagate_bounds_backward(op.getarg(0))
+ def propagate_bounds_INT_IS_TRUE(self, op):
+ self._propagate_int_is_true_or_zero(op, CONST_1, CONST_0)
+
+ def propagate_bounds_INT_IS_ZERO(self, op):
+ self._propagate_int_is_true_or_zero(op, CONST_0, CONST_1)
+
def propagate_bounds_INT_ADD(self, op):
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
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
@@ -512,7 +512,7 @@
[i]
i1 = int_is_true(i)
guard_false(i1) [i]
- jump(i)
+ jump(0)
"""
self.optimize_loop(ops, expected)
@@ -4774,6 +4774,25 @@
"""
self.optimize_strunicode_loop(ops, expected)
+ def test_int_is_zero_bounds(self):
+ ops = """
+ [p0]
+ i0 = strlen(p0)
+ i1 = int_is_zero(i0)
+ guard_false(i1) []
+ i2 = int_ge(0, i0)
+ guard_false(i2) []
+ jump(p0)
+ """
+ expected = """
+ [p0]
+ i0 = strlen(p0)
+ i1 = int_is_zero(i0)
+ guard_false(i1) []
+ jump(p0)
+ """
+ self.optimize_strunicode_loop(ops, expected)
+
def test_strslice_subtraction_folds(self):
ops = """
[p0, i0]
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -669,11 +669,11 @@
[i]
i1 = int_is_true(i)
guard_false(i1) [i]
- jump(i)
- """
- expected = """
- [i]
- jump(i)
+ jump()
+ """
+ expected = """
+ []
+ jump()
"""
self.optimize_loop(ops, expected, preamble)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit