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

Reply via email to