[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