[pypy-svn] r74161 - in pypy/branch/blackhole-improvement/pypy/jit/codewriter: . test

arigo at codespeak.net arigo at codespeak.net
Wed Apr 28 13:57:41 CEST 2010


Author: arigo
Date: Wed Apr 28 13:57:39 2010
New Revision: 74161

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py
Log:
Uniformize the reductions:
    int_eq(x,0) => int_is_zero(x)
    int_ne(x,0) => int_is_true(x)
    ptr_eq(x,0) => ptr_iszero(x)
    ptr_ne(x,0) => ptr_nonzero(x)


Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jitter.py	Wed Apr 28 13:57:39 2010
@@ -105,28 +105,7 @@
                     return False    # not a supported operation
                 # ok! optimize this case
                 block.operations.remove(op)
-                opname = op.opname
-                args = op.args
-                if op.opname in ('int_ne', 'int_eq'):
-                    if isinstance(args[0], Constant):
-                        args = args[::-1]
-                    if isinstance(args[1], Constant) and args[1].value == 0:
-                        if opname == 'int_eq':
-                            # must invert the two exit links
-                            link = block.exits[0]
-                            link.llexitcase = link.exitcase = not link.exitcase
-                            link = block.exits[1]
-                            link.llexitcase = link.exitcase = not link.exitcase
-                        opname = 'int_is_true'
-                        args = [args[0]]
-                elif op.opname in ('ptr_eq', 'ptr_ne'):
-                    if isinstance(args[0], Constant):
-                        args = args[::-1]
-                    if isinstance(args[1], Constant) and not args[1].value:
-                        opname = {'ptr_eq': 'ptr_iszero',
-                                  'ptr_ne': 'ptr_nonzero'}[op.opname]
-                        args = [args[0]]
-                block.exitswitch = (opname,) + tuple(args)
+                block.exitswitch = (op.opname,) + tuple(op.args)
                 return True
         return False
 
@@ -361,7 +340,7 @@
             sizedescr = self.cpu.sizeof(STRUCT)
             return SpaceOperation('new', [sizedescr], op.result)
 
-    def _rewrite_op_ptr_eq(self, op, opname):
+    def _rewrite_equality(self, op, opname):
         arg0, arg1 = op.args
         if isinstance(arg0, Constant) and not arg0.value:
             return SpaceOperation(opname, [arg1], op.result)
@@ -370,11 +349,17 @@
         else:
             return op
 
+    def rewrite_op_int_eq(self, op):
+        return self._rewrite_equality(op, 'int_is_zero')
+
+    def rewrite_op_int_ne(self, op):
+        return self._rewrite_equality(op, 'int_is_true')
+
     def rewrite_op_ptr_eq(self, op):
-        return self._rewrite_op_ptr_eq(op, 'ptr_iszero')
+        return self._rewrite_equality(op, 'ptr_iszero')
 
     def rewrite_op_ptr_ne(self, op):
-        return self._rewrite_op_ptr_eq(op, 'ptr_nonzero')
+        return self._rewrite_equality(op, 'ptr_nonzero')
 
 # ____________________________________________________________
 

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jitter.py	Wed Apr 28 13:57:39 2010
@@ -69,32 +69,6 @@
     block.exits = [FakeLink(False), FakeLink(True)]
     assert not Transformer().optimize_goto_if_not(block)
 
-def test_optimize_goto_if_not__int_ne():
-    c0 = Constant(0, lltype.Signed)
-    v1 = Variable()
-    v3 = Variable(); v3.concretetype = lltype.Bool
-    for linkcase1 in [False, True]:
-        linkcase2 = not linkcase1
-        for op, args in [('int_ne', [v1, c0]),
-                         ('int_ne', [c0, v1]),
-                         ('int_eq', [v1, c0]),
-                         ('int_eq', [c0, v1])]:
-            block = Block([v1])
-            block.operations = [SpaceOperation(op, args, v3)]
-            block.exitswitch = v3
-            block.exits = exits = [FakeLink(linkcase1), FakeLink(linkcase2)]
-            res = Transformer().optimize_goto_if_not(block)
-            assert res == True
-            assert block.operations == []
-            assert block.exitswitch == ('int_is_true', v1)
-            assert block.exits == exits
-            if op == 'int_ne':
-                assert exits[0].exitcase == exits[0].llexitcase == linkcase1
-                assert exits[1].exitcase == exits[1].llexitcase == linkcase2
-            else:
-                assert exits[0].exitcase == exits[0].llexitcase == linkcase2
-                assert exits[1].exitcase == exits[1].llexitcase == linkcase1
-
 def test_optimize_goto_if_not__ptr_eq():
     for opname in ['ptr_eq', 'ptr_ne']:
         v1 = Variable()
@@ -124,25 +98,6 @@
         assert block.exitswitch == (opname, v1)
         assert block.exits == exits
 
-def test_optimize_goto_if_not__ptr_eq_reduced():
-    c0 = Constant(lltype.nullptr(rclass.OBJECT), rclass.OBJECTPTR)
-    for opname, reducedname in [('ptr_eq', 'ptr_iszero'),
-                                ('ptr_ne', 'ptr_nonzero')]:
-        for nullindex in [0, 1]:
-            v1 = Variable()
-            v3 = Variable(); v3.concretetype = lltype.Bool
-            block = Block([v1])
-            args = [v1, v1]
-            args[nullindex] = c0
-            block.operations = [SpaceOperation(opname, args, v3)]
-            block.exitswitch = v3
-            block.exits = exits = [FakeLink(False), FakeLink(True)]
-            res = Transformer().optimize_goto_if_not(block)
-            assert res == True
-            assert block.operations == []
-            assert block.exitswitch == (reducedname, v1)
-            assert block.exits == exits
-
 def test_residual_call():
     for RESTYPE in [lltype.Signed, rclass.OBJECTPTR,
                     lltype.Float, lltype.Void]:
@@ -307,6 +262,29 @@
     assert block.exits[0].target is block2
     assert block.exits[0].args == [v1]
 
+def test_int_eq():
+    v1 = varoftype(lltype.Signed)
+    v2 = varoftype(lltype.Signed)
+    v3 = varoftype(lltype.Bool)
+    c0 = Constant(0, lltype.Signed)
+    #
+    for opname, reducedname in [('int_eq', 'int_is_zero'),
+                                ('int_ne', 'int_is_true')]:
+        op = SpaceOperation(opname, [v1, v2], v3)
+        op1 = Transformer().rewrite_operation(op)
+        assert op1.opname == opname
+        assert op1.args == [v1, v2]
+        #
+        op = SpaceOperation(opname, [v1, c0], v3)
+        op1 = Transformer().rewrite_operation(op)
+        assert op1.opname == reducedname
+        assert op1.args == [v1]
+        #
+        op = SpaceOperation(opname, [c0, v2], v3)
+        op1 = Transformer().rewrite_operation(op)
+        assert op1.opname == reducedname
+        assert op1.args == [v2]
+
 def test_ptr_eq():
     v1 = varoftype(rclass.OBJECTPTR)
     v2 = varoftype(rclass.OBJECTPTR)
@@ -329,3 +307,26 @@
         op1 = Transformer().rewrite_operation(op)
         assert op1.opname == reducedname
         assert op1.args == [v2]
+
+def test_nongc_ptr_eq():
+    v1 = varoftype(rclass.NONGCOBJECTPTR)
+    v2 = varoftype(rclass.NONGCOBJECTPTR)
+    v3 = varoftype(lltype.Bool)
+    c0 = Constant(lltype.nullptr(rclass.NONGCOBJECT), rclass.NONGCOBJECTPTR)
+    #
+    for opname, reducedname in [('int_eq', 'int_is_zero'),
+                                ('int_ne', 'int_is_true')]:
+        op = SpaceOperation(opname, [v1, v2], v3)
+        op1 = Transformer().rewrite_operation(op)
+        assert op1.opname == opname
+        assert op1.args == [v1, v2]
+        #
+        op = SpaceOperation(opname, [v1, c0], v3)
+        op1 = Transformer().rewrite_operation(op)
+        assert op1.opname == reducedname
+        assert op1.args == [v1]
+        #
+        op = SpaceOperation(opname, [c0, v2], v3)
+        op1 = Transformer().rewrite_operation(op)
+        assert op1.opname == reducedname
+        assert op1.args == [v2]



More information about the Pypy-commit mailing list