[pypy-svn] r79084 - pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt
hakanardo at codespeak.net
hakanardo at codespeak.net
Mon Nov 15 09:36:41 CET 2010
Author: hakanardo
Date: Mon Nov 15 09:36:39 2010
New Revision: 79084
Modified:
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/fficall.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/heap.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/intbounds.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/optimizer.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/rewrite.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py
pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/virtualize.py
Log:
Reconstructs all the OptValus after the preamble
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/fficall.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/fficall.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/fficall.py Mon Nov 15 09:36:39 2010
@@ -67,7 +67,7 @@
def __init__(self):
self.funcinfo = None
- def reconstruct_for_next_iteration(self, valuemap):
+ def reconstruct_for_next_iteration(self, optimizer, valuemap):
return OptFfiCall()
# FIXME: Should any status be saved for next iteration?
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/heap.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/heap.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/heap.py Mon Nov 15 09:36:39 2010
@@ -23,13 +23,35 @@
self.lazy_setfields = {}
self.lazy_setfields_descrs = [] # keys (at least) of previous dict
- def reconstruct_for_next_iteration(self, valuemap):
+ def reconstruct_for_next_iteration(self, optimizer, valuemap):
self.force_all_lazy_setfields()
assert not self.lazy_setfields_descrs
assert not self.lazy_setfields
new = OptHeap()
- new.cached_fields = self.cached_fields
- new.cached_arrayitems = self.cached_arrayitems
+
+ for descr, d in self.cached_fields.items():
+ newd = {}
+ new.cached_fields[descr] = newd
+ for value, fieldvalue in d.items():
+ newd[value.get_reconstructed(optimizer, valuemap)] = \
+ fieldvalue.get_reconstructed(optimizer, valuemap)
+
+ new.cached_arrayitems = {}
+ for descr, d in self.cached_arrayitems.items():
+ newd = {}
+ new.cached_arrayitems[descr] = newd
+ for value, cache in d.items():
+ newcache = CachedArrayItems()
+ newd[value.get_reconstructed(optimizer, valuemap)] = newcache
+ if cache.var_index_item:
+ newcache.var_index_item = \
+ cache.var_index_item.get_reconstructed(optimizer, valuemap)
+ if newcache.var_index_indexvalue:
+ newcache.var_index_indexvalue = \
+ cache.var_index_indexvalue.get_reconstructed(optimizer, valuemap)
+ for index, fieldvalue in cache.fixed_index_items.items():
+ newcache.fixed_index_items[index] = \
+ fieldvalue.get_reconstructed(optimizer, valuemap)
return new
def clean_caches(self):
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/intbounds.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/intbounds.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/intbounds.py Mon Nov 15 09:36:39 2010
@@ -13,7 +13,7 @@
self.posponedop = None
self.nextop = None
- def reconstruct_for_next_iteration(self, valuemap):
+ def reconstruct_for_next_iteration(self, optimizer, valuemap):
assert self.posponedop is None
return self
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/optimizer.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/optimizer.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/optimizer.py Mon Nov 15 09:36:39 2010
@@ -54,13 +54,17 @@
def get_reconstructed(self, optimizer, valuemap):
if self in valuemap:
return valuemap[self]
- new = self.reconstruct_for_next_iteration(optimizer, valuemap)
+ new = self.reconstruct_for_next_iteration(optimizer)
valuemap[self] = new
+ self.reconstruct_childs(new, valuemap)
return new
- def reconstruct_for_next_iteration(self, optimizer, valuemap):
+ def reconstruct_for_next_iteration(self, optimizer):
return self
+ def reconstruct_childs(self, new, valuemap):
+ pass
+
def get_args_for_fail(self, modifier):
pass
@@ -207,7 +211,7 @@
def turned_constant(self, value):
pass
- def reconstruct_for_next_iteration(self, valuemap):
+ def reconstruct_for_next_iteration(self, optimizer=None, valuemap=None):
#return self.__class__()
raise NotImplementedError
@@ -230,6 +234,9 @@
self.exception_might_have_happened = False
self.newoperations = []
+ self.set_optimizations(optimizations)
+
+ def set_optimizations(self, optimizations):
if optimizations:
self.first_optimization = optimizations[0]
for i in range(1, len(optimizations)):
@@ -249,12 +256,15 @@
for o in self.optimizations:
o.force_at_end_of_preamble()
- def reconstruct_for_next_iteration(self):
+ def reconstruct_for_next_iteration(self, optimizer=None, valuemap=None):
+ assert optimizer is None
+ assert valuemap is None
valuemap = {}
- optimizations = [o.reconstruct_for_next_iteration(valuemap) for o in
+ new = Optimizer(self.metainterp_sd, self.loop)
+ optimizations = [o.reconstruct_for_next_iteration(new, valuemap) for o in
self.optimizations]
- optimizations = self.optimizations
- new = Optimizer(self.metainterp_sd, self.loop, optimizations)
+ new.set_optimizations(optimizations)
+
new.values = {}
for box, value in self.values.items():
new.values[box] = value.get_reconstructed(new, valuemap)
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/rewrite.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/rewrite.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/rewrite.py Mon Nov 15 09:36:39 2010
@@ -10,7 +10,7 @@
This includes already executed operations and constants.
"""
- def reconstruct_for_next_iteration(self, valuemap):
+ def reconstruct_for_next_iteration(self, optimizer, valuemap):
return self
def propagate_forward(self, op):
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/string.py Mon Nov 15 09:36:39 2010
@@ -367,7 +367,7 @@
"Handling of strings and unicodes."
enabled = True
- def reconstruct_for_next_iteration(self, valuemap):
+ def reconstruct_for_next_iteration(self, optimizer, valuemap):
self.enabled = True
return self
Modified: pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/virtualize.py
==============================================================================
--- pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/virtualize.py (original)
+++ pypy/branch/jit-unroll-loops/pypy/jit/metainterp/optimizeopt/virtualize.py Mon Nov 15 09:36:39 2010
@@ -44,7 +44,7 @@
def _really_force(self):
raise NotImplementedError("abstract base")
- def reconstruct_for_next_iteration(self, optimizer, valuemap):
+ def reconstruct_for_next_iteration(self, _optimizer):
return optimizer.OptValue(self.force_box())
def get_fielddescrlist_cache(cpu):
@@ -135,15 +135,17 @@
else:
boxes.append(self.box)
- def reconstruct_for_next_iteration(self, optimizer, valuemap):
+ def reconstruct_for_next_iteration(self, optimizer):
self.optimizer = optimizer
- if self.box is None:
- lst = self._get_field_descr_list()
- for ofs in lst:
- self._fields[ofs] = \
- self._fields[ofs].get_reconstructed(optimizer, valuemap)
return self
+ def reconstruct_childs(self, new, valuemap):
+ assert isinstance(new, AbstractVirtualStructValue)
+ if new.box is None:
+ lst = self._get_field_descr_list()
+ for ofs in lst:
+ new._fields[ofs] = \
+ self._fields[ofs].get_reconstructed(new.optimizer, valuemap)
class VirtualValue(AbstractVirtualStructValue):
level = optimizer.LEVEL_KNOWNCLASS
@@ -236,18 +238,21 @@
else:
boxes.append(self.box)
- def reconstruct_for_next_iteration(self, optimizer, valuemap):
+ def reconstruct_for_next_iteration(self, optimizer):
self.optimizer = optimizer
- if self.box is None:
- for i in range(len(self._items)):
- self._items[i] = self._items[i].get_reconstructed(optimizer,
- valuemap)
return self
+ def reconstruct_childs(self, new, valuemap):
+ assert isinstance(new, VArrayValue)
+ if new.box is None:
+ for i in range(len(self._items)):
+ new._items[i] = self._items[i].get_reconstructed(new.optimizer,
+ valuemap)
+
class OptVirtualize(optimizer.Optimization):
"Virtualize objects until they escape."
- def reconstruct_for_next_iteration(self, valuemap):
+ def reconstruct_for_next_iteration(self, optimizer, valuemap):
return self
def make_virtual(self, known_class, box, source_op=None):
More information about the Pypy-commit
mailing list