[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