[pypy-svn] r67141 - in pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp: . test
antocuni at codespeak.net
antocuni at codespeak.net
Mon Aug 24 10:50:05 CEST 2009
Author: antocuni
Date: Mon Aug 24 10:50:02 2009
New Revision: 67141
Modified:
pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/optimizefindnode.py
pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/optimizeopt.py
pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/specnode.py
pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/test/test_optimizefindnode.py
pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/test/test_optimizeopt.py
Log:
(iko, antocuni) merge again r67120 and r67122, which add ConstantSpecNode
Modified: pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/optimizefindnode.py
==============================================================================
--- pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/optimizefindnode.py (original)
+++ pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/optimizefindnode.py Mon Aug 24 10:50:02 2009
@@ -1,9 +1,10 @@
from pypy.jit.metainterp.specnode import SpecNode
from pypy.jit.metainterp.specnode import NotSpecNode, prebuiltNotSpecNode
+from pypy.jit.metainterp.specnode import ConstantSpecNode
from pypy.jit.metainterp.specnode import VirtualInstanceSpecNode
from pypy.jit.metainterp.specnode import VirtualArraySpecNode
from pypy.jit.metainterp.specnode import VirtualStructSpecNode
-from pypy.jit.metainterp.history import AbstractValue, ConstInt
+from pypy.jit.metainterp.history import AbstractValue, ConstInt, Const
from pypy.jit.metainterp.resoperation import rop
from pypy.jit.metainterp.optimizeutil import av_newdict, _findall, sort_descrs
@@ -29,6 +30,8 @@
origfields = None # optimization; equivalent to an empty dict
curfields = None # optimization; equivalent to an empty dict
+ knownvaluebox = None # Used to store value of this box if constant
+
# fields used to store the shape of the potential VirtualList
arraydescr = None # set only on freshly-allocated or fromstart arrays
#arraysize = .. # valid if and only if arraydescr is not None
@@ -106,6 +109,12 @@
self.nodes = {} # Box -> InstanceNode
def getnode(self, box):
+ if isinstance(box, Const):
+ node = InstanceNode()
+ node.unique = UNIQUE_NO
+ node.knownvaluebox = box
+ self.nodes[box] = node
+ return node
return self.nodes.get(box, self.node_escaped)
def find_nodes(self, operations):
@@ -157,6 +166,10 @@
if instnode.fromstart: # only useful in this case
instnode.knownclsbox = op.args[1]
+ def find_nodes_GUARD_VALUE(self, op):
+ instnode = self.getnode(op.args[0])
+ instnode.knownvaluebox = op.args[1]
+
def find_nodes_SETFIELD_GC(self, op):
instnode = self.getnode(op.args[0])
fieldnode = self.getnode(op.args[1])
@@ -282,6 +295,9 @@
assert inputnode.fromstart
if inputnode.escaped:
return prebuiltNotSpecNode
+ if inputnode.knownvaluebox is not None and \
+ inputnode.knownvaluebox == exitnode.knownvaluebox:
+ return ConstantSpecNode(inputnode.knownvaluebox)
unique = exitnode.unique
if unique == UNIQUE_NO:
return prebuiltNotSpecNode
Modified: pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/optimizeopt.py
==============================================================================
--- pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/optimizeopt.py (original)
+++ pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/optimizeopt.py Mon Aug 24 10:50:02 2009
@@ -1,7 +1,7 @@
from pypy.jit.metainterp.history import Box, BoxInt, BoxPtr, BoxObj
from pypy.jit.metainterp.history import Const, ConstInt, ConstPtr, ConstObj, PTR, OBJ
from pypy.jit.metainterp.resoperation import rop, ResOperation
-from pypy.jit.metainterp.specnode import SpecNode
+from pypy.jit.metainterp.specnode import SpecNode, ConstantSpecNode
from pypy.jit.metainterp.specnode import AbstractVirtualStructSpecNode
from pypy.jit.metainterp.specnode import VirtualInstanceSpecNode
from pypy.jit.metainterp.specnode import VirtualArraySpecNode
@@ -18,7 +18,7 @@
if not.
"""
optimizer = Optimizer(cpu, loop)
- optimizer.setup_virtuals()
+ optimizer.setup_virtuals_and_constants()
optimizer.propagate_forward()
def optimize_bridge_1(cpu, bridge):
@@ -295,9 +295,15 @@
class __extend__(SpecNode):
def setup_virtual_node(self, optimizer, box, newinputargs):
newinputargs.append(box)
+ def setup_constant_node(self, optimizer, box):
+ pass
def teardown_virtual_node(self, optimizer, value, newexitargs):
newexitargs.append(value.force_box())
+class __extend__(ConstantSpecNode):
+ def setup_constant_node(self, optimizer, box):
+ optimizer.make_constant(box)
+
class __extend__(AbstractVirtualStructSpecNode):
def setup_virtual_node(self, optimizer, box, newinputargs):
vvalue = self._setup_virtual_node_1(optimizer, box)
@@ -456,13 +462,14 @@
# ----------
- def setup_virtuals(self):
+ def setup_virtuals_and_constants(self):
inputargs = self.loop.inputargs
specnodes = self.loop.specnodes
assert len(inputargs) == len(specnodes)
newinputargs = []
for i in range(len(inputargs)):
specnodes[i].setup_virtual_node(self, inputargs[i], newinputargs)
+ specnodes[i].setup_constant_node(self, inputargs[i])
self.loop.inputargs = newinputargs
# ----------
Modified: pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/specnode.py
==============================================================================
--- pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/specnode.py (original)
+++ pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/specnode.py Mon Aug 24 10:50:02 2009
@@ -19,6 +19,14 @@
prebuiltNotSpecNode = NotSpecNode()
+class ConstantSpecNode(SpecNode):
+ def __init__(self, constbox):
+ self.constbox = constbox
+
+ def equals(self, other):
+ return isinstance(other, ConstantSpecNode) and \
+ self.constbox == other.constbox
+
class AbstractVirtualStructSpecNode(SpecNode):
def __init__(self, fields):
self.fields = fields # list: [(fieldofs, subspecnode)]
Modified: pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/test/test_optimizefindnode.py
==============================================================================
--- pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/test/test_optimizefindnode.py (original)
+++ pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/test/test_optimizefindnode.py Mon Aug 24 10:50:02 2009
@@ -15,6 +15,7 @@
from pypy.jit.metainterp.specnode import VirtualInstanceSpecNode
from pypy.jit.metainterp.specnode import VirtualArraySpecNode
from pypy.jit.metainterp.specnode import VirtualStructSpecNode
+from pypy.jit.metainterp.specnode import ConstantSpecNode
from pypy.jit.metainterp.test.oparser import parse
@@ -130,12 +131,22 @@
self.cpu)
else:
return ConstObj(ootype.cast_to_object(cls_vtable))
+ def constant(value):
+ if isinstance(lltype.typeOf(value), lltype.Ptr):
+ return ConstPtr(value)
+ elif isinstance(ootype.typeOf(value), ootype.OOType):
+ return ConstObj(ootype.cast_to_object(value))
+ else:
+ return ConstInt(value)
+
def parsefields(kwds_fields):
fields = []
for key, value in kwds_fields.items():
fields.append((self.namespace[key], value))
fields.sort(key = lambda (x, _): x.sort_key())
return fields
+ def makeConstant(value):
+ return ConstantSpecNode(constant(value))
def makeVirtual(cls_vtable, **kwds_fields):
fields = parsefields(kwds_fields)
return VirtualInstanceSpecNode(constclass(cls_vtable), fields)
@@ -146,6 +157,7 @@
return VirtualStructSpecNode(typedescr, fields)
#
context = {'Not': prebuiltNotSpecNode,
+ 'Constant': makeConstant,
'Virtual': makeVirtual,
'VArray': makeVirtualArray,
'VStruct': makeVirtualStruct}
@@ -467,7 +479,7 @@
"""
# The answer must contain the 'value' field, because otherwise
# we might get incorrect results: when tracing, maybe i0 was not 0.
- self.find_nodes(ops, 'Virtual(node_vtable, valuedescr=Not)')
+ self.find_nodes(ops, 'Virtual(node_vtable, valuedescr=Constant(0))')
def test_find_nodes_nonvirtual_guard_class(self):
ops = """
@@ -633,6 +645,19 @@
"""
self.find_nodes(ops, 'Not, Not')
+ def test_find_nodes_guard_value_constant(self):
+ ops = """
+ [p1]
+ guard_value(p1, ConstPtr(myptr))
+ fail()
+ jump(ConstPtr(myptr))
+ """
+ expected = """
+ [p1]
+ jump(p1)
+ """
+ self.find_nodes(ops, 'Constant(myptr)')
+
# ------------------------------
# Bridge tests
Modified: pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/test/test_optimizeopt.py (original)
+++ pypy/branch/pyjitpl5-constspecnode/pypy/jit/metainterp/test/test_optimizeopt.py Mon Aug 24 10:50:02 2009
@@ -223,6 +223,19 @@
"""
self.optimize_loop(ops, 'Not', expected, i0=0, i1=1, i2=3)
+ def test_remove_guard_value_if_constant(self):
+ ops = """
+ [p1]
+ guard_value(p1, ConstPtr(myptr))
+ fail()
+ jump(ConstPtr(myptr))
+ """
+ expected = """
+ [p1]
+ jump(ConstPtr(myptr))
+ """
+ self.optimize_loop(ops, 'Constant(myptr)', expected, p1=self.nodebox.value)
+
def test_ooisnull_oononnull_1(self):
ops = """
[p0]
@@ -1034,14 +1047,12 @@
"""
expected = """
[p1]
- guard_value(p1, ConstPtr(myptr))
- fail()
i1 = getfield_gc(ConstPtr(myptr), descr=valuedescr)
escape(i1)
escape(i1)
jump(ConstPtr(myptr))
"""
- self.optimize_loop(ops, 'Not', expected, p1=self.nodebox.value)
+ self.optimize_loop(ops, 'Constant(myptr)', expected, p1=self.nodebox.value)
def test_duplicate_getfield_sideeffects_1(self):
ops = """
More information about the Pypy-commit
mailing list