[pypy-svn] r66308 - in pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Fri Jul 17 17:07:24 CEST 2009
Author: arigo
Date: Fri Jul 17 17:07:23 2009
New Revision: 66308
Modified:
pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/optimize.py
pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/test/test_optimize.py
Log:
VirtualInstanceSpecNode.
Modified: pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/optimize.py
==============================================================================
--- pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/optimize.py (original)
+++ pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/optimize.py Fri Jul 17 17:07:23 2009
@@ -1,6 +1,9 @@
from pypy.rlib.objectmodel import r_dict
from pypy.rlib.unroll import unrolling_iterable
-from pypy.jit.metainterp import resoperation, specnode
+from pypy.jit.metainterp import resoperation
+from pypy.jit.metainterp.specnode import prebuiltNotSpecNode
+from pypy.jit.metainterp.specnode import FixedClassSpecNode
+from pypy.jit.metainterp.specnode import VirtualInstanceSpecNode
from pypy.jit.metainterp.history import AbstractValue
@@ -157,16 +160,55 @@
def intersect(self, inputnode, exitbox):
assert inputnode.fromstart
exitnode = self.getnode(exitbox)
+ if exitnode.knownclsbox is None:
+ return prebuiltNotSpecNode # no known class at exit
+ if (inputnode.knownclsbox is not None and
+ not inputnode.knownclsbox.equals(exitnode.knownclsbox)):
+ return prebuiltNotSpecNode # mismatched known class at exit
+ #
+ # for the sequel, we know that the class is known and matches
if inputnode.escaped or exitnode.escaped or exitnode.fromstart:
- if (inputnode.knownclsbox is not None and
- exitnode.knownclsbox is not None and
- inputnode.knownclsbox.equals(exitnode.knownclsbox)):
- return specnode.FixedClassSpecNode(inputnode.knownclsbox)
- else:
- return specnode.prebuiltNotSpecNode
+ if inputnode.knownclsbox is None:
+ return prebuiltNotSpecNode # class not needed at input
+ return FixedClassSpecNode(exitnode.knownclsbox)
else:
- xxx #...
+ fields = []
+ d = exitnode.curfields
+ lst = d.keys()
+ sort_descrs(lst)
+ for ofs in lst:
+ if ofs not in inputnode.origfields:
+ # field stored at exit, but not read at input. Must
+ # still be allocated, otherwise it will be incorrectly
+ # uninitialized after a guard failure.
+ inputnode.origfields[ofs] = InstanceNode(escaped=False,
+ fromstart=True)
+ specnode = self.intersect(inputnode.origfields[ofs], d[ofs])
+ fields.append((ofs, specnode))
+ return VirtualInstanceSpecNode(exitnode.knownclsbox, fields)
find_nodes_ops = _findall(PerfectSpecializationFinder, 'find_nodes_')
# ____________________________________________________________
+
+def partition(array, left, right):
+ last_item = array[right]
+ pivot = last_item.sort_key()
+ storeindex = left
+ for i in range(left, right):
+ if array[i].sort_key() <= pivot:
+ array[i], array[storeindex] = array[storeindex], array[i]
+ storeindex += 1
+ # Move pivot to its final place
+ array[storeindex], array[right] = last_item, array[storeindex]
+ return storeindex
+
+def quicksort(array, left, right):
+ # sort array[left:right+1] (i.e. bounds included)
+ if right > left:
+ pivotnewindex = partition(array, left, right)
+ quicksort(array, left, pivotnewindex - 1)
+ quicksort(array, pivotnewindex + 1, right)
+
+def sort_descrs(lst):
+ quicksort(lst, 0, len(lst)-1)
Modified: pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/test/test_optimize.py
==============================================================================
--- pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/test/test_optimize.py (original)
+++ pypy/branch/pyjitpl5-optimize4/pypy/jit/metainterp/test/test_optimize.py Fri Jul 17 17:07:23 2009
@@ -1,4 +1,4 @@
-import py
+import py, random
from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.rpython.ootypesystem import ootype
@@ -6,8 +6,10 @@
from pypy.jit.backend.llgraph import runner
from pypy.jit.metainterp.history import (BoxInt, BoxPtr, ConstInt, ConstPtr,
- Const, ConstAddr, TreeLoop, BoxObj)
+ Const, ConstAddr, TreeLoop, BoxObj,
+ AbstractDescr)
from pypy.jit.metainterp.optimize import PerfectSpecializationFinder
+from pypy.jit.metainterp.optimize import sort_descrs
from pypy.jit.metainterp.specnode import NotSpecNode, FixedClassSpecNode
from pypy.jit.metainterp.specnode import VirtualInstanceSpecNode
from pypy.jit.metainterp.test.oparser import parse
@@ -51,6 +53,18 @@
py.test.raises(AssertionError,
"equaloplists(loop1.operations, loop3.operations)")
+def test_sort_descrs():
+ class PseudoDescr(AbstractDescr):
+ def __init__(self, n):
+ self.n = n
+ def sort_key(self):
+ return self.n
+ lst = [PseudoDescr(2), PseudoDescr(3), PseudoDescr(6)]
+ lst2 = lst[:]
+ random.shuffle(lst2)
+ sort_descrs(lst2)
+ assert lst2 == lst
+
# ____________________________________________________________
class LLtypeMixin(object):
@@ -277,7 +291,6 @@
assert [sn.__class__ for sn in specnodes] == [NotSpecNode]
def test_find_nodes_new(self):
- py.test.skip("VirtualInstanceSpecNode in-progress")
ops = """
[sum, p1]
guard_class(p1, ConstClass(node_vtable))
More information about the Pypy-commit
mailing list