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

fijal at codespeak.net fijal at codespeak.net
Thu Feb 12 17:23:47 CET 2009


Author: fijal
Date: Thu Feb 12 17:23:47 2009
New Revision: 61794

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py
Log:
(arigo, fijal)
A test and a fix for variables that are only read or only write into
virtualizable


Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py	Thu Feb 12 17:23:47 2009
@@ -174,19 +174,39 @@
             if self.cls is None:
                 return None
             return FixedClassSpecNode(known_class)
-        fields = []
-        lst = other.curfields.items()
-        lst.sort()
-        for ofs, node in lst:
-            if ofs in self.origfields:
-                specnode = self.origfields[ofs].intersect(node)
-            else:
-                self.origfields[ofs] = InstanceNode(node.source.clonebox())
-                specnode = None
-            fields.append((ofs, specnode))
-        if other.escaped:
+        if not other.escaped:
+            fields = []
+            lst = other.curfields.items()
+            lst.sort()
+            for ofs, node in lst:
+                if ofs in self.origfields:
+                    specnode = self.origfields[ofs].intersect(node)
+                else:
+                    self.origfields[ofs] = InstanceNode(node.source.clonebox())
+                    specnode = None
+                fields.append((ofs, specnode))
+            return VirtualInstanceSpecNode(known_class, fields)
+        else:
+            assert self is other
+            d = self.origfields.copy()
+            d.update(other.curfields)
+            offsets = d.keys()
+            offsets.sort()
+            fields = []
+            for ofs in offsets:
+                if ofs in self.origfields and ofs in other.curfields:
+                    node = other.curfields[ofs]
+                    specnode = self.origfields[ofs].intersect(node)
+                elif ofs in self.origfields:
+                    specnode = None
+                else:
+                    # ofs in other.curfields
+                    node = other.curfields[ofs]
+                    self.origfields[ofs] = InstanceNode(node.source.clonebox())
+                    specnode = None
+                fields.append((ofs, specnode))
+                    
             return VirtualizableSpecNode(known_class, fields)
-        return VirtualInstanceSpecNode(known_class, fields)
 
     def adapt_to(self, specnode):
         if not isinstance(specnode, VirtualInstanceSpecNode):

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py	Thu Feb 12 17:23:47 2009
@@ -406,9 +406,10 @@
 
     @arguments("orgpc", "box", returns="box")
     def opimpl_guard_class(self, pc, box):
+        clsbox = self.cls_of_box(box)
         if isinstance(box, Box):
-            clsbox = self.cls_of_box(box)
             self.generate_guard(pc, 'guard_class', box, [clsbox])
+        return clsbox
 
     @arguments("orgpc", "box", "virtualizabledesc", "int")
     def opimpl_guard_nonvirtualized(self, pc, box, vdesc, guard_field):

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py	Thu Feb 12 17:23:47 2009
@@ -6,7 +6,8 @@
 from pypy.jit.metainterp.history import (ResOperation, MergePoint, Jump,
                                          ConstInt, ConstAddr, BoxInt, BoxPtr)
 from pypy.jit.metainterp.optimize import (PerfectSpecializer,
-                                          VirtualizableSpecNode)
+                                          VirtualizableSpecNode,
+                                          VirtualInstanceSpecNode)
 from pypy.jit.metainterp.virtualizable import VirtualizableDesc
 from pypy.jit.metainterp.test.test_optimize import (cpu, NODE, node_vtable,
                                                     equaloplists)
@@ -117,3 +118,39 @@
             ResOperation('int_add', [A.sum, A.v], [A.sum2]),
             Jump('jump', [A.sum2, A.fr, A.v2], []),
         ])
+
+# ____________________________________________________________
+
+class B:
+    ofs_node = runner.CPU.fielddescrof(XY, 'node')
+    ofs_value = runner.CPU.fielddescrof(NODE, 'value')
+    size_of_node = runner.CPU.sizeof(NODE)
+    #
+    frame = lltype.malloc(XY)
+    frame.vable_rti = lltype.nullptr(XY.vable_rti.TO)
+    frame.node = lltype.malloc(NODE)
+    frame.node.value = 20
+    fr = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, frame))
+    n1 = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, frame.node))
+    v = BoxInt(13)
+    ops = [
+        MergePoint('merge_point', [fr], []),
+        ResOperation('guard_nonvirtualized', [fr, ConstAddr(xy_vtable, cpu),
+                                              ConstInt(ofs_node)], []),
+        ResOperation('getfield_gc', [fr, ConstInt(ofs_node)], [n1]),
+        ResOperation('getfield_gc', [n1, ConstInt(ofs_value)], [v]),
+        Jump('jump', [fr], []),
+        ]
+    ops[1].vdesc = xy_desc
+
+def test_B_intersect_input_and_output():
+    spec = PerfectSpecializer(B.ops)
+    spec.find_nodes()
+    spec.intersect_input_and_output()
+    assert spec.nodes[B.fr].escaped
+    assert spec.nodes[B.fr].virtualized
+    assert not spec.nodes[B.n1].escaped
+    assert isinstance(spec.specnodes[0], VirtualizableSpecNode)
+    assert len(spec.specnodes[0].fields) == 1
+    assert spec.specnodes[0].fields[0][0] == B.ofs_node
+    assert spec.specnodes[0].fields[0][1] is None



More information about the Pypy-commit mailing list