Author: Carl Friedrich Bolz <[email protected]>
Branch: int-tag-untag-as-operations
Changeset: r48365:52e92200bf93
Date: 2011-10-22 14:23 +0200
http://bitbucket.org/pypy/pypy/changeset/52e92200bf93/
Log: each the optimizer that int_tag and int_untag are each others
opposites
diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py
b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -287,6 +287,13 @@
def optimize_INT_TAG(self, op):
self.emit_operation(op) # XXX for now
self.emit_operation(self.nextop)
+ if self.nextop.getopnum() == rop.GUARD_NO_OVERFLOW:
+ self.pure(rop.INT_UNTAG, [op.result], op.getarg(0))
+
+ def optimize_INT_UNTAG(self, op):
+ self.emit_operation(op)
+ self.pure(rop.INT_TAG, [op.result], op.getarg(0))
+
def optimize_ARRAYLEN_GC(self, op):
self.emit_operation(op)
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -5074,6 +5074,40 @@
"""
self.optimize_loop(ops, ops, ops)
+ def test_int_tag_untag_reverses(self):
+ ops = """
+ [i0]
+ i1 = int_tag(i0)
+ guard_no_overflow() []
+ i2 = int_untag(i1)
+ i3 = int_add(i2, 1)
+ jump(i3)
+ """
+ expected = """
+ [i0]
+ i1 = int_tag(i0)
+ guard_no_overflow() []
+ i2 = int_add(i0, 1)
+ jump(i2)
+ """
+ self.optimize_loop(ops, expected)
+ ops = """
+ [i0]
+ i1 = int_untag(i0)
+ i2 = int_tag(i1)
+ guard_no_overflow() []
+ i3 = int_untag(i2)
+ i4 = int_add(i3, 1)
+ jump(i4)
+ """
+ expected = """
+ [i0]
+ i1 = int_untag(i0)
+ i2 = int_add(i1, 1)
+ jump(i2)
+ """
+ self.optimize_loop(ops, expected)
+
def test_mul_ovf(self):
ops = """
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit