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

arigo at codespeak.net arigo at codespeak.net
Thu May 20 20:01:23 CEST 2010


Author: arigo
Date: Thu May 20 20:01:21 2010
New Revision: 74605

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_liveness.py
Log:
In-progress.


Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/flatten.py	Thu May 20 20:01:21 2010
@@ -105,6 +105,7 @@
             return
         if block in self.seen_blocks:
             self.emitline("goto", TLabel(block))
+            self.emitline("---")
             return
         # inserting a goto not necessary, falling through
         self.seen_blocks[block] = True
@@ -130,6 +131,7 @@
             self.emitline("raise", self.getcolor(args[1]))
         else:
             raise Exception("?")
+        self.emitline("---")
 
     def make_link(self, link):
         if link.target.exits == ():
@@ -167,12 +169,13 @@
             # An exception block. See test_exc_exitswitch in test_flatten.py
             # for an example of what kind of code this makes.
             lastopname = block.operations[-1].opname
-            if lastopname == '-live-':
-                lastopname = block.operations[-2].opname
+            assert lastopname != '-live-'
             assert block.exits[0].exitcase is None # is this always True?
             #
             if not self._include_all_exc_links:
-                if not lastopname.startswith('G_'):  # cannot actually raise
+                if (len(block.operations) == 1 or
+                    block.operations[-2].opname != '-live-'):
+                    # cannot actually raise
                     self.make_link(block.exits[0])
                     return
             # 
@@ -182,7 +185,7 @@
             for link in block.exits[1:]:
                 if (link.exitcase is Exception or
                     (link.exitcase is OverflowError and
-                     lastopname.startswith('G_int_') and
+                     lastopname.startswith('int_') and
                      lastopname.endswith('_ovf'))):
                     # this link captures all exceptions
                     self.make_exception_link(link)
@@ -197,6 +200,7 @@
                 # no link captures all exceptions, so we have to put a reraise
                 # for the other exceptions
                 self.emitline("reraise")
+                self.emitline("---")
         #
         elif len(block.exits) == 2 and (
                 isinstance(block.exitswitch, tuple) or
@@ -230,7 +234,7 @@
                 if block.exits[-1].exitcase == 'default':
                     self.make_link(block.exits[-1])
                 else:
-                    self.emitline('unreachable')
+                    self.emitline("---")
             #
             switches = [link for link in block.exits
                         if link.exitcase != 'default']

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/jtransform.py	Thu May 20 20:01:21 2010
@@ -198,9 +198,6 @@
     rewrite_op_int_gt  = _rewrite_symmetric
     rewrite_op_int_ge  = _rewrite_symmetric
 
-    rewrite_op_G_int_add_ovf = _rewrite_symmetric
-    rewrite_op_G_int_mul_ovf = _rewrite_symmetric
-
     rewrite_op_float_add = _rewrite_symmetric
     rewrite_op_float_mul = _rewrite_symmetric
     rewrite_op_float_lt  = _rewrite_symmetric
@@ -208,6 +205,17 @@
     rewrite_op_float_gt  = _rewrite_symmetric
     rewrite_op_float_ge  = _rewrite_symmetric
 
+    def rewrite_op_int_add_ovf(self, op):
+        op0 = SpaceOperation('-live-', op.args[:], None)
+        op1 = self._rewrite_symmetric(op)
+        return [op0, op1]
+
+    rewrite_op_int_mul_ovf = rewrite_op_int_add_ovf
+
+    def rewrite_op_int_sub_ovf(self, op):
+        op0 = SpaceOperation('-live-', op.args[:], None)
+        return [op0, op]
+
     # ----------
     # Various kinds of calls
 
@@ -259,11 +267,11 @@
         is calling a function that we don't want to JIT.  The initial args
         of 'residual_call_xxx' are the function to call, and its calldescr."""
         calldescr = self.callcontrol.getcalldescr(op)
+        op1 = self.rewrite_call(op, 'residual_call',
+                                [op.args[0], calldescr] + extraargs)
         if self.callcontrol.calldescr_canraise(calldescr):
-            name = 'G_residual_call'
-        else:
-            name = 'residual_call'
-        return self.rewrite_call(op, name, [op.args[0], calldescr] + extraargs)
+            op1 = [SpaceOperation('-live-', [], None), op1]
+        return op1
 
     def handle_regular_call(self, op):
         """A direct_call turns into the operation 'inline_call_xxx' if it
@@ -272,7 +280,9 @@
         [targetgraph] = self.callcontrol.graphs_from(op)
         jitcode = self.callcontrol.get_jitcode(targetgraph,
                                                called_from=self.graph)
-        return self.rewrite_call(op, 'G_inline_call', [jitcode])
+        op0 = SpaceOperation('-live-', [], None)
+        op1 = self.rewrite_call(op, 'inline_call', [jitcode])
+        return [op0, op1]
 
     def handle_builtin_call(self, op):
         oopspec_name, args = support.decode_builtin_call(op)
@@ -288,9 +298,15 @@
             jitcode = self.callcontrol.get_jitcode(targetgraph,
                                                    called_from=self.graph)
             lst.append(jitcode)
-        op0 = SpaceOperation('G_int_guard_value', [op.args[0]], None)
-        op1 = self.handle_residual_call(op, [IndirectCallTargets(lst)])
-        return [op0, op1]
+        op0 = SpaceOperation('-live-', [op.args[0]], None)
+        op1 = SpaceOperation('int_guard_value', [op.args[0]], None)
+        op2 = self.handle_residual_call(op, [IndirectCallTargets(lst)])
+        result = [op0, op1]
+        if isinstance(op2, list):
+            result += op2
+        else:
+            result.append(op2)
+        return result
 
     def _prepare_builtin_call(self, op, oopspec_name, args,
                               extra=None, extrakey=None):
@@ -329,15 +345,11 @@
         if hints.get('promote') and op.args[0].concretetype is not lltype.Void:
             assert op.args[0].concretetype != lltype.Ptr(rstr.STR)
             kind = getkind(op.args[0].concretetype)
-            # note: the 'G_' prefix tells that the operation might generate
-            # a guard in pyjitpl (see liveness.py).  The following 'keepalive'
-            # is needed to ensure that op.args[0] is restored on guard failure.
-            op1 = SpaceOperation('G_%s_guard_value' % kind,
-                                 [op.args[0]], None)
-            op2 = SpaceOperation('keepalive', [op.args[0]], None)
-            # this special return value forces op.result to be considered
+            op0 = SpaceOperation('-live-', [op.args[0]], None)
+            op1 = SpaceOperation('%s_guard_value' % kind, [op.args[0]], None)
+            # the special return value None forces op.result to be considered
             # equal to op.args[0]
-            return [op1, op2, None]
+            return [op0, op1, None]
         else:
             log.WARNING('ignoring hint %r at %r' % (hints, self.graph))
 
@@ -451,11 +463,9 @@
                 op.args[0].concretetype.TO._hints.get('typeptr'))
 
     def handle_getfield_typeptr(self, op):
