[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