[pypy-svn] r65604 - in pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp: . test

antocuni at codespeak.net antocuni at codespeak.net
Fri Jun 5 23:52:27 CEST 2009


Author: antocuni
Date: Fri Jun  5 23:52:24 2009
New Revision: 65604

Modified:
   pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/optimize3.py
   pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_optimize3.py
Log:
a bit of refactoring. Split Specializer into two classes:

  - LoopSpecializer, whose goal is to do perfect specialization (well, it doesn't so far :-))

  - LoopOptimizer, whose goal is to rewrite loop.operations to be more
    efficient, after the specializer has done its work



Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/optimize3.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/optimize3.py	(original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/optimize3.py	Fri Jun  5 23:52:24 2009
@@ -22,13 +22,18 @@
         #if self.virtualized:       flags += 'V'
         return "<InstanceNode %s (%s)>" % (self.source, flags)
 
-class Specializer(object):
-    loop = None
-    nodes = None
-    fixedops = None
+
+
+class LoopSpecializer(object):
 
     def __init__(self, optlist):
         self.optlist = optlist
+        self.nodes = None
+        self.loop = None
+
+    def _init(self, loop):
+        self.nodes = {}
+        self.loop = loop
 
     def newnode(self, *args, **kwds): # XXX RPython
         node = InstanceNode(*args, **kwds)
@@ -83,14 +88,24 @@
                 return False
         return True
 
-    def new_arguments(self, op):
-        newboxes = []
-        for box in op.args:
-            if isinstance(box, Box):
-                instnode = self.nodes[box]
-                box = instnode.source
-            newboxes.append(box)
-        return newboxes
+
+class LoopOptimizer(object):
+
+    fixedops = None
+
+    def __init__(self, optlist):
+        self.spec = LoopSpecializer(optlist)
+        self.optlist = optlist
+
+    def _init(self, loop):
+        self.spec._init(loop)
+        self.fixedops = {}
+        self.loop = loop
+
+    def optimize_loop(self, loop):
+        self._init(loop)
+        self.spec.find_nodes()
+        self.optimize_operations()
 
     def optimize_operations(self):
         newoperations = []
@@ -106,6 +121,15 @@
         print "Length of the loop:", len(newoperations)
         self.loop.operations = newoperations
 
+    def new_arguments(self, op):
+        newboxes = []
+        for box in op.args:
+            if isinstance(box, Box):
+                instnode = self.spec.nodes[box]
+                box = instnode.source
+            newboxes.append(box)
+        return newboxes
+
     def fixop(self, op):
         if op is None:
             return None
@@ -129,15 +153,15 @@
                 # all constant arguments: constant-fold away
                 box = op.result
                 assert box is not None
-                instnode = self.newnode(box.constbox(), const=True)
-                self.nodes[box] = instnode
+                instnode = self.spec.newnode(box.constbox(), const=True)
+                self.spec.nodes[box] = instnode
                 return
         return op
 
     def _fixguard(self, op):
         if op.is_foldable_guard():
             for arg in op.args:
-                if not self.nodes[arg].const:
+                if not self.spec.nodes[arg].const:
                     break
             else:
                 return None
@@ -150,16 +174,6 @@
         op.suboperations = [op_fail]
         return op
 
-    def _init(self, loop):
-        self.nodes = {}
-        self.field_caches = {}
-        self.fixedops = {}
-        self.loop = loop
-
-    def optimize_loop(self, loop):
-        self._init(loop)
-        self.find_nodes()
-        self.optimize_operations()
 
 # -------------------------------------------------------------------
 
@@ -211,7 +225,8 @@
 
 class OptimizeGuards(AbstractOptimization):
 
-    def guard_class(self, spec, op):
+    def guard_class(self, opt, op):
+        spec = opt.spec
         node = spec.nodes[op.args[0]]
         if node.cls is not None:
             # assert that they're equal maybe
@@ -219,12 +234,13 @@
         node.cls = spec.newnode(op.args[1], const=True)
         return op
 
-    def guard_value(self, spec, op):
+    def guard_value(self, opt, op):
+        spec = opt.spec
         instnode = spec.nodes[op.args[0]]
         assert isinstance(op.args[1], Const)
         if instnode.const:
             return
-        op = spec.fixop(op)
+        op = opt.fixop(op)
         instnode.const = True
         instnode.source = op.args[0].constbox()
         return op
@@ -281,16 +297,17 @@
 OPTLIST = [
     OptimizeGuards(),
     ]
-specializer = Specializer(OPTLIST)
 
-def optimize_loop(options, old_loops, loop, cpu=None, spec=None):
-    if spec is None:
-        spec = specializer
+loop_optimizer = LoopOptimizer(OPTLIST)
+
+def optimize_loop(options, old_loops, loop, cpu=None, opt=None):
+    if opt is None:
+        opt = loop_optimizer
     if old_loops:
         assert len(old_loops) == 1
         return old_loops[0]
     else:
-        spec.optimize_loop(loop)
+        opt.optimize_loop(loop)
         return None
 
 def optimize_bridge(options, old_loops, loop, cpu=None, spec=None):

Modified: pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_optimize3.py
==============================================================================
--- pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_optimize3.py	(original)
+++ pypy/branch/pyjitpl5-experiments/pypy/jit/metainterp/test/test_optimize3.py	Fri Jun  5 23:52:24 2009
@@ -9,8 +9,8 @@
 from pypy.jit.backend.llgraph import runner
 
 from pypy.jit.metainterp.optimize3 import AbstractOptimization
-from pypy.jit.metainterp.optimize3 import optimize_loop, Specializer,\
-     OptimizeGuards, OptimizeVirtuals
+from pypy.jit.metainterp.optimize3 import optimize_loop, LoopOptimizer,\
+     LoopSpecializer, OptimizeGuards, OptimizeVirtuals
 from pypy.jit.metainterp.test.test_optimize import equaloplists, ANY
 from pypy.jit.metainterp.test.oparser import parse
 
@@ -104,7 +104,7 @@
         if optlist is None:
             optlist = []
         optimize_loop(None, [], loop, self.cpu,
-                      spec=Specializer(optlist))
+                      opt=LoopOptimizer(optlist))
         return loop
 
     def assert_equal(self, optimized, expected):
@@ -203,7 +203,7 @@
 
     def test_virtual_simple_find_nodes(self):
         loop = self._get_virtual_simple_loop()
-        spec = Specializer([OptimizeVirtuals()])
+        spec = LoopSpecializer([OptimizeVirtuals()])
         spec._init(loop)
         spec.find_nodes()
 



More information about the Pypy-commit mailing list