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

antocuni at codespeak.net antocuni at codespeak.net
Fri Jun 19 15:02:48 CEST 2009


Author: antocuni
Date: Fri Jun 19 15:02:47 2009
New Revision: 65831

Modified:
   pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize3.py
   pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimize3.py
Log:
- port test_optimize.test_C_* to test_optimize3

- port the bits of recursively_find_escaping_values that are needed to make
  those tests passing



Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize3.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize3.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize3.py	Fri Jun 19 15:02:47 2009
@@ -18,7 +18,6 @@
         #if self.virtual:           flags += 'v'
         #if self.virtualized:       flags += 'V'
         return "<InstanceNode %s (%s)>" % (self.source, flags)
-        
 
 
 class InstanceValue(object):
@@ -52,7 +51,8 @@
         self.optlist = optlist
         self.nodes = None
         self.loop = None
-
+        self.dependency_graph = [] # XXX: it's used only by OptimizeVirtuals
+        
     def _init(self, loop):
         self.nodes = {}
         self.loop = loop
@@ -94,7 +94,9 @@
                 self.getnode(arg)
 
     def recursively_find_escaping_values(self):
-        pass # for now
+        for opt in self.optlist:
+            opt.recursively_find_escaping_values(self)
+
 
     def intersect_input_and_output(self):
         # Step (3)
@@ -306,6 +308,9 @@
         if func:
             func(self, spec, op)
 
+    def recursively_find_escaping_values(self, spec):
+        pass
+
     def intersect_nodes(self, spec, a, b, nodes):
         return None
 
@@ -382,7 +387,7 @@
         fieldnode = spec.getnode(op.args[1])
         assert isinstance(fielddescr, AbstractValue)
         instnode.curfields[fielddescr] = fieldnode
-##         self.dependency_graph.append((instnode, fieldnode))
+        spec.dependency_graph.append((instnode, fieldnode))
 
     def find_nodes_getfield_gc(self, spec, op):
         instnode = spec.getnode(op.args[0])
@@ -394,13 +399,44 @@
         elif fielddescr in instnode.origfields:
             fieldnode = instnode.origfields[fielddescr]
         else:
-            fieldnode = InstanceNode(resbox, escaped=False)
+            fieldnode = spec.newnode(resbox, escaped=False)
 ##             if instnode.startbox:
 ##                 fieldnode.startbox = True
-##             self.dependency_graph.append((instnode, fieldnode))
+            spec.dependency_graph.append((instnode, fieldnode))
             instnode.origfields[fielddescr] = fieldnode
         spec.nodes[resbox] = fieldnode
 
+    def add_to_dependency_graph(self, a, b, dep_graph):
+        dep_graph.append((a, b))
+        for ofs, node in a.origfields.items():
+            if ofs in b.curfields:
+                self.add_to_dependency_graph(node, b.curfields[ofs], dep_graph)
+
+    def recursively_find_escaping_values(self, spec):
+        end_args = spec.loop.operations[-1].args
+        assert len(spec.loop.inputargs) == len(end_args)
+        memo = {}
+        for i in range(len(end_args)):
+            end_box = end_args[i]
+##             if isinstance(end_box, Box):
+##                 spec.nodes[end_box].escape_if_startbox(memo, spec.cpu)
+        for i in range(len(end_args)):
+            box = spec.loop.inputargs[i]
+            other_box = end_args[i]
+            if isinstance(other_box, Box):
+                self.add_to_dependency_graph(spec.nodes[box],
+                                             spec.nodes[other_box],
+                                             spec.dependency_graph)
+        # XXX find efficient algorithm, we're too fried for that by now
+        done = False
+        while not done:
+            done = True
+            for instnode, fieldnode in spec.dependency_graph:
+                if instnode.escaped:
+                    if not fieldnode.escaped:
+                        fieldnode.escaped = True
+                        done = False
+
     def intersect_nodes(self, spec, a, b, nodes):
         if not b.known_class:
             return NotSpecNode()
@@ -427,7 +463,7 @@
             node = d[ofs]
             if ofs not in a.origfields:
                 box = node.source.clonebox()
-                a.origfields[ofs] = InstanceNode(box, escaped=False)
+                a.origfields[ofs] = spec.newnode(box, escaped=False)
                 a.origfields[ofs].known_class = node.known_class
                 nodes[box] = a.origfields[ofs]
             specnode = spec.intersect_nodes(a.origfields[ofs], node, nodes)

Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimize3.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimize3.py	(original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_optimize3.py	Fri Jun 19 15:02:47 2009
@@ -289,7 +289,7 @@
         self.assert_equal(loop, expected)
 
 
-class VirtualEscape(BaseVirtualTest):
+class VirtualEscape1(BaseVirtualTest):
 
     def getloop(self):
         ops = """
@@ -345,6 +345,63 @@
         self.assert_equal(loop, expected)
 
 
+class VirtualEscape2(BaseVirtualTest):
+
+    def getloop(self):
+        ops = """
+        [sum, n1]
+        guard_class(n1, ConstClass(node_vtable))
+            fail()
+        escape(n1)
+        v = getfield_gc(n1, descr=valuedescr)
+        v2 = int_sub(v, 1)
+        sum2 = int_add(sum, v)
+        escape(n1)
+        n2 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
+        setfield_gc(n2, v2, descr=valuedescr)
+        jump(sum2, n2)
+        """
+        loop = self.parse(ops, boxkinds={'sum': BoxInt,
+                                         'v': BoxInt,
+                                         'n': BoxPtr})
+        loop.setvalues(sum  = 0,
+                       n1   = self.nodebox.value,
+                       v    = 20,
+                       v2   = 19,
+                       sum2 = 20,
+                       n2   = self.nodebox2.value)
+        return loop
+
+    def check_find_nodes(self, spec, loop):
+        b = loop.getboxes()
+        assert spec.nodes[b.n1].known_class.source.value == self.node_vtable_adr
+        assert spec.nodes[b.n1].escaped
+        assert spec.nodes[b.n2].known_class.source.value == self.node_vtable_adr
+
+    def check_intersect_input_and_output(self, spec, loop):
+        b = loop.getboxes()
+        assert spec.nodes[b.n2].escaped
+        assert len(spec.specnodes) == 2
+        spec_sum, spec_n = spec.specnodes
+        assert isinstance(spec_sum, NotSpecNode)
+        assert type(spec_n) is FixedClassSpecNode
+        assert spec_n.known_class.value == self.node_vtable_adr
+
+    def check_optimize_loop(self, opt, loop):
+        expected = """
+        [sum, n1]
+        escape(n1)
+        v = getfield_gc(n1, descr=valuedescr)
+        v2 = int_sub(v, 1)
+        sum2 = int_add(sum, v)
+        escape(n1)
+        n2 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
+        setfield_gc(n2, v2, descr=valuedescr)
+        jump(sum2, n2)
+        """
+        self.assert_equal(loop, expected)
+        
+
 
 def create_tests(ns):
     for name, value in ns.items():



More information about the Pypy-commit mailing list