[pypy-commit] pypy bounds-int-add-or: merge OR and XOR optimization into one
squeaky
noreply at buildbot.pypy.org
Mon Feb 17 23:59:07 CET 2014
Author: Squeaky <squeaky_pl at gmx.com>
Branch: bounds-int-add-or
Changeset: r69197:d091b8c6f8e8
Date: 2014-02-17 20:26 +0100
http://bitbucket.org/pypy/pypy/changeset/d091b8c6f8e8/
Log: merge OR and XOR optimization into one
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
@@ -68,25 +68,14 @@
optimize_GUARD_FALSE = optimize_GUARD_TRUE
optimize_GUARD_VALUE = optimize_GUARD_TRUE
- def optimize_INT_OR(self, op):
- v1 = self.getvalue(op.getarg(0))
- v2 = self.getvalue(op.getarg(1))
- self.emit_operation(op)
- r = self.getvalue(op.result)
-
- if v1.intbound.known_ge(IntBound(0, 0)) and \
- v2.intbound.known_ge(IntBound(0, 0)):
- mostsignificant = v1.intbound.upper | v2.intbound.upper
- # check if next_power2 won't overflow
- if mostsignificant < (1 << ((symbolic.WORD - 1) << 3)):
- r.intbound.intersect(
- IntBound(0, next_power2(mostsignificant) - 1))
-
- def optimize_INT_XOR(self, op):
+ def optimize_INT_OR_or_XOR(self, op):
v1 = self.getvalue(op.getarg(0))
v2 = self.getvalue(op.getarg(1))
if v1 is v2:
- self.make_constant_int(op.result, 0)
+ if op.getopnum() == rop.INT_OR:
+ self.make_equal_to(op.result, v1)
+ else:
+ self.make_constant_int(op.result, 0)
return
self.emit_operation(op)
if v1.intbound.known_ge(IntBound(0, 0)) and \
@@ -99,6 +88,8 @@
if mostsignificant < (1 << ((symbolic.WORD - 1) << 3)):
r.intbound.make_lt(IntUpperBound(next_power2(mostsignificant)))
+ optimize_INT_OR = optimize_INT_OR_or_XOR
+ optimize_INT_XOR = optimize_INT_OR_or_XOR
def optimize_INT_AND(self, op):
v1 = self.getvalue(op.getarg(0))
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
@@ -5422,6 +5422,18 @@
"""
self.optimize_loop(ops, ops)
+ def test_or_same_arg(self):
+ ops = """
+ [i0]
+ i1 = int_or(i0, i0)
+ jump(i1)
+ """
+ expected = """
+ [i0]
+ jump(i0)
+ """
+ self.optimize_loop(ops, expected)
+
class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
pass
More information about the pypy-commit
mailing list