[pypy-svn] r62107 - in pypy/branch/pyjitpl5/pypy/jit: backend/llgraph metainterp metainterp-bak metainterp/test
arigo at codespeak.net
arigo at codespeak.net
Tue Feb 24 14:29:33 CET 2009
Author: arigo
Date: Tue Feb 24 14:29:31 2009
New Revision: 62107
Added:
pypy/branch/pyjitpl5/pypy/jit/metainterp-bak/
- copied from r62106, pypy/branch/pyjitpl5/pypy/jit/metainterp/
Modified:
pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/heaptracker.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/history.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/pyjitpl.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vlist.py
Log:
Make a backup of metainterp in metainterp-bak, and
comment out temporarily the list spec node from metainterp.
This is mostly an effort of trying to understand what is
going on :-)
Modified: pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/backend/llgraph/llimpl.py Tue Feb 24 14:29:31 2009
@@ -77,9 +77,9 @@
'guard_false' : (('bool',), None),
'guard_value' : (('int', 'int'), None),
'guard_class' : (('ptr', 'ptr'), None),
- 'guard_no_exception' : ((), None),
- 'guard_exception' : (('ptr',), 'ptr'),
- 'guard_nonvirtualized__4' : (('ptr', 'int'), None),
+ 'guard_no_exception' : ((), None),
+ 'guard_exception' : (('ptr',), 'ptr'),
+ 'guard_nonvirtualized' : (('ptr', 'ptr', 'int'), None),
'guard_builtin' : (('ptr',), None),
'newstr' : (('int',), 'ptr'),
'strlen' : (('ptr',), 'int'),
@@ -568,11 +568,11 @@
def op_guard_builtin(self, b):
pass
- def op_guard_true(self, value, *livevars):
+ def op_guard_true(self, value):
if not value:
raise GuardFailed
- def op_guard_false(self, value, *livevars):
+ def op_guard_false(self, value):
if value:
raise GuardFailed
@@ -618,7 +618,7 @@
op_guard_is = op_guard_eq
op_guard_isnot = op_guard_ne
- def op_guard_class(self, value, expected_class, *livevars):
+ def op_guard_class(self, value, expected_class):
value = lltype.cast_opaque_ptr(rclass.OBJECTPTR, value)
expected_class = llmemory.cast_adr_to_ptr(
self.cpu.cast_int_to_adr(expected_class),
@@ -630,12 +630,12 @@
if value != expected_value:
raise GuardFailed
- def op_guard_nonvirtualized__4(self, value, for_accessing_field):
+ def op_guard_nonvirtualized(self, value, expected_class,
+ for_accessing_field):
+ self.op_guard_class(value, expected_class)
if heaptracker.cast_vable(value).vable_rti:
raise GuardFailed # some other code is already in control
- op_guard_nonvirtualized_ptr = op_guard_nonvirtualized__4
-
def op_guard_no_exception(self):
if self.last_exception:
self.last_exception_handled = True
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py Tue Feb 24 14:29:31 2009
@@ -14,26 +14,26 @@
MAX_MAKE_NEW_VARS = 16
-class BuiltinDescr(history.AbstractValue):
- pass
+##class BuiltinDescr(history.AbstractValue):
+## pass
-class ListDescr(BuiltinDescr):
- def __init__(self, getfunc, setfunc, malloc_func, append_func,
- pop_func, insert_func, len_func, nonzero_func, tp):
- self.setfunc = setfunc
- self.getfunc = getfunc
- self.malloc_func = malloc_func
- self.append_func = append_func
- self.insert_func = insert_func
- self.pop_func = pop_func
- self.len_func = len_func
- self.nonzero_func = nonzero_func
- self.tp = tp
+##class ListDescr(BuiltinDescr):
+## def __init__(self, getfunc, setfunc, malloc_func, append_func,
+## pop_func, insert_func, len_func, nonzero_func, tp):
+## self.setfunc = setfunc
+## self.getfunc = getfunc
+## self.malloc_func = malloc_func
+## self.append_func = append_func
+## self.insert_func = insert_func
+## self.pop_func = pop_func
+## self.len_func = len_func
+## self.nonzero_func = nonzero_func
+## self.tp = tp
- def equals(self, other):
- if isinstance(other, ListDescr):
- return True
- return False
+## def equals(self, other):
+## if isinstance(other, ListDescr):
+## return True
+## return False
class JitCode(history.AbstractValue):
def __init__(self, name):
@@ -529,7 +529,7 @@
c_fieldname.value)
self.emit(offset)
self.register_var(op.result)
- self._eventualy_builtin(op.result)
+ #self._eventualy_builtin(op.result)
def serialize_op_setfield(self, op):
if self.is_typeptr_getset(op):
@@ -590,31 +590,30 @@
self.emit('jit_merge_point')
assert ([self.var_position(i) for i in op.args[2:]] ==
range(0, 2*(len(op.args) - 2), 2))
- for i in range(2, len(op.args)):
- arg = op.args[i]
- self._eventualy_builtin(arg)
-
+## for i in range(2, len(op.args)):
+## arg = op.args[i]
+## self._eventualy_builtin(arg)
elif op.args[0].value == 'can_enter_jit':
self.emit('can_enter_jit')
self.emit_varargs(op.args[2:])
- def _eventualy_builtin(self, arg, need_length=True):
- if isinstance(arg.concretetype, lltype.Ptr):
- # XXX very complex logic for getting all things
- # that are pointers, but not objects
- is_list = False
- if isinstance(arg.concretetype.TO, lltype.GcArray):
- is_list = True
- if isinstance(arg.concretetype.TO, lltype.GcStruct):
- if arg.concretetype.TO._hints.get('list'):
- is_list = True
- if is_list:
- descr = self.codewriter.list_descr_for_tp(arg.concretetype)
- self.emit('guard_builtin', self.var_position(arg),
- self.get_position(descr))
- if need_length:
- self.emit('guard_len', self.var_position(arg),
- self.get_position(descr))
+## def _eventualy_builtin(self, arg, need_length=True):
+## if isinstance(arg.concretetype, lltype.Ptr):
+## # XXX very complex logic for getting all things
+## # that are pointers, but not objects
+## is_list = False
+## if isinstance(arg.concretetype.TO, lltype.GcArray):
+## is_list = True
+## if isinstance(arg.concretetype.TO, lltype.GcStruct):
+## if arg.concretetype.TO._hints.get('list'):
+## is_list = True
+## if is_list:
+## descr = self.codewriter.list_descr_for_tp(arg.concretetype)
+## self.emit('guard_builtin', self.var_position(arg),
+## self.get_position(descr))
+## if need_length:
+## self.emit('guard_len', self.var_position(arg),
+## self.get_position(descr))
#def serialize_op_direct_call(self, op):
# color = support.guess_call_kind(self.codewriter.hannotator, op)
@@ -655,33 +654,33 @@
c_func, TP = support.builtin_func_for_spec(self.codewriter.rtyper,
oopspec_name, ll_args,
op.result.concretetype)
- if oopspec_name.startswith('list') or oopspec_name == 'newlist':
- if oopspec_name.startswith('list.getitem'):
- opname = oopspec_name[len('list.'):]
- elif oopspec_name.startswith('list.setitem'):
- opname = oopspec_name[len('list.'):]
- elif oopspec_name == 'newlist':
- opname = 'newlist'
- elif oopspec_name == 'list.append':
- opname = 'append'
- elif oopspec_name == 'list.pop':
- opname = 'pop'
- elif oopspec_name == 'list.len':
- opname = 'len'
- elif oopspec_name == 'list.insert':
- opname = 'insert'
- elif oopspec_name == 'list.nonzero':
- opname = 'listnonzero'
- else:
- raise NotImplementedError("not supported %s" % oopspec_name)
- self.emit(opname)
- ld = self.codewriter.list_descr_for_tp(TP)
- self.emit(self.get_position(ld))
- self.emit_varargs(args)
- self.register_var(op.result)
- if opname == 'newlist':
- self._eventualy_builtin(op.result, False)
- return
+## if oopspec_name.startswith('list') or oopspec_name == 'newlist':
+## if oopspec_name.startswith('list.getitem'):
+## opname = oopspec_name[len('list.'):]
+## elif oopspec_name.startswith('list.setitem'):
+## opname = oopspec_name[len('list.'):]
+## elif oopspec_name == 'newlist':
+## opname = 'newlist'
+## elif oopspec_name == 'list.append':
+## opname = 'append'
+## elif oopspec_name == 'list.pop':
+## opname = 'pop'
+## elif oopspec_name == 'list.len':
+## opname = 'len'
+## elif oopspec_name == 'list.insert':
+## opname = 'insert'
+## elif oopspec_name == 'list.nonzero':
+## opname = 'listnonzero'
+## else:
+## raise NotImplementedError("not supported %s" % oopspec_name)
+## self.emit(opname)
+## ld = self.codewriter.list_descr_for_tp(TP)
+## self.emit(self.get_position(ld))
+## self.emit_varargs(args)
+## self.register_var(op.result)
+## if opname == 'newlist':
+## self._eventualy_builtin(op.result, False)
+## return
if oopspec_name.endswith('_foldable'):
opname = 'green_call_%s'
else:
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/heaptracker.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/heaptracker.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/heaptracker.py Tue Feb 24 14:29:31 2009
@@ -22,14 +22,14 @@
return lltype.cast_primitive(EXPECTED_TYPE, x)
def cast_vable(p):
- T = lltype.Ptr(lltype.typeOf(p._obj.container))
+ T = lltype.Ptr(lltype.typeOf(p._obj._normalizedcontainer()))
p = lltype.cast_opaque_ptr(T, p)
STRUCT = cast_vable_type(T.TO)
return lltype.cast_pointer(lltype.Ptr(STRUCT), p)
def cast_vable_type(STRUCT):
assert STRUCT._hints.get('virtualizable2'), \
- "not a virtualizable2: %r" % (p,)
+ "not a virtualizable2: %r" % (STRUCT,)
while True:
_, PARENT = STRUCT._first_struct()
if PARENT is None or not PARENT._hints.get('virtualizable2'):
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/history.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/history.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/history.py Tue Feb 24 14:29:31 2009
@@ -522,3 +522,9 @@
ResOpGraphPage(graphs, errmsg, highlightops).display()
# ----------------------------------------------------------------
+
+class Options:
+ def __init__(self, specialize=True):
+ self.specialize = specialize
+ def _freeze_(self):
+ return True
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 Tue Feb 24 14:29:31 2009
@@ -1,19 +1,21 @@
from pypy.jit.metainterp.history import (Box, Const, ConstInt, BoxInt,
MergePoint, ResOperation, Jump)
+from pypy.jit.metainterp.history import Options
from pypy.jit.metainterp.heaptracker import (always_pure_operations,
operations_without_side_effects,
operation_never_raises)
from pypy.jit.metainterp.specnode import (FixedClassSpecNode,
- FixedListSpecNode,
+ #FixedListSpecNode,
VirtualInstanceSpecNode,
VirtualizableSpecNode,
NotSpecNode,
DelayedSpecNode,
SpecNodeWithBox,
- DelayedListSpecNode,
- VirtualListSpecNode)
+ #DelayedListSpecNode,
+ #VirtualListSpecNode,
+ )
from pypy.rlib.objectmodel import we_are_translated
-from pypy.jit.metainterp.codewriter import ListDescr
+#from pypy.jit.metainterp.codewriter import ListDescr
class CancelInefficientLoop(Exception):
pass
@@ -33,8 +35,8 @@
self.allocations = []
self.setfields = []
# the same as above, but for lists and for running setitem
- self.list_allocations = []
- self.setitems = []
+## self.list_allocations = []
+## self.setitems = []
def deal_with_box(self, box, nodes, liveboxes, memo, ready):
if isinstance(box, Const) or box not in nodes:
@@ -49,16 +51,17 @@
virtual = instnode.virtual
virtualized = instnode.virtualized
if virtual:
- if isinstance(instnode.cls.source, ListDescr):
- ld = instnode.cls.source
- assert isinstance(ld, ListDescr)
- alloc_offset = len(self.list_allocations)
- malloc_func = ld.malloc_func
- assert instnode.cursize != -1
- self.list_allocations.append((malloc_func,
- instnode.cursize))
- res = (alloc_offset + 1) << 16
- else:
+## if isinstance(instnode.cls.source, ListDescr):
+## ld = instnode.cls.source
+## assert isinstance(ld, ListDescr)
+## alloc_offset = len(self.list_allocations)
+## malloc_func = ld.malloc_func
+## assert instnode.cursize != -1
+## self.list_allocations.append((malloc_func,
+## instnode.cursize))
+## res = (alloc_offset + 1) << 16
+## else:
+ if 1:
alloc_offset = len(self.allocations)
self.allocations.append(instnode.cls.source.getint())
res = alloc_offset
@@ -66,12 +69,13 @@
for ofs, node in instnode.curfields.items():
num = self.deal_with_box(node.source, nodes, liveboxes, memo,
ready)
- if isinstance(instnode.cls.source, ListDescr):
- ld = instnode.cls.source
- x = (alloc_offset + 1) << 16
- assert ofs < instnode.cursize
- self.setitems.append((ld.setfunc, x, ofs, num))
- else:
+## if isinstance(instnode.cls.source, ListDescr):
+## ld = instnode.cls.source
+## x = (alloc_offset + 1) << 16
+## assert ofs < instnode.cursize
+## self.setitems.append((ld.setfunc, x, ofs, num))
+## else:
+ if 1:
self.setfields.append((alloc_offset, ofs, num))
elif virtualized:
res = ~len(liveboxes)
@@ -135,16 +139,16 @@
not self.expanded_fields):
if self.cls is None:
return NotSpecNode()
- if isinstance(known_class, ListDescr):
- return FixedListSpecNode(known_class)
+## if isinstance(known_class, ListDescr):
+## return FixedListSpecNode(known_class)
return FixedClassSpecNode(known_class)
if not other.escaped:
- if (isinstance(known_class, ListDescr)
- and self.cursize != other.origsize):
- # or DelayedListSpecNode, later on
- self.escaped = True
- other.escaped = True
- return FixedListSpecNode(known_class)
+## if (isinstance(known_class, ListDescr)
+## and self.cursize != other.origsize):
+## # or DelayedListSpecNode, later on
+## self.escaped = True
+## other.escaped = True
+## return FixedListSpecNode(known_class)
fields = []
if self is other:
d = other.curfields.copy()
@@ -160,9 +164,9 @@
self.origfields[ofs] = InstanceNode(node.source.clonebox())
specnode = NotSpecNode()
fields.append((ofs, specnode))
- if isinstance(known_class, ListDescr):
- return VirtualListSpecNode(known_class, fields,
- other.cursize)
+## if isinstance(known_class, ListDescr):
+## return VirtualListSpecNode(known_class, fields,
+## other.cursize)
return VirtualInstanceSpecNode(known_class, fields)
if not other.virtualized and self.expanded_fields:
fields = []
@@ -171,8 +175,8 @@
for ofs in lst:
specnode = SpecNodeWithBox(self.origfields[ofs].source)
fields.append((ofs, specnode))
- if isinstance(known_class, ListDescr):
- return DelayedListSpecNode(known_class, fields)
+## if isinstance(known_class, ListDescr):
+## return DelayedListSpecNode(known_class, fields)
return DelayedSpecNode(known_class, fields)
else:
assert self is other
@@ -238,7 +242,7 @@
class PerfectSpecializer(object):
- def __init__(self, loop, options):
+ def __init__(self, loop, options=Options()):
self.loop = loop
self.options = options
self.nodes = {}
@@ -276,7 +280,7 @@
self.nodes[box] = fieldnode
if (self.first_escaping_op and
instnode.cls and
- not isinstance(instnode.cls.source, ListDescr)):
+ 1): ##not isinstance(instnode.cls.source, ListDescr)):
instnode.expanded_fields[field] = None
def find_nodes_insert(self, instnode, field, fieldnode):
@@ -303,32 +307,32 @@
self.nodes[box] = instnode
self.first_escaping_op = False
continue
- elif opname == 'newlist':
- box = op.results[0]
- instnode = InstanceNode(box, escaped=False)
- self.nodes[box] = instnode
- self.first_escaping_op = False
- if (isinstance(op.args[1], ConstInt) or
- self.nodes[op.args[1]].const):
- size = self.getsource(op.args[1]).getint()
- instnode.cursize = size
- instnode.origsize = size
- # XXX following guard_builtin will set the
- # correct class, otherwise it's a mess
- continue
- elif opname == 'guard_builtin':
- instnode = self.nodes[op.args[0]]
- # all builtins have equal classes
- instnode.cls = InstanceNode(op.args[1])
- continue
- elif opname == 'guard_len':
- instnode = self.nodes[op.args[0]]
- if instnode.cursize == -1:
- instnode = self.nodes[op.args[0]]
- size = op.args[1].getint()
- instnode.cursize = size
- instnode.origsize = size
- continue
+## elif opname == 'newlist':
+## box = op.results[0]
+## instnode = InstanceNode(box, escaped=False)
+## self.nodes[box] = instnode
+## self.first_escaping_op = False
+## if (isinstance(op.args[1], ConstInt) or
+## self.nodes[op.args[1]].const):
+## size = self.getsource(op.args[1]).getint()
+## instnode.cursize = size
+## instnode.origsize = size
+## # XXX following guard_builtin will set the
+## # correct class, otherwise it's a mess
+## continue
+## elif opname == 'guard_builtin':
+## instnode = self.nodes[op.args[0]]
+## # all builtins have equal classes
+## instnode.cls = InstanceNode(op.args[1])
+## continue
+## elif opname == 'guard_len':
+## instnode = self.nodes[op.args[0]]
+## if instnode.cursize == -1:
+## instnode = self.nodes[op.args[0]]
+## size = op.args[1].getint()
+## instnode.cursize = size
+## instnode.origsize = size
+## continue
elif opname == 'setfield_gc':
instnode = self.getnode(op.args[0])
fieldbox = op.args[1]
@@ -345,81 +349,81 @@
box = op.results[0]
self.find_nodes_getfield(instnode, field, box)
continue
- elif opname == 'getitem':
- instnode = self.getnode(op.args[1])
- fieldbox = op.args[2]
- if (isinstance(fieldbox, ConstInt) or
- self.nodes[op.args[2]].const):
- field = self.getsource(fieldbox).getint()
- if field < 0:
- field = instnode.cursize + field
- box = op.results[0]
- self.find_nodes_getfield(instnode, field, box)
- continue
- else:
- instnode.escaped = True
- self.nodes[op.results[0]] = InstanceNode(op.results[0],
- escaped=True)
- continue
- elif opname == 'append':
- instnode = self.getnode(op.args[1])
- assert isinstance(instnode.cls.source, ListDescr)
- if instnode.cursize != -1:
- field = instnode.cursize
- instnode.cursize += 1
- self.find_nodes_setfield(instnode, field,
- self.getnode(op.args[2]))
- continue
- elif opname == 'insert':
- instnode = self.getnode(op.args[1])
- assert isinstance(instnode.cls.source, ListDescr)
- if instnode.cursize != -1:
- fieldbox = self.getsource(op.args[2])
- assert isinstance(fieldbox, Const) or fieldbox.const
- field = fieldbox.getint()
- if field < 0:
- field = instnode.cursize + field
- self.find_nodes_insert(instnode, field,
- self.getnode(op.args[3]))
- continue
- elif opname == 'pop':
- instnode = self.getnode(op.args[1])
- assert isinstance(instnode.cls.source, ListDescr)
- if instnode.cursize != -1:
- instnode.cursize -= 1
- field = instnode.cursize
- self.find_nodes_getfield(instnode, field, op.results[0])
- if field in instnode.curfields:
- del instnode.curfields[field]
- continue
- self.nodes[op.results[0]] = InstanceNode(op.results[0],
- escaped=True)
- self.dependency_graph.append((instnode,
- self.nodes[op.results[0]]))
- continue
- elif opname == 'len' or opname == 'listnonzero':
- instnode = self.getnode(op.args[1])
- if not instnode.escaped:
- assert instnode.cursize != -1
- lgtbox = op.results[0].constbox()
- self.nodes[op.results[0]] = InstanceNode(lgtbox, const=True)
- continue
- elif opname == 'setitem':
- instnode = self.getnode(op.args[1])
- fieldbox = op.args[2]
- if (isinstance(fieldbox, ConstInt)
- or self.nodes[op.args[2]].const):
- field = self.getsource(fieldbox).getint()
- if field < 0:
- field = instnode.cursize + field
- assert field < instnode.cursize
- self.find_nodes_setfield(instnode, field,
- self.getnode(op.args[3]))
- continue
- else:
- self.dependency_graph.append((instnode,
- self.getnode(op.args[3])))
- instnode.escaped = True
+## elif opname == 'getitem':
+## instnode = self.getnode(op.args[1])
+## fieldbox = op.args[2]
+## if (isinstance(fieldbox, ConstInt) or
+## self.nodes[op.args[2]].const):
+## field = self.getsource(fieldbox).getint()
+## if field < 0:
+## field = instnode.cursize + field
+## box = op.results[0]
+## self.find_nodes_getfield(instnode, field, box)
+## continue
+## else:
+## instnode.escaped = True
+## self.nodes[op.results[0]] = InstanceNode(op.results[0],
+## escaped=True)
+## continue
+## elif opname == 'append':
+## instnode = self.getnode(op.args[1])
+## assert isinstance(instnode.cls.source, ListDescr)
+## if instnode.cursize != -1:
+## field = instnode.cursize
+## instnode.cursize += 1
+## self.find_nodes_setfield(instnode, field,
+## self.getnode(op.args[2]))
+## continue
+## elif opname == 'insert':
+## instnode = self.getnode(op.args[1])
+## assert isinstance(instnode.cls.source, ListDescr)
+## if instnode.cursize != -1:
+## fieldbox = self.getsource(op.args[2])
+## assert isinstance(fieldbox, Const) or fieldbox.const
+## field = fieldbox.getint()
+## if field < 0:
+## field = instnode.cursize + field
+## self.find_nodes_insert(instnode, field,
+## self.getnode(op.args[3]))
+## continue
+## elif opname == 'pop':
+## instnode = self.getnode(op.args[1])
+## assert isinstance(instnode.cls.source, ListDescr)
+## if instnode.cursize != -1:
+## instnode.cursize -= 1
+## field = instnode.cursize
+## self.find_nodes_getfield(instnode, field, op.results[0])
+## if field in instnode.curfields:
+## del instnode.curfields[field]
+## continue
+## self.nodes[op.results[0]] = InstanceNode(op.results[0],
+## escaped=True)
+## self.dependency_graph.append((instnode,
+## self.nodes[op.results[0]]))
+## continue
+## elif opname == 'len' or opname == 'listnonzero':
+## instnode = self.getnode(op.args[1])
+## if not instnode.escaped:
+## assert instnode.cursize != -1
+## lgtbox = op.results[0].constbox()
+## self.nodes[op.results[0]] = InstanceNode(lgtbox, const=True)
+## continue
+## elif opname == 'setitem':
+## instnode = self.getnode(op.args[1])
+## fieldbox = op.args[2]
+## if (isinstance(fieldbox, ConstInt)
+## or self.nodes[op.args[2]].const):
+## field = self.getsource(fieldbox).getint()
+## if field < 0:
+## field = instnode.cursize + field
+## assert field < instnode.cursize
+## self.find_nodes_setfield(instnode, field,
+## self.getnode(op.args[3]))
+## continue
+## else:
+## self.dependency_graph.append((instnode,
+## self.getnode(op.args[3])))
+## instnode.escaped = True
elif opname == 'guard_class':
instnode = self.getnode(op.args[0])
if instnode.cls is None:
@@ -529,10 +533,11 @@
rev_boxes[fieldbox] = len(liveboxes)
liveboxes.append(fieldbox)
fieldindex = ~rev_boxes[fieldbox]
- if node.cls is not None and isinstance(node.cls.source, ListDescr):
- f = node.cls.source.setfunc
- storage.setitems.append((f, index, ofs, fieldindex))
- else:
+## if node.cls is not None and isinstance(node.cls.source, ListDescr):
+## f = node.cls.source.setfunc
+## storage.setitems.append((f, index, ofs, fieldindex))
+## else:
+ if 1:
storage.setfields.append((index, ofs, fieldindex))
if not we_are_translated():
items = [box for box in liveboxes if isinstance(box, Box)]
@@ -681,13 +686,13 @@
continue
# otherwise we need this getfield, but it does not
# invalidate caches
- elif opname == 'getitem':
- instnode = self.nodes[op.args[1]]
- ofsbox = self.getsource(op.args[2])
- if isinstance(ofsbox, ConstInt):
- ofs = ofsbox.getint()
- if self.optimize_getfield(instnode, ofs, op.results[0]):
- continue
+## elif opname == 'getitem':
+## instnode = self.nodes[op.args[1]]
+## ofsbox = self.getsource(op.args[2])
+## if isinstance(ofsbox, ConstInt):
+## ofs = ofsbox.getint()
+## if self.optimize_getfield(instnode, ofs, op.results[0]):
+## continue
elif opname == 'new_with_vtable':
# self.nodes[op.results[0]] keep the value from Steps (1,2)
instnode = self.nodes[op.results[0]]
@@ -695,60 +700,60 @@
instnode.virtual = True
assert instnode.cls is not None
continue
- elif opname == 'newlist':
- instnode = self.nodes[op.results[0]]
- assert isinstance(instnode.cls.source, ListDescr)
- if not instnode.escaped:
- instnode.virtual = True
- valuesource = self.getsource(op.args[2])
- instnode.cursize = op.args[1].getint()
- curfields = {}
- for i in range(instnode.cursize):
- curfields[i] = InstanceNode(valuesource,
- const=True)
- instnode.curfields = curfields
- continue
- elif opname == 'append':
- instnode = self.nodes[op.args[1]]
- valuenode = self.getnode(op.args[2])
- if not instnode.escaped:
- ofs = instnode.cursize
- instnode.cursize += 1
- self.optimize_setfield(instnode, ofs, valuenode, op.args[2])
- continue
- elif opname == 'insert':
- instnode = self.nodes[op.args[1]]
- if not instnode.escaped:
- ofs = self.getsource(op.args[2]).getint()
- valuenode = self.nodes[op.args[3]]
- self.optimize_insert(instnode, ofs, valuenode, op.args[3])
- continue
- elif opname == 'pop':
- instnode = self.nodes[op.args[1]]
- if not instnode.escaped:
- instnode.cursize -= 1
- ofs = instnode.cursize
- if self.optimize_getfield(instnode, ofs, op.results[0]):
- del instnode.curfields[ofs]
- continue
- elif opname == 'len' or opname == 'listnonzero':
- instnode = self.nodes[op.args[1]]
- if instnode.virtual:
- continue
+## elif opname == 'newlist':
+## instnode = self.nodes[op.results[0]]
+## assert isinstance(instnode.cls.source, ListDescr)
+## if not instnode.escaped:
+## instnode.virtual = True
+## valuesource = self.getsource(op.args[2])
+## instnode.cursize = op.args[1].getint()
+## curfields = {}
+## for i in range(instnode.cursize):
+## curfields[i] = InstanceNode(valuesource,
+## const=True)
+## instnode.curfields = curfields
+## continue
+## elif opname == 'append':
+## instnode = self.nodes[op.args[1]]
+## valuenode = self.getnode(op.args[2])
+## if not instnode.escaped:
+## ofs = instnode.cursize
+## instnode.cursize += 1
+## self.optimize_setfield(instnode, ofs, valuenode, op.args[2])
+## continue
+## elif opname == 'insert':
+## instnode = self.nodes[op.args[1]]
+## if not instnode.escaped:
+## ofs = self.getsource(op.args[2]).getint()
+## valuenode = self.nodes[op.args[3]]
+## self.optimize_insert(instnode, ofs, valuenode, op.args[3])
+## continue
+## elif opname == 'pop':
+## instnode = self.nodes[op.args[1]]
+## if not instnode.escaped:
+## instnode.cursize -= 1
+## ofs = instnode.cursize
+## if self.optimize_getfield(instnode, ofs, op.results[0]):
+## del instnode.curfields[ofs]
+## continue
+## elif opname == 'len' or opname == 'listnonzero':
+## instnode = self.nodes[op.args[1]]
+## if instnode.virtual:
+## continue
elif opname == 'setfield_gc':
instnode = self.nodes[op.args[0]]
valuenode = self.nodes[op.args[2]]
ofs = op.args[1].getint()
self.optimize_setfield(instnode, ofs, valuenode, op.args[2])
continue
- elif opname == 'setitem':
- instnode = self.nodes[op.args[1]]
- valuenode = self.getnode(op.args[3])
- ofsbox = self.getsource(op.args[2])
- if isinstance(ofsbox, ConstInt):
- ofs = ofsbox.getint()
- self.optimize_setfield(instnode, ofs, valuenode, op.args[3])
- continue
+## elif opname == 'setitem':
+## instnode = self.nodes[op.args[1]]
+## valuenode = self.getnode(op.args[3])
+## ofsbox = self.getsource(op.args[2])
+## if isinstance(ofsbox, ConstInt):
+## ofs = ofsbox.getint()
+## self.optimize_setfield(instnode, ofs, valuenode, op.args[3])
+## continue
elif opname == 'ooisnull' or opname == 'oononnull':
instnode = self.nodes[op.args[0]]
if instnode.virtual:
@@ -797,12 +802,13 @@
for node in self.nodes.values():
for ofs, valuenode in node.dirtyfields.items():
# XXX move to IntanceNode eventually
- if (node.cls is not None and
- isinstance(node.cls.source, ListDescr)):
- newoperations.append(ResOperation('setitem',
- [node.cls.source.setfunc, node.source,
- ConstInt(ofs), valuenode.source], []))
- else:
+## if (node.cls is not None and
+## isinstance(node.cls.source, ListDescr)):
+## newoperations.append(ResOperation('setitem',
+## [node.cls.source.setfunc, node.source,
+## ConstInt(ofs), valuenode.source], []))
+## else:
+ if 1:
newoperations.append(ResOperation('setfield_gc',
[node.source, ConstInt(ofs), valuenode.source], []))
node.dirtyfields = {}
@@ -840,12 +846,12 @@
new_instnode = self.nodes[jump_op.args[i]]
old_specnode.adapt_to(new_instnode)
-def box_from_index(allocated_boxes, allocated_lists,
+def box_from_index(allocated_boxes, ## allocated_lists,
boxes_from_frame, index):
if index < 0:
return boxes_from_frame[~index]
- if index > 0xffff:
- return allocated_lists[(index - 1) >> 16]
+## if index > 0xffff:
+## return allocated_lists[(index - 1) >> 16]
return allocated_boxes[index]
def rebuild_boxes_from_guard_failure(guard_op, metainterp, boxes_from_frame):
@@ -861,39 +867,40 @@
[sizebox, vtablebox],
'ptr', False)
allocated_boxes.append(instbox)
- for malloc_func, lgt in storage.list_allocations:
- sizebox = ConstInt(lgt)
- [listbox] = history.execute_and_record('newlist',
- [malloc_func, sizebox],
- 'ptr', False)
- allocated_lists.append(listbox)
+## for malloc_func, lgt in storage.list_allocations:
+## sizebox = ConstInt(lgt)
+## [listbox] = history.execute_and_record('newlist',
+## [malloc_func, sizebox],
+## 'ptr', False)
+## allocated_lists.append(listbox)
for index_in_alloc, ofs, index_in_arglist in storage.setfields:
- fieldbox = box_from_index(allocated_boxes, allocated_lists,
+ fieldbox = box_from_index(allocated_boxes, ## allocated_lists,
boxes_from_frame, index_in_arglist)
- box = box_from_index(allocated_boxes, allocated_lists, boxes_from_frame,
+ box = box_from_index(allocated_boxes, ## allocated_lists,
+ boxes_from_frame,
index_in_alloc)
history.execute_and_record('setfield_gc',
[box, ConstInt(ofs), fieldbox],
'void', False)
- for setfunc, index_in_alloc, ofs, index_in_arglist in storage.setitems:
- itembox = box_from_index(allocated_boxes, allocated_lists,
- boxes_from_frame, index_in_arglist)
- box = box_from_index(allocated_boxes, allocated_lists, boxes_from_frame,
- index_in_alloc)
- history.execute_and_record('setitem',
- [setfunc, box, ConstInt(ofs), itembox],
- 'void', False)
- if storage.setitems:
- #history.execute_and_record('guard_no_exception', [], 'void', False)
- # XXX this needs to check for exceptions somehow
- # create guard_no_excpetion somehow, needs tests
- pass
+## for setfunc, index_in_alloc, ofs, index_in_arglist in storage.setitems:
+## itembox = box_from_index(allocated_boxes, allocated_lists,
+## boxes_from_frame, index_in_arglist)
+## box = box_from_index(allocated_boxes, allocated_lists, boxes_from_frame,
+## index_in_alloc)
+## history.execute_and_record('setitem',
+## [setfunc, box, ConstInt(ofs), itembox],
+## 'void', False)
+## if storage.setitems:
+## #history.execute_and_record('guard_no_exception', [], 'void', False)
+## # XXX this needs to check for exceptions somehow
+## # create guard_no_excpetion somehow, needs tests
+## pass
newboxes = []
for index in storage.indices:
if index < 0:
newboxes.append(boxes_from_frame[~index])
- elif index > 0xffff:
- newboxes.append(allocated_lists[(index - 1) >> 16])
+## elif index > 0xffff:
+## newboxes.append(allocated_lists[(index - 1) >> 16])
else:
newboxes.append(allocated_boxes[index])
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 Tue Feb 24 14:29:31 2009
@@ -8,7 +8,7 @@
from pypy.jit.metainterp import history, support
from pypy.jit.metainterp.history import (Const, ConstInt, ConstPtr, Box,
- BoxInt, BoxPtr, GuardOp)
+ BoxInt, BoxPtr, GuardOp, Options)
from pypy.jit.metainterp.compile import compile_new_loop, compile_new_bridge
from pypy.jit.metainterp.heaptracker import (get_vtable_for_gcstruct,
populate_type_cache)
@@ -1006,10 +1006,3 @@
class GenerateMergePoint(Exception):
def __init__(self, args):
self.argboxes = args
-
-
-class Options:
- def __init__(self, specialize=True):
- self.specialize = specialize
- def _freeze_(self):
- return True
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/specnode.py Tue Feb 24 14:29:31 2009
@@ -26,6 +26,7 @@
return True
class SpecNodeWithBox(NotSpecNode):
+ # XXX what is this class used for?
def __init__(self, box):
self.box = box
@@ -58,14 +59,14 @@
return False
return instnode.cls.source.equals(self.known_class)
-class FixedListSpecNode(FixedClassSpecNode):
+##class FixedListSpecNode(FixedClassSpecNode):
- def equals(self, other):
- if type(other) is not FixedListSpecNode:
- return False
- else:
- assert isinstance(other, FixedListSpecNode) # make annotator happy
- return self.known_class.equals(other.known_class)
+## def equals(self, other):
+## if type(other) is not FixedListSpecNode:
+## return False
+## else:
+## assert isinstance(other, FixedListSpecNode) # make annotator happy
+## return self.known_class.equals(other.known_class)
class SpecNodeWithFields(FixedClassSpecNode):
def __init__(self, known_class, fields):
@@ -160,40 +161,40 @@
[instnode.source, ConstInt(ofs)], [box]))
newboxlist.append(box)
-class DelayedListSpecNode(DelayedSpecNode):
+##class DelayedListSpecNode(DelayedSpecNode):
- def expand_boxlist(self, instnode, newboxlist, oplist):
- from pypy.jit.metainterp.history import ResOperation, ConstInt
- from pypy.jit.metainterp.codewriter import ListDescr
+## def expand_boxlist(self, instnode, newboxlist, oplist):
+## from pypy.jit.metainterp.history import ResOperation, ConstInt
+## from pypy.jit.metainterp.codewriter import ListDescr
- newboxlist.append(instnode.source)
- for ofs, subspecnode in self.fields:
- assert isinstance(subspecnode, SpecNodeWithBox)
- if oplist is None:
- instnode.cleanfields[ofs] = instnode.origfields[ofs]
- newboxlist.append(instnode.curfields[ofs].source)
- else:
- if ofs in instnode.cleanfields:
- newboxlist.append(instnode.cleanfields[ofs].source)
- else:
- ld = instnode.cls.source
- assert isinstance(ld, ListDescr)
- box = subspecnode.box.clonebox()
- oplist.append(ResOperation('getitem',
- [ld.getfunc, instnode.source, ConstInt(ofs)], [box]))
- newboxlist.append(box)
-
- def extract_runtime_data(self, cpu, valuebox, resultlist):
- from pypy.jit.metainterp.codewriter import ListDescr
-
- resultlist.append(valuebox)
- ld = self.known_class
- assert isinstance(ld, ListDescr)
- for ofs, subspecnode in self.fields:
- fieldbox = cpu.execute_operation('getitem',
- [ld.getfunc, valuebox, ConstInt(ofs)],
- ld.tp)
- subspecnode.extract_runtime_data(cpu, fieldbox, resultlist)
+## newboxlist.append(instnode.source)
+## for ofs, subspecnode in self.fields:
+## assert isinstance(subspecnode, SpecNodeWithBox)
+## if oplist is None:
+## instnode.cleanfields[ofs] = instnode.origfields[ofs]
+## newboxlist.append(instnode.curfields[ofs].source)
+## else:
+## if ofs in instnode.cleanfields:
+## newboxlist.append(instnode.cleanfields[ofs].source)
+## else:
+## ld = instnode.cls.source
+## assert isinstance(ld, ListDescr)
+## box = subspecnode.box.clonebox()
+## oplist.append(ResOperation('getitem',
+## [ld.getfunc, instnode.source, ConstInt(ofs)], [box]))
+## newboxlist.append(box)
+
+## def extract_runtime_data(self, cpu, valuebox, resultlist):
+## from pypy.jit.metainterp.codewriter import ListDescr
+
+## resultlist.append(valuebox)
+## ld = self.known_class
+## assert isinstance(ld, ListDescr)
+## for ofs, subspecnode in self.fields:
+## fieldbox = cpu.execute_operation('getitem',
+## [ld.getfunc, valuebox, ConstInt(ofs)],
+## ld.tp)
+## subspecnode.extract_runtime_data(cpu, fieldbox, resultlist)
class VirtualizableSpecNode(VirtualizedSpecNode):
@@ -215,28 +216,28 @@
return False
return SpecNodeWithFields.equals(self, other)
-class VirtualListSpecNode(VirtualSpecNode):
-
- def __init__(self, known_class, fields, known_length):
- VirtualSpecNode.__init__(self, known_class, fields)
- self.known_length = known_length
+##class VirtualListSpecNode(VirtualSpecNode):
- def mutate_nodes(self, instnode):
- VirtualSpecNode.mutate_nodes(self, instnode)
- instnode.known_length = self.known_length
-
- def equals(self, other):
- if not isinstance(other, VirtualListSpecNode):
- return False
- return SpecNodeWithFields.equals(self, other)
+## def __init__(self, known_class, fields, known_length):
+## VirtualSpecNode.__init__(self, known_class, fields)
+## self.known_length = known_length
+
+## def mutate_nodes(self, instnode):
+## VirtualSpecNode.mutate_nodes(self, instnode)
+## instnode.known_length = self.known_length
+
+## def equals(self, other):
+## if not isinstance(other, VirtualListSpecNode):
+## return False
+## return SpecNodeWithFields.equals(self, other)
- def extract_runtime_data(self, cpu, valuebox, resultlist):
- from pypy.jit.metainterp.codewriter import ListDescr
+## def extract_runtime_data(self, cpu, valuebox, resultlist):
+## from pypy.jit.metainterp.codewriter import ListDescr
- for ofs, subspecnode in self.fields:
- cls = self.known_class
- assert isinstance(cls, ListDescr)
- fieldbox = cpu.execute_operation('getitem',
- [cls.getfunc, valuebox, ConstInt(ofs)],
- cls.tp)
- subspecnode.extract_runtime_data(cpu, fieldbox, resultlist)
+## for ofs, subspecnode in self.fields:
+## cls = self.known_class
+## assert isinstance(cls, ListDescr)
+## fieldbox = cpu.execute_operation('getitem',
+## [cls.getfunc, valuebox, ConstInt(ofs)],
+## cls.tp)
+## subspecnode.extract_runtime_data(cpu, fieldbox, resultlist)
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_tl.py Tue Feb 24 14:29:31 2009
@@ -94,15 +94,17 @@
def test_tl_base(self):
res = self.meta_interp(self.main.im_func, [0, 6])
+ assert res == 5040
+ py.test.skip("re-enable list optimizations")
self.check_loops({'merge_point':1,
'int_mul':1, 'jump':1,
'int_sub':1, 'int_is_true':1, 'int_le':1,
'guard_false':1})
- assert res == 5040
def test_tl_2(self):
res = self.meta_interp(self.main.im_func, [1, 10])
assert res == self.main.im_func(1, 10)
+ py.test.skip("re-enable list optimizations")
self.check_loops({'merge_point':1, 'int_sub':1, 'int_le':1,
'int_is_true':1, 'guard_false':1, 'jump':1})
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 Tue Feb 24 14:29:31 2009
@@ -14,7 +14,7 @@
from pypy.jit.metainterp.virtualizable import VirtualizableDesc
from pypy.jit.metainterp.test.test_optimize import (cpu, NODE, node_vtable,
equaloplists, Loop)
-from pypy.jit.metainterp.codewriter import ListDescr
+#from pypy.jit.metainterp.codewriter import ListDescr
# ____________________________________________________________
@@ -201,7 +201,8 @@
# ____________________________________________________________
-class D:
+if 0:
+ class D:
class SomeDescr(ListDescr):
def __init__(self):
pass
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vlist.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vlist.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vlist.py Tue Feb 24 14:29:31 2009
@@ -1,4 +1,6 @@
import py
+py.test.skip("re-enable list optimizations")
+
from pypy.rlib.jit import JitDriver, hint
from pypy.jit.metainterp.policy import StopAtXPolicy
from pypy.rpython.ootypesystem import ootype
More information about the Pypy-commit
mailing list