-        # note: the 'G_' prefix tells that the operation might generate
-        # a guard in pyjitpl (see liveness.py).  The following 'keepalive'
-        # is needed to ensure that op.args[0] is restored on guard failure.
-        return [SpaceOperation('G_guard_class', [op.args[0]], op.result),
-                SpaceOperation('keepalive', [op.args[0]], None)]
+        op0 = SpaceOperation('-live-', [op.args[0]], None)
+        op1 = SpaceOperation('guard_class', [op.args[0]], op.result)
+        return [op0, op1]
 
     def rewrite_op_malloc(self, op):
         assert op.args[1].value == {'flavor': 'gc'}
@@ -569,10 +579,7 @@
                        ('cast_uint_to_float', 'cast_int_to_float'),
                        ('cast_float_to_uint', 'cast_float_to_int'),
 
-                       ('int_add_ovf',        'G_int_add_ovf'),
-                       ('int_add_nonneg_ovf', 'G_int_add_ovf'),
-                       ('int_sub_ovf',        'G_int_sub_ovf'),
-                       ('int_mul_ovf',        'G_int_mul_ovf'),
+                       ('int_add_nonneg_ovf', 'int_add_ovf'),
 
                        ('char_lt', 'int_lt'),
                        ('char_le', 'int_le'),
@@ -649,7 +656,8 @@
         for v in op.args[2:2+num_green_args]:
             if isinstance(v, Variable) and v.concretetype is not lltype.Void:
                 kind = getkind(v.concretetype)
