[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