[pypy-svn] r67728 - in pypy/branch/optimize-novaluedep/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Thu Sep 17 11:50:09 CEST 2009
Author: arigo
Date: Thu Sep 17 11:50:07 2009
New Revision: 67728
Modified:
pypy/branch/optimize-novaluedep/pypy/jit/metainterp/optimizefindnode.py
pypy/branch/optimize-novaluedep/pypy/jit/metainterp/specnode.py
pypy/branch/optimize-novaluedep/pypy/jit/metainterp/test/test_optimizefindnode.py
Log:
(cfbolz, arigo)
Fix optimizefindnode.py to no longer rely on the .value of Boxes.
Modified: pypy/branch/optimize-novaluedep/pypy/jit/metainterp/optimizefindnode.py
==============================================================================
--- pypy/branch/optimize-novaluedep/pypy/jit/metainterp/optimizefindnode.py (original)
+++ pypy/branch/optimize-novaluedep/pypy/jit/metainterp/optimizefindnode.py Thu Sep 17 11:50:07 2009
@@ -6,6 +6,7 @@
from pypy.jit.metainterp.specnode import VirtualStructSpecNode
from pypy.jit.metainterp.history import AbstractValue, ConstInt, Const
from pypy.jit.metainterp.resoperation import rop
+from pypy.jit.metainterp.executor import _execute_nonspec
from pypy.jit.metainterp.optimizeutil import av_newdict, _findall, sort_descrs
# ____________________________________________________________
@@ -30,7 +31,7 @@
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
+ knownvaluebox = None # a Const with the 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
@@ -112,30 +113,32 @@
node_escaped.unique = UNIQUE_NO
node_escaped.escaped = True
- def __init__(self):
+ def __init__(self, cpu):
+ self.cpu = cpu
self.nodes = {} # Box -> InstanceNode
def getnode(self, box):
if isinstance(box, Const):
- return self.set_constant_node(box)
+ return self.set_constant_node(box, box)
return self.nodes.get(box, self.node_escaped)
- def set_constant_node(self, box):
+ def set_constant_node(self, box, constbox):
+ assert isinstance(constbox, Const)
node = InstanceNode()
node.unique = UNIQUE_NO
- node.knownvaluebox = box
+ node.knownvaluebox = constbox
self.nodes[box] = node
return node
- def is_constant_box(self, box):
+ def get_constant_box(self, box):
if isinstance(box, Const):
- return True
+ return box
try:
node = self.nodes[box]
except KeyError:
- return False
+ return None
else:
- return node.is_constant()
+ return node.knownvaluebox
def find_nodes(self, operations):
for op in operations:
@@ -150,11 +153,13 @@
def find_nodes_default(self, op):
if op.is_always_pure():
for arg in op.args:
- node = self.getnode(arg)
- if not node.is_constant():
+ if self.get_constant_box(arg) is None:
break
else:
- self.set_constant_node(op.result)
+ # all constant arguments: we can constant-fold
+ argboxes = [self.get_constant_box(arg) for arg in op.args]
+ resbox = _execute_nonspec(self.cpu, op.opnum, argboxes, op.descr)
+ self.set_constant_node(op.result, resbox.constbox())
# default case: mark the arguments as escaping
for box in op.args:
self.getnode(box).mark_escaped()
@@ -170,7 +175,9 @@
def find_nodes_NEW_WITH_VTABLE(self, op):
instnode = InstanceNode()
- instnode.knownclsbox = op.args[0]
+ box = op.args[0]
+ assert isinstance(box, Const)
+ instnode.knownclsbox = box
self.nodes[op.result] = instnode
def find_nodes_NEW(self, op):
@@ -180,7 +187,8 @@
def find_nodes_NEW_ARRAY(self, op):
lengthbox = op.args[0]
- if not self.is_constant_box(lengthbox):
+ lengthbox = self.get_constant_box(lengthbox)
+ if lengthbox is None:
return # var-sized arrays are not virtual
arraynode = InstanceNode()
arraynode.arraysize = lengthbox.getint()
@@ -190,18 +198,22 @@
def find_nodes_ARRAYLEN_GC(self, op):
arraynode = self.getnode(op.args[0])
if arraynode.arraydescr is not None:
- assert op.result.getint() == arraynode.arraysize
- self.set_constant_node(op.result)
+ resbox = ConstInt(arraynode.arraysize)
+ self.set_constant_node(op.result, resbox)
def find_nodes_GUARD_CLASS(self, op):
instnode = self.getnode(op.args[0])
if instnode.fromstart: # only useful (and safe) in this case
- instnode.knownclsbox = op.args[1]
+ box = op.args[1]
+ assert isinstance(box, Const)
+ instnode.knownclsbox = box
def find_nodes_GUARD_VALUE(self, op):
instnode = self.getnode(op.args[0])
if instnode.fromstart: # only useful (and safe) in this case
- instnode.knownvaluebox = op.args[1]
+ box = op.args[1]
+ assert isinstance(box, Const)
+ instnode.knownvaluebox = box
def find_nodes_SETFIELD_GC(self, op):
instnode = self.getnode(op.args[0])
@@ -240,7 +252,8 @@
def find_nodes_SETARRAYITEM_GC(self, op):
indexbox = op.args[1]
- if not self.is_constant_box(indexbox):
+ indexbox = self.get_constant_box(indexbox)
+ if indexbox is None:
self.find_nodes_default(op) # not a Const index
return
arraynode = self.getnode(op.args[0])
@@ -255,7 +268,8 @@
def find_nodes_GETARRAYITEM_GC(self, op):
indexbox = op.args[1]
- if not self.is_constant_box(indexbox):
+ indexbox = self.get_constant_box(indexbox)
+ if indexbox is None:
self.find_nodes_default(op) # not a Const index
return
arraynode = self.getnode(op.args[0])
@@ -328,7 +342,7 @@
assert inputnode.fromstart
if inputnode.is_constant() and \
exitnode.is_constant() and \
- inputnode.knownvaluebox.equals(exitnode.knownvaluebox):
+ inputnode.knownvaluebox.same_constant(exitnode.knownvaluebox):
return ConstantSpecNode(inputnode.knownvaluebox)
if inputnode.escaped:
return prebuiltNotSpecNode
@@ -371,7 +385,7 @@
def intersect_instance(self, inputnode, exitnode):
if (inputnode.knownclsbox is not None and
- not inputnode.knownclsbox.equals(exitnode.knownclsbox)):
+ not inputnode.knownclsbox.same_constant(exitnode.knownclsbox)):
# unique match, but the class is known to be a mismatch
return prebuiltNotSpecNode
#
@@ -424,7 +438,7 @@
def matches_instance_node(self, exitnode):
if exitnode.knownvaluebox is None:
return False
- return self.constbox.equals(exitnode.knownvaluebox)
+ return self.constbox.same_constant(exitnode.knownvaluebox)
class __extend__(VirtualInstanceSpecNode):
def make_instance_node(self):
@@ -440,7 +454,7 @@
return False
#
assert exitnode.unique == UNIQUE_INST
- if not self.known_class.equals(exitnode.knownclsbox):
+ if not self.known_class.same_constant(exitnode.knownclsbox):
# unique match, but the class is known to be a mismatch
return False
#
Modified: pypy/branch/optimize-novaluedep/pypy/jit/metainterp/specnode.py
==============================================================================
--- pypy/branch/optimize-novaluedep/pypy/jit/metainterp/specnode.py (original)
+++ pypy/branch/optimize-novaluedep/pypy/jit/metainterp/specnode.py Thu Sep 17 11:50:07 2009
@@ -1,4 +1,5 @@
from pypy.tool.pairtype import extendabletype
+from pypy.jit.metainterp.history import Const
class SpecNode(object):
Modified: pypy/branch/optimize-novaluedep/pypy/jit/metainterp/test/test_optimizefindnode.py
==============================================================================
--- pypy/branch/optimize-novaluedep/pypy/jit/metainterp/test/test_optimizefindnode.py (original)
+++ pypy/branch/optimize-novaluedep/pypy/jit/metainterp/test/test_optimizefindnode.py Thu Sep 17 11:50:07 2009
@@ -217,11 +217,10 @@
class BaseTestOptimizeFindNode(BaseTest):
- def find_nodes(self, ops, spectext, boxkinds=None, **values):
+ def find_nodes(self, ops, spectext, boxkinds=None):
assert boxkinds is None or isinstance(boxkinds, dict)
loop = self.parse(ops, boxkinds=boxkinds)
- loop.setvalues(**values)
- perfect_specialization_finder = PerfectSpecializationFinder()
+ perfect_specialization_finder = PerfectSpecializationFinder(self.cpu)
perfect_specialization_finder.find_nodes_loop(loop)
self.check_specnodes(loop.specnodes, spectext)
return (loop.getboxes(), perfect_specialization_finder.getnode)
@@ -740,7 +739,7 @@
p2 = same_as(ConstPtr(myptr))
jump(p2)
"""
- self.find_nodes(ops, 'Constant(myptr)', p2=self.myptr)
+ self.find_nodes(ops, 'Constant(myptr)')
def test_find_nodes_store_into_loop_constant_1(self):
ops = """
@@ -781,7 +780,7 @@
setarrayitem_gc(p2, 0, i3, descr=arraydescr)
jump(p2)
"""
- self.find_nodes(ops, 'VArray(arraydescr, Not)', i2=1)
+ self.find_nodes(ops, 'VArray(arraydescr, Not)')
def test_find_nodes_arithmetic_propagation_bug_1(self):
ops = """
@@ -793,7 +792,7 @@
setarrayitem_gc(p2, 0, 5)
jump(p2)
"""
- self.find_nodes(ops, 'VArray(arraydescr, Not)', i2=1)
+ self.find_nodes(ops, 'VArray(arraydescr, Not)')
def test_find_nodes_arithmetic_propagation_bug_2(self):
ops = """
@@ -807,7 +806,7 @@
setarrayitem_gc(p2, i0, i3, descr=arraydescr)
jump(p2)
"""
- self.find_nodes(ops, 'VArray(arraydescr, Not)', i2=1, i0=0)
+ self.find_nodes(ops, 'VArray(arraydescr, Not)')
def test_find_nodes_arithmetic_propagation_bug_3(self):
ops = """
@@ -821,7 +820,7 @@
setarrayitem_gc(p2, 0, i3, descr=arraydescr)
jump(p2)
"""
- self.find_nodes(ops, 'VArray(arraydescr, Not)', i2=1)
+ self.find_nodes(ops, 'VArray(arraydescr, Not)')
def test_find_nodes_bug_1(self):
ops = """
@@ -888,9 +887,7 @@
fail()
jump(p58)
"""
- self.find_nodes(ops, 'Virtual(node_vtable, valuedescr=Not)',
- i16=0, i25=0, i39=0, i52=0, i55=0, i59=0,
- i43=1, i45=1, i48=1, i40=1)
+ self.find_nodes(ops, 'Virtual(node_vtable, valuedescr=Not)')
def test_bug_2(self):
py.test.skip("fix me")
@@ -909,13 +906,12 @@
# Bridge tests
def find_bridge(self, ops, inputspectext, outputspectext, boxkinds=None,
- mismatch=False, **values):
+ mismatch=False):
assert boxkinds is None or isinstance(boxkinds, dict)
inputspecnodes = self.unpack_specnodes(inputspectext)
outputspecnodes = self.unpack_specnodes(outputspectext)
bridge = self.parse(ops, boxkinds=boxkinds)
- bridge.setvalues(**values)
- bridge_specialization_finder = BridgeSpecializationFinder()
+ bridge_specialization_finder = BridgeSpecializationFinder(self.cpu)
bridge_specialization_finder.find_nodes_bridge(bridge, inputspecnodes)
matches = bridge_specialization_finder.bridge_matches(outputspecnodes)
if mismatch:
More information about the Pypy-commit
mailing list