[pypy-svn] pypy jit-str_in_preamble: dont force every box in optimizer.values not allowed to propagate to the next iteration. And make sure the reconstruct_for_next_iteration methods always creates a new instance to prevent status data from beeing unintentionally propagated
hakanardo
commits-noreply at bitbucket.org
Fri Mar 25 21:03:38 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-str_in_preamble
Changeset: r42946:bb8b6e1f1c9c
Date: 2011-03-25 21:01 +0100
http://bitbucket.org/pypy/pypy/changeset/bb8b6e1f1c9c/
Log: dont force every box in optimizer.values not allowed to propagate to
the next iteration. And make sure the reconstruct_for_next_iteration
methods always creates a new instance to prevent status data from
beeing unintentionally propagated
diff --git a/pypy/jit/metainterp/optimizeopt/fficall.py b/pypy/jit/metainterp/optimizeopt/fficall.py
--- a/pypy/jit/metainterp/optimizeopt/fficall.py
+++ b/pypy/jit/metainterp/optimizeopt/fficall.py
@@ -67,7 +67,8 @@
def __init__(self):
self.funcinfo = None
- def reconstruct_for_next_iteration(self, optimizer, valuemap):
+ def reconstruct_for_next_iteration(self, surviving_boxes,
+ optimizer, valuemap):
return OptFfiCall()
# FIXME: Should any status be saved for next iteration?
diff --git a/pypy/jit/metainterp/optimizeopt/string.py b/pypy/jit/metainterp/optimizeopt/string.py
--- a/pypy/jit/metainterp/optimizeopt/string.py
+++ b/pypy/jit/metainterp/optimizeopt/string.py
@@ -366,9 +366,9 @@
"Handling of strings and unicodes."
enabled = True
- def reconstruct_for_next_iteration(self, optimizer, valuemap):
- self.enabled = True
- return self
+ def reconstruct_for_next_iteration(self, surviving_boxes,
+ optimizer, valuemap):
+ return OptString()
def make_vstring_plain(self, box, source_op, mode):
vvalue = VStringPlainValue(self.optimizer, box, source_op, mode)
diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -267,7 +267,7 @@
virtual_state = modifier.get_virtual_state(jump_args)
loop.preamble.operations = self.optimizer.newoperations
- self.optimizer = self.optimizer.reconstruct_for_next_iteration()
+ self.optimizer = self.optimizer.reconstruct_for_next_iteration(jump_args)
inputargs = self.inline(self.cloned_operations,
loop.inputargs, jump_args)
loop.inputargs = inputargs
@@ -626,8 +626,9 @@
self.inliner = None
- def reconstruct_for_next_iteration(self, optimizer, valuemap):
- return self
+ def reconstruct_for_next_iteration(self, surviving_boxes,
+ optimizer, valuemap):
+ return OptInlineShortPreamble(self.retraced)
def propagate_forward(self, op):
if op.getopnum() == rop.JUMP:
diff --git a/pypy/jit/metainterp/optimizeopt/heap.py b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -120,7 +120,8 @@
# cached array items: {descr: CachedArrayItems}
self.cached_arrayitems = {}
- def reconstruct_for_next_iteration(self, optimizer, valuemap):
+ def reconstruct_for_next_iteration(self, surviving_boxes,
+ optimizer, valuemap):
new = OptHeap()
if True:
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -13,8 +13,9 @@
This includes already executed operations and constants.
"""
- def reconstruct_for_next_iteration(self, optimizer, valuemap):
- return self
+ def reconstruct_for_next_iteration(self, surviving_boxes,
+ optimizer, valuemap):
+ return OptRewrite()
def propagate_forward(self, op):
args = self.optimizer.make_args_key(op)
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -51,10 +51,15 @@
boxes.append(self.force_box())
already_seen[self.get_key_box()] = None
- def get_reconstructed(self, optimizer, valuemap):
+ def get_reconstructed(self, optimizer, valuemap, force_if_needed=True):
if self in valuemap:
return valuemap[self]
new = self.reconstruct_for_next_iteration(optimizer)
+ if new is None:
+ if force_if_needed:
+ new = optimizer.OptValue(self.force_box())
+ else:
+ return None
valuemap[self] = new
self.reconstruct_childs(new, valuemap)
return new
@@ -283,18 +288,19 @@
for o in self.optimizations:
o.force_at_end_of_preamble()
- def reconstruct_for_next_iteration(self, optimizer=None, valuemap=None):
+ def reconstruct_for_next_iteration(self, surviving_boxes=None,
+ optimizer=None, valuemap=None):
assert optimizer is None
assert valuemap is None
+ if surviving_boxes is None:
+ surviving_boxes = []
valuemap = {}
new = Optimizer(self.metainterp_sd, self.loop)
- optimizations = [o.reconstruct_for_next_iteration(new, valuemap) for o in
- self.optimizations]
+ optimizations = [o.reconstruct_for_next_iteration(surviving_boxes,
+ new, valuemap)
+ for o in self.optimizations]
new.set_optimizations(optimizations)
- new.values = {}
- for box, value in self.values.items():
- new.values[box] = value.get_reconstructed(new, valuemap)
new.interned_refs = self.interned_refs
new.bool_boxes = {}
for value in new.bool_boxes.keys():
@@ -310,6 +316,14 @@
new.producer = self.producer
assert self.posponedop is None
+ for box, value in self.values.items():
+ box = new.getinterned(box)
+ force = box in surviving_boxes
+ value = value.get_reconstructed(new, valuemap,
+ force_if_needed=force)
+ if value is not None:
+ new.values[box] = value
+
return new
def turned_constant(self, value):
diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -13,9 +13,10 @@
self.posponedop = None
self.nextop = None
- def reconstruct_for_next_iteration(self, optimizer, valuemap):
+ def reconstruct_for_next_iteration(self, surviving_boxes, optimizer,
+ valuemap):
assert self.posponedop is None
- return self
+ return OptIntBounds()
def propagate_forward(self, op):
if op.is_ovf():
diff --git a/pypy/jit/metainterp/optimizeopt/virtualize.py b/pypy/jit/metainterp/optimizeopt/virtualize.py
--- a/pypy/jit/metainterp/optimizeopt/virtualize.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualize.py
@@ -47,7 +47,7 @@
raise NotImplementedError("abstract base")
def reconstruct_for_next_iteration(self, _optimizer):
- return optimizer.OptValue(self.force_box())
+ return None
def get_fielddescrlist_cache(cpu):
if not hasattr(cpu, '_optimizeopt_fielddescrlist_cache'):
@@ -261,8 +261,9 @@
class OptVirtualize(optimizer.Optimization):
"Virtualize objects until they escape."
- def reconstruct_for_next_iteration(self, optimizer, valuemap):
- return self
+ def reconstruct_for_next_iteration(self, surviving_boxes,
+ optimizer, valuemap):
+ return OptVirtualize()
def make_virtual(self, known_class, box, source_op=None):
vvalue = VirtualValue(self.optimizer, known_class, box, source_op)
More information about the Pypy-commit
mailing list