[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