[pypy-svn] r61786 - in pypy/branch/pyjitpl5/pypy/jit/metainterp: . test
fijal at codespeak.net
fijal at codespeak.net
Thu Feb 12 15:43:59 CET 2009
Author: fijal
Date: Thu Feb 12 15:43:57 2009
New Revision: 61786
Modified:
pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/virtualizable.py
Log:
(arigo, fijal)
First (very simple) test about virtualizables passes
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 15:43:57 2009
@@ -5,7 +5,6 @@
class CancelInefficientLoop(Exception):
pass
-
class FixedClassSpecNode(object):
def __init__(self, known_class):
self.known_class = known_class
@@ -22,6 +21,17 @@
return False
return instnode.cls.source.equals(self.known_class)
+class VirtualizableSpecNode(FixedClassSpecNode):
+ def __init__(self, known_class, fields):
+ FixedClassSpecNode.__init__(self, known_class)
+ self.fields = fields
+
+ def equals(self, other):
+ xxx
+
+ def matches(self, instnode):
+ xxx
+
class VirtualInstanceSpecNode(FixedClassSpecNode):
def __init__(self, known_class, fields):
FixedClassSpecNode.__init__(self, known_class)
@@ -58,7 +68,6 @@
return False
return True
-
class AllocationStorage(object):
def __init__(self):
# allocations: list of vtables to allocate
@@ -145,7 +154,7 @@
known_class = self.cls.source
else:
known_class = other.cls.source
- if other.escaped:
+ if other.escaped and not other.virtualized:
if self.cls is None:
return None
return FixedClassSpecNode(known_class)
@@ -159,6 +168,8 @@
self.origfields[ofs] = InstanceNode(node.source.clonebox())
specnode = None
fields.append((ofs, specnode))
+ if other.escaped:
+ return VirtualizableSpecNode(known_class, fields)
return VirtualInstanceSpecNode(known_class, fields)
def adapt_to(self, specnode):
@@ -267,9 +278,11 @@
if instnode.cls is None:
instnode.cls = InstanceNode(op.args[1])
continue
- elif opname.startswith('guard_nonvirtualized_'):
+ elif opname == 'guard_nonvirtualized':
instnode = self.getnode(op.args[0])
instnode.virtualized = True
+ if instnode.cls is None:
+ instnode.cls = InstanceNode(op.args[1])
continue
elif opname not in ('oois', 'ooisnot',
'ooisnull', 'oononnull'):
@@ -319,7 +332,8 @@
instnode.cls = InstanceNode(specnode.known_class)
else:
assert instnode.cls.source.equals(specnode.known_class)
- if isinstance(specnode, VirtualInstanceSpecNode):
+ if isinstance(specnode, (VirtualInstanceSpecNode,
+ VirtualizableSpecNode)):
curfields = {}
for ofs, subspecnode in specnode.fields:
subinstnode = instnode.origfields[ofs]
@@ -327,7 +341,8 @@
self.mutate_nodes(subinstnode, subspecnode)
curfields[ofs] = subinstnode
instnode.curfields = curfields
- instnode.virtual = True
+ if isinstance(specnode, VirtualInstanceSpecNode):
+ instnode.virtual = True
def expanded_version_of(self, boxlist):
newboxlist = []
@@ -341,7 +356,8 @@
def expanded_version_of_rec(self, specnode, instnode, newboxlist):
if not isinstance(specnode, VirtualInstanceSpecNode):
newboxlist.append(instnode.source)
- else:
+ if isinstance(specnode, (VirtualInstanceSpecNode,
+ VirtualizableSpecNode)):
for ofs, subspecnode in specnode.fields:
subinstnode = instnode.curfields[ofs] # should really be there
self.expanded_version_of_rec(subspecnode, subinstnode,
@@ -411,7 +427,7 @@
op = self.optimize_guard(op)
newoperations.append(op)
continue
- elif opname.startswith('guard_nonvirtualized_'):
+ elif opname == 'guard_nonvirtualized':
instnode = self.nodes[op.args[0]]
if instnode.virtualized:
continue
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 15:43:57 2009
@@ -5,9 +5,11 @@
from pypy.jit.metainterp import heaptracker
from pypy.jit.metainterp.history import (ResOperation, MergePoint, Jump,
ConstInt, ConstAddr, BoxInt, BoxPtr)
-from pypy.jit.metainterp.optimize import PerfectSpecializer
+from pypy.jit.metainterp.optimize import (PerfectSpecializer,
+ VirtualizableSpecNode)
from pypy.jit.metainterp.virtualizable import VirtualizableDesc
-from pypy.jit.metainterp.test.test_optimize import (cpu, NODE, node_vtable)
+from pypy.jit.metainterp.test.test_optimize import (cpu, NODE, node_vtable,
+ equaloplists)
# ____________________________________________________________
@@ -55,8 +57,8 @@
# ____________________________________________________________
class A:
- ofs_node = runner.CPU.offsetof(XY, 'node')
- ofs_value = runner.CPU.offsetof(NODE, 'value')
+ 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)
@@ -74,7 +76,8 @@
sum2 = BoxInt(0 + frame.node.value)
ops = [
MergePoint('merge_point', [sum, fr], []),
- ResOperation('guard_nonvirtualized__4', [fr, ConstInt(ofs_node)], []),
+ 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]),
ResOperation('int_sub', [v, ConstInt(1)], [v2]),
@@ -100,6 +103,7 @@
assert spec.nodes[A.fr].virtualized
assert not spec.nodes[A.n1].escaped
assert not spec.nodes[A.n2].escaped
+ assert isinstance(spec.specnodes[1], VirtualizableSpecNode)
def test_A_optimize_loop():
operations = A.ops[:]
@@ -108,8 +112,8 @@
spec.intersect_input_and_output()
spec.optimize_loop()
assert equaloplists(operations, [
- MergePoint('merge_point', [A.sum, A.n1, A.v], []),
+ MergePoint('merge_point', [A.sum, A.fr, A.v], []),
ResOperation('int_sub', [A.v, ConstInt(1)], [A.v2]),
ResOperation('int_add', [A.sum, A.v], [A.sum2]),
- Jump('jump', [A.sum2, A.n1, A.v2], []),
+ Jump('jump', [A.sum2, A.fr, A.v2], []),
])
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/virtualizable.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/virtualizable.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/virtualizable.py Thu Feb 12 15:43:57 2009
@@ -9,8 +9,8 @@
def __init__(self, cpu, TOPSTRUCT):
"NOT_RPYTHON"
initialize_virtualizable(cpu, TOPSTRUCT.access)
- self.vable_base = cpu.offsetof(TOPSTRUCT, 'vable_base')
- self.vable_rti = cpu.offsetof(TOPSTRUCT, 'vable_rti')
+ self.vable_base = cpu.fielddescrof(TOPSTRUCT, 'vable_base')
+ self.vable_rti = cpu.fielddescrof(TOPSTRUCT, 'vable_rti')
self.c_vable_base = history.ConstInt(self.vable_base)
self.c_vable_rti = history.ConstInt(self.vable_rti)
@@ -32,7 +32,7 @@
if FIELDTYPE is lltype.Void:
return
type = history.getkind_num(cpu, FIELDTYPE)
- ofs = cpu.offsetof(access.STRUCT, fieldname)
+ ofs = cpu.fielddescrof(access.STRUCT, fieldname)
getset = access.getsets[fieldname]
def getter(instanceptr):
More information about the Pypy-commit
mailing list