[pypy-svn] r76821 - in pypy/branch/jit-bounds/pypy/jit/metainterp: . optimizeopt test
hakanardo at codespeak.net
hakanardo at codespeak.net
Wed Sep 1 19:23:32 CEST 2010
Author: hakanardo
Date: Wed Sep 1 19:23:29 2010
New Revision: 76821
Added:
pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/
pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/__init__.py
pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/heap.py
pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/intbounds.py
pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/optimizer.py (contents, props changed)
- copied, changed from r76817, pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt.py
pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/rewrite.py
pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/virtualize.py
Removed:
pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt.py
Modified:
pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_intbound.py
pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_optimizeopt.py
pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_resume.py
Log:
Converted optimizeopt into a package and started to split up into several separated optimizations
Added: pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/__init__.py
==============================================================================
--- (empty file)
+++ pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/__init__.py Wed Sep 1 19:23:29 2010
@@ -0,0 +1,21 @@
+from optimizer import Optimizer
+from rewrite import Rewrite
+
+def optimize_loop_1(metainterp_sd, loop, virtuals=True):
+ """Optimize loop.operations to make it match the input of loop.specnodes
+ and to remove internal overheadish operations. Note that loop.specnodes
+ must be applicable to the loop; you will probably get an AssertionError
+ if not.
+ """
+ optimizations = (Rewrite(),)
+ optimizer = Optimizer(metainterp_sd, loop, optimizations)
+ if virtuals:
+ optimizer.setup_virtuals_and_constants()
+ optimizer.propagate_all_forward()
+
+def optimize_bridge_1(metainterp_sd, bridge):
+ """The same, but for a bridge. The only difference is that we don't
+ expect 'specnodes' on the bridge.
+ """
+ optimize_loop_1(metainterp_sd, bridge, False)
+
Added: pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/heap.py
==============================================================================
--- (empty file)
+++ pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/heap.py Wed Sep 1 19:23:29 2010
@@ -0,0 +1,6 @@
+from optimizer import Optimization
+
+class Heap(Optimization):
+ """Cache repeated heap accesses"""
+ # FIXME: Move here
+
Added: pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/intbounds.py
==============================================================================
--- (empty file)
+++ pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/intbounds.py Wed Sep 1 19:23:29 2010
@@ -0,0 +1,7 @@
+from optimizer import Optimization
+
+class IntBounds(Optimization):
+ """Keeps track of the bounds placed on integers by the guards and
+ remove redundant guards"""
+ # FIXME: Move here
+
Copied: pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/optimizer.py (from r76817, pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt.py)
==============================================================================
--- pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt.py (original)
+++ pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/optimizer.py Wed Sep 1 19:23:29 2010
@@ -1,7 +1,7 @@
from pypy.jit.metainterp.history import Box, BoxInt, LoopToken, BoxFloat,\
ConstFloat
from pypy.jit.metainterp.history import Const, ConstInt, ConstPtr, ConstObj, REF
-from pypy.jit.metainterp.resoperation import rop, ResOperation, opboolinvers, opboolreflex
+from pypy.jit.metainterp.resoperation import rop, ResOperation
from pypy.jit.metainterp import jitprof
from pypy.jit.metainterp.executor import execute_nonspec
from pypy.jit.metainterp.specnode import SpecNode, NotSpecNode, ConstantSpecNode
@@ -23,25 +23,6 @@
MAXINT = sys.maxint
MININT = -sys.maxint - 1
-def optimize_loop_1(metainterp_sd, loop):
- """Optimize loop.operations to make it match the input of loop.specnodes
- and to remove internal overheadish operations. Note that loop.specnodes
- must be applicable to the loop; you will probably get an AssertionError
- if not.
- """
- optimizer = Optimizer(metainterp_sd, loop)
- optimizer.setup_virtuals_and_constants()
- optimizer.propagate_forward()
-
-def optimize_bridge_1(metainterp_sd, bridge):
- """The same, but for a bridge. The only difference is that we don't
- expect 'specnodes' on the bridge.
- """
- optimizer = Optimizer(metainterp_sd, bridge)
- optimizer.propagate_forward()
-
-# ____________________________________________________________
-
class IntBound(object):
_attrs_ = ('has_upper', 'has_lower', 'upper', 'lower')
@@ -597,10 +578,26 @@
subspecnode = self.items[index]
subspecnode.teardown_virtual_node(optimizer, subvalue, newexitargs)
+class Optimization(object):
+ def propagate_forward(self, op):
+ raise NotImplemented
+
+ def emit_operation(self, op):
+ self.next_optimization.propagate_forward(op)
+
+ def getvalue(self, box):
+ return self.optimizer.getvalue(box)
+
+ def make_constant(self, box, constbox):
+ return self.optimizer.make_constant(box, constbox)
+
+ def make_equal_to(self, box, value):
+ return self.optimizer.make_equal_to(box, value)
+
-class Optimizer(object):
+class Optimizer(Optimization):
- def __init__(self, metainterp_sd, loop):
+ def __init__(self, metainterp_sd, loop, optimizations=()):
self.metainterp_sd = metainterp_sd
self.cpu = metainterp_sd.cpu
self.loop = loop
@@ -612,6 +609,16 @@
self.loop_invariant_results = {}
self.pure_operations = args_dict()
self.producer = {}
+
+ if len(optimizations) == 0:
+ self.first_optimization = self
+ else:
+ self.first_optimization = optimizations[0]
+ for i in range(1, len(optimizations)):
+ optimizations[i - 1].next_optimization = optimizations[i]
+ optimizations[-1].next_optimization = self
+ for o in optimizations:
+ o.optimizer = self
def forget_numberings(self, virtualbox):
self.metainterp_sd.profiler.count(jitprof.OPT_FORCINGS)
@@ -723,25 +730,29 @@
# ----------
- def propagate_forward(self):
+ def propagate_all_forward(self):
self.exception_might_have_happened = False
self.newoperations = []
self.i = 0
while self.i < len(self.loop.operations):
op = self.loop.operations[self.i]
- self.producer[op.result] = op
- opnum = op.opnum
- for value, func in optimize_ops:
- if opnum == value:
- func(self, op)
- break
- else:
- self.optimize_default(op)
+ self.first_optimization.propagate_forward(op)
self.i += 1
self.loop.operations = self.newoperations
# accumulate counters
self.resumedata_memo.update_counters(self.metainterp_sd.profiler)
+ def propagate_forward(self, op):
+ self.producer[op.result] = op
+ opnum = op.opnum
+ for value, func in optimize_ops:
+ if opnum == value:
+ func(self, op)
+ break
+ else:
+ self.optimize_default(op)
+
+
def propagate_bounds_backward(self, box):
# FIXME: This takes care of the instruction where box is the reuslt
# but the bounds produced by all instructions where box is
@@ -848,59 +859,11 @@
if is_ovf:
self.i += 1 # skip next operation, it is the unneeded guard
return
- elif self.find_rewritable_bool(op, args):
- return
else:
self.pure_operations[args] = op
# otherwise, the operation remains
self.emit_operation(op)
-
-
- def try_boolinvers(self, op, targs):
- oldop = self.pure_operations.get(targs, None)
- if oldop is not None and oldop.descr is op.descr:
- value = self.getvalue(oldop.result)
- if value.is_constant():
- if value.box.same_constant(CONST_1):
- self.make_constant(op.result, CONST_0)
- return True
- elif value.box.same_constant(CONST_0):
- self.make_constant(op.result, CONST_1)
- return True
-
- return False
-
-
- def find_rewritable_bool(self, op, args):
- try:
- oldopnum = opboolinvers[op.opnum]
- targs = [args[0], args[1], ConstInt(oldopnum)]
- if self.try_boolinvers(op, targs):
- return True
- except KeyError:
- pass
-
- try:
- oldopnum = opboolreflex[op.opnum]
- targs = [args[1], args[0], ConstInt(oldopnum)]
- oldop = self.pure_operations.get(targs, None)
- if oldop is not None and oldop.descr is op.descr:
- self.make_equal_to(op.result, self.getvalue(oldop.result))
- return True
- except KeyError:
- pass
-
- try:
- oldopnum = opboolinvers[opboolreflex[op.opnum]]
- targs = [args[1], args[0], ConstInt(oldopnum)]
- if self.try_boolinvers(op, targs):
- return True
- except KeyError:
- pass
-
- return False
-
def optimize_JUMP(self, op):
orgop = self.loop.operations[-1]
Added: pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/rewrite.py
==============================================================================
--- (empty file)
+++ pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/rewrite.py Wed Sep 1 19:23:29 2010
@@ -0,0 +1,63 @@
+from optimizer import Optimization, CONST_1, CONST_0
+from pypy.jit.metainterp.resoperation import opboolinvers, opboolreflex
+from pypy.jit.metainterp.history import ConstInt
+
+class Rewrite(Optimization):
+ """Rewrite operations into equvivialent, already executed operations
+ or constants.
+ """
+
+ def propagate_forward(self, op):
+ args = self.optimizer.make_args_key(op)
+ if self.find_rewritable_bool(op, args):
+ return
+ self.emit_operation(op)
+
+ def try_boolinvers(self, op, targs):
+ oldop = self.optimizer.pure_operations.get(targs, None)
+ if oldop is not None and oldop.descr is op.descr:
+ value = self.getvalue(oldop.result)
+ if value.is_constant():
+ if value.box.same_constant(CONST_1):
+ self.make_constant(op.result, CONST_0)
+ return True
+ elif value.box.same_constant(CONST_0):
+ self.make_constant(op.result, CONST_1)
+ return True
+
+ return False
+
+
+ def find_rewritable_bool(self, op, args):
+ try:
+ oldopnum = opboolinvers[op.opnum]
+ targs = [args[0], args[1], ConstInt(oldopnum)]
+ if self.try_boolinvers(op, targs):
+ return True
+ except KeyError:
+ pass
+
+ try:
+ oldopnum = opboolreflex[op.opnum]
+ targs = [args[1], args[0], ConstInt(oldopnum)]
+ oldop = self.optimizer.pure_operations.get(targs, None)
+ if oldop is not None and oldop.descr is op.descr:
+ self.make_equal_to(op.result, self.getvalue(oldop.result))
+ return True
+ except KeyError:
+ pass
+
+ try:
+ oldopnum = opboolinvers[opboolreflex[op.opnum]]
+ targs = [args[1], args[0], ConstInt(oldopnum)]
+ if self.try_boolinvers(op, targs):
+ return True
+ except KeyError:
+ pass
+
+ return False
+
+
+
+
+
Added: pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/virtualize.py
==============================================================================
--- (empty file)
+++ pypy/branch/jit-bounds/pypy/jit/metainterp/optimizeopt/virtualize.py Wed Sep 1 19:23:29 2010
@@ -0,0 +1,6 @@
+from optimizer import Optimization
+
+class Virtualize(Optimization):
+ "Virtualize objects until they escape."
+ # FIXME: Move here
+
Modified: pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_intbound.py
==============================================================================
--- pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_intbound.py (original)
+++ pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_intbound.py Wed Sep 1 19:23:29 2010
@@ -1,4 +1,4 @@
-from pypy.jit.metainterp.optimizeopt import IntBound, IntUpperBound, \
+from pypy.jit.metainterp.optimizeopt.optimizer import IntBound, IntUpperBound, \
IntLowerBound, IntUnbounded
from copy import copy
Modified: pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_optimizeopt.py
==============================================================================
--- pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_optimizeopt.py (original)
+++ pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_optimizeopt.py Wed Sep 1 19:23:29 2010
@@ -4,7 +4,7 @@
#OOtypeMixin,
BaseTest)
from pypy.jit.metainterp.optimizefindnode import PerfectSpecializationFinder
-from pypy.jit.metainterp import optimizeopt
+import pypy.jit.metainterp.optimizeopt.optimizer as optimizeopt
from pypy.jit.metainterp.optimizeopt import optimize_loop_1
from pypy.jit.metainterp.optimizeutil import InvalidLoop
from pypy.jit.metainterp.history import AbstractDescr, ConstInt, BoxInt
Modified: pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_resume.py
==============================================================================
--- pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_resume.py (original)
+++ pypy/branch/jit-bounds/pypy/jit/metainterp/test/test_resume.py Wed Sep 1 19:23:29 2010
@@ -1,7 +1,7 @@
import py
from pypy.rpython.lltypesystem import lltype, llmemory, rffi
-from pypy.jit.metainterp.optimizeopt import VirtualValue, OptValue, VArrayValue
-from pypy.jit.metainterp.optimizeopt import VStructValue
+from pypy.jit.metainterp.optimizeopt.optimizer import VirtualValue, OptValue, VArrayValue
+from pypy.jit.metainterp.optimizeopt.optimizer import VStructValue
from pypy.jit.metainterp.resume import *
from pypy.jit.metainterp.history import BoxInt, BoxPtr, ConstInt
from pypy.jit.metainterp.history import ConstPtr, ConstFloat
More information about the Pypy-commit
mailing list