[pypy-svn] r65465 - in pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp: . test

fijal at codespeak.net fijal at codespeak.net
Wed May 27 23:53:51 CEST 2009


Author: fijal
Date: Wed May 27 23:53:49 2009
New Revision: 65465

Modified:
   pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/optimize2.py
   pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_optimize2.py
Log:
a super-basic virtual


Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/optimize2.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/optimize2.py	(original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/optimize2.py	Wed May 27 23:53:49 2009
@@ -25,13 +25,14 @@
         self.allocated_in_loop = False
         self.vdesc = None
         self.escaped = escaped
+        self.virtual = False
 
     def __repr__(self):
         flags = ''
         if self.escaped:           flags += 'e'
         #if self.startbox:          flags += 's'
         if self.const:             flags += 'c'
-        #if self.virtual:           flags += 'v'
+        if self.virtual:           flags += 'v'
         if self.virtualized:       flags += 'V'
         return "<InstanceNode %s (%s)>" % (self.source, flags)
 
@@ -94,9 +95,17 @@
                     for arg in op.suboperations[0].args:
                         self.getnode(arg)
                 # default case
+                nodes = []
                 for box in op.args:
-                    node = self.getnode(box)
-                    if not op.has_no_side_effect() and not op.is_guard():
+                    nodes.append(self.getnode(box))
+                if op.has_no_side_effect() or op.is_guard():
+                    pass
+                elif (op.opnum in [rop.SETFIELD_GC, rop.SETFIELD_RAW,
+                                   rop.SETARRAYITEM_GC]):
+                    for i in range(1, len(nodes)):
+                        nodes[i].escaped = True
+                else:
+                    for node in nodes:
                         node.escaped = True
             box = op.result
             if box is not None:
@@ -306,10 +315,32 @@
         return True
 
 class SimpleVirtualOpt(object):
+    @staticmethod
     def optimize_new_with_vtable(op, spec):
-        xxx
         node = spec.getnode(op.result)
-        node.escaped = False
+        if node.escaped:
+            return False
+        node.virtual = True
+        return True
+
+    @staticmethod
+    def optimize_setfield_gc(op, spec):
+        instnode = spec.getnode(op.args[0])
+        if not instnode.virtual:
+            return False
+        field = op.descr
+        node = spec.getnode(op.args[1])
+        instnode.cleanfields[field] = node
+        return True
+
+    @staticmethod
+    def optimize_getfield_gc(op, spec):
+        instnode = spec.getnode(op.args[0])
+        if not instnode.virtual:
+            return False
+        field = op.descr
+        spec.nodes[op.result] = instnode.cleanfields[field]
+        return True
 
 specializer = Specializer([SimpleVirtualizableOpt(),
                            ConsecutiveGuardClassRemoval()])

Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_optimize2.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_optimize2.py	(original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_optimize2.py	Wed May 27 23:53:49 2009
@@ -362,20 +362,20 @@
         optimize_loop(None, [], loop, self.cpu, spec=spec)
         assert not spec.nodes[loop.operations[0].result].escaped
 
-#     def test_simple_virtual(self):
-#         pre_op = """
-#         []
-#         p0 = new_with_vtable(13, ConstClass(node_vtable))
-#         setfield_gc(p0, 1, descr=field_desc)
-#         i2 = getfield_gc(p0, descr=field_desc)
-#         fail(i2)
-#         """
-#         expected = """
-#         []
-#         fail(1)
-#         """
-#         self.assert_equal(self.optimize(pre_op, [SimpleVirtualOpt()]),
-#                                         expected)
+    def test_simple_virtual(self):
+        pre_op = """
+        []
+        p0 = new_with_vtable(13, ConstClass(node_vtable))
+        setfield_gc(p0, 1, descr=field_desc)
+        i2 = getfield_gc(p0, descr=field_desc)
+        fail(i2)
+        """
+        expected = """
+        []
+        fail(1)
+        """
+        self.assert_equal(self.optimize(pre_op, [SimpleVirtualOpt()]),
+                          expected)
 
 class TestLLtype(LLtypeMixin, BaseTestOptimize2):
     pass



More information about the Pypy-commit mailing list