-                ops.append(SpaceOperation('G_%s_guard_value' % kind,
+                ops.append(SpaceOperation('-live-', [v], None))
+                ops.append(SpaceOperation('%s_guard_value' % kind,
                                           [v], None))
         args = (self.make_three_lists(op.args[2:2+num_green_args]) +
                 self.make_three_lists(op.args[2+num_green_args:]))

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py	Thu May 20 20:01:21 2010
@@ -43,8 +43,9 @@
         if insn[0] == '-live-':
             assert prevalive is not None
             for x in insn[1:]:
-                prevalive.discard(x)
-            ssarepr.insns[i] = insn + tuple(prevalive)
+                if isinstance(x, Register):
+                    prevalive.add(x)
+            ssarepr.insns[i] = insn[:1] + tuple(prevalive)
             prevalive = None
             continue
 

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_jtransform.py	Thu May 20 20:01:21 2010
@@ -152,7 +152,6 @@
            'uint_le': ('int_le', 'int_ge'),
            'char_ne': 'int_ne',
            'char_lt': ('int_lt', 'int_gt'),
-           'int_add_nonneg_ovf': 'G_int_add_ovf',
            'uint_xor': 'int_xor',
            'float_mul': 'float_mul',
            'float_gt': ('float_gt', 'float_lt'),
@@ -174,6 +173,24 @@
                     assert op1.result == v3
                     assert op1.opname == name2[0]
 
+def test_symmetric_int_add_ovf():
+    v3 = varoftype(lltype.Signed)
+    for v1 in [varoftype(lltype.Signed), Constant(42, lltype.Signed)]:
+        for v2 in [varoftype(lltype.Signed), Constant(43, lltype.Signed)]:
+            op = SpaceOperation('int_add_nonneg_ovf', [v1, v2], v3)
+            oplist = Transformer(FakeCPU()).rewrite_operation(op)
+            op0, op1 = oplist
+            assert op0.opname == '-live-'
+            assert op0.args == [v1, v2]
+            assert op0.result is None
+            assert op1.opname == 'int_add_ovf'
+            if isinstance(v1, Constant) and isinstance(v2, Variable):
+                assert op1.args == [v2, v1]
+                assert op1.result == v3
+            else:
+                assert op1.args == [v1, v2]
+                assert op1.result == v3
+
 def test_calls():
     for RESTYPE in [lltype.Signed, rclass.OBJECTPTR,
                     lltype.Float, lltype.Void]:
@@ -208,9 +225,12 @@
 def residual_call_test(argtypes, restype, expectedkind):
     op = get_direct_call_op(argtypes, restype)
     tr = Transformer(FakeCPU(), FakeResidualCallControl())
-    op1 = tr.rewrite_operation(op)
+    oplist = tr.rewrite_operation(op)
+    op0, op1 = oplist
+    assert op0.opname == '-live-'
+    assert op0.args == []
     reskind = getkind(restype)[0]
-    assert op1.opname == 'G_residual_call_%s_%s' % (expectedkind, reskind)
+    assert op1.opname == 'residual_call_%s_%s' % (expectedkind, reskind)
     assert op1.result == op.result
     assert op1.args[0] == op.args[0]
     assert op1.args[1] == 'calldescr'
@@ -227,9 +247,12 @@
     op = get_direct_call_op(argtypes, restype)
     tr = Transformer(FakeCPU(), FakeRegularCallControl())
     tr.graph = 'someinitialgraph'
-    op1 = tr.rewrite_operation(op)
+    oplist = tr.rewrite_operation(op)
+    op0, op1 = oplist
+    assert op0.opname == '-live-'
+    assert op0.args == []
     reskind = getkind(restype)[0]
-    assert op1.opname == 'G_inline_call_%s_%s' % (expectedkind, reskind)
+    assert op1.opname == 'inline_call_%s_%s' % (expectedkind, reskind)
     assert op1.result == op.result
     assert op1.args[0] == 'somejitcode'
     assert len(op1.args) == 1 + len(expectedkind)
@@ -250,9 +273,12 @@
     op.args.append(Constant(['somegraph1', 'somegraph2'], lltype.Void))
     tr = Transformer(FakeCPU(), FakeResidualIndirectCallControl())
     tr.graph = 'someinitialgraph'
-    op1 = tr.rewrite_operation(op)
+    oplist = tr.rewrite_operation(op)
+    op0, op1 = oplist
+    assert op0.opname == '-live-'
+    assert op0.args == []
     reskind = getkind(restype)[0]
-    assert op1.opname == 'G_residual_call_%s_%s' % (expectedkind, reskind)
+    assert op1.opname == 'residual_call_%s_%s' % (expectedkind, reskind)
     assert op1.result == op.result
     assert op1.args[0] == op.args[0]
     assert op1.args[1] == 'calldescr'
@@ -275,14 +301,18 @@
     op.args.append(Constant(['somegraph1', 'somegraph2'], lltype.Void))
     tr = Transformer(FakeCPU(), FakeRegularIndirectCallControl())
     tr.graph = 'someinitialgraph'
-    op1 = tr.rewrite_operation(op)
-    assert type(op1) is list
-    op0, op1 = op1
-    assert op0.opname == 'G_int_guard_value'
-    assert op0.args[0] == op.args[0]
-    assert op0.result is None
+    oplist = tr.rewrite_operation(op)
+    op0gv, op1gv, op0, op1 = oplist
+    assert op0gv.opname == '-live-'
+    assert op0gv.args == [op.args[0]]
+    assert op1gv.opname == 'int_guard_value'
+    assert op1gv.args == [op.args[0]]
+    assert op1gv.result is None
+    #
+    assert op0.opname == '-live-'
+    assert op0.args == []
     reskind = getkind(restype)[0]
-    assert op1.opname == 'G_residual_call_%s_%s' % (expectedkind, reskind)
+    assert op1.opname == 'residual_call_%s_%s' % (expectedkind, reskind)
     assert op1.result == op.result
     assert op1.args[0] == op.args[0]
     assert op1.args[1] == 'calldescr'
@@ -332,13 +362,13 @@
     c_name = Constant('typeptr', lltype.Void)
     v_result = varoftype(rclass.OBJECT.typeptr)
     op = SpaceOperation('getfield', [v_parent, c_name], v_result)
-    op1, op2 = Transformer(FakeCPU()).rewrite_operation(op)
-    assert op1.opname == 'G_guard_class'
+    oplist = Transformer(FakeCPU()).rewrite_operation(op)
+    op0, op1 = oplist
+    assert op0.opname == '-live-'
+    assert op0.args == [v_parent]
+    assert op1.opname == 'guard_class'
     assert op1.args == [v_parent]
     assert op1.result == v_result
-    assert op2.opname == 'keepalive'
-    assert op2.args == [v_parent]
-    assert op2.result == None
 
 def test_setfield():
     # XXX a more compact encoding would be possible; see test_getfield()
@@ -404,8 +434,11 @@
     op = SpaceOperation('malloc', [Constant(S, lltype.Void),
                                    Constant({'flavor': 'gc'}, lltype.Void)], v)
     tr = Transformer(FakeCPU(), FakeResidualCallControl())
-    op1 = tr.rewrite_operation(op)
-    assert op1.opname == 'G_residual_call_r_r'
+    oplist = tr.rewrite_operation(op)
+    op0, op1 = oplist
+    assert op0.opname == '-live-'
+    assert op0.args == []
+    assert op1.opname == 'residual_call_r_r'
     assert op1.args[0].value == 'alloc_with_del'    # pseudo-function as a str
     assert list(op1.args[2]) == []
 
@@ -581,13 +614,13 @@
                         [v1, Constant({'promote': True}, lltype.Void)],
                         v2)
     oplist = Transformer().rewrite_operation(op)
-    assert len(oplist) == 3
-    assert oplist[0].opname == 'G_int_guard_value'
-    assert oplist[0].args == [v1]
-    assert oplist[0].result is None
-    assert oplist[1].opname == 'keepalive'
-    assert oplist[1].args == [v1]
-    assert oplist[2] is None
+    op0, op1, op2 = oplist
+    assert op0.opname == '-live-'
+    assert op0.args == [v1]
+    assert op1.opname == 'int_guard_value'
+    assert op1.args == [v1]
+    assert op1.result is None
+    assert op2 is None
 
 def test_promote_2():
     v1 = varoftype(lltype.Signed)
@@ -602,9 +635,9 @@
     block.closeblock(Link([v2], returnblock))
     Transformer().optimize_block(block)
     assert len(block.operations) == 2
-    assert block.operations[0].opname == 'G_int_guard_value'
+    assert block.operations[0].opname == '-live-'
     assert block.operations[0].args == [v1]
-    assert block.operations[0].result is None
-    assert block.operations[1].opname == 'keepalive'
+    assert block.operations[1].opname == 'int_guard_value'
     assert block.operations[1].args == [v1]
+    assert block.operations[1].result is None
     assert block.exits[0].args == [v1]

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_liveness.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_liveness.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/test/test_liveness.py	Thu May 20 20:01:21 2010
@@ -187,3 +187,14 @@
             L2:
             int_return %i3
         """)
+
+    def test_already_some(self):
+        self.liveness_test("""
+            -live- %i0, $52, %i2, %i0
+            foo %i0, %i1, %i2
+            bar %i3, %i4, %i5
+        """, """
+            -live- %i0, %i2, %i3, %i4, %i5
+            foo %i0, %i1, %i2
+            bar %i3, %i4, %i5
+        """)



More information about the Pypy-commit mailing list