[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