[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