[pypy-commit] pypy jit-short_from_state: merged getfield_gc support in short preamble manually
hakanardo
noreply at buildbot.pypy.org
Fri Jul 1 08:45:03 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-short_from_state
Changeset: r45211:bbd855e7d8bf
Date: 2011-07-01 08:11 +0200
http://bitbucket.org/pypy/pypy/changeset/bbd855e7d8bf/
Log: merged getfield_gc support in short preamble manually
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
@@ -4,6 +4,7 @@
from pypy.rlib.objectmodel import we_are_translated
from pypy.jit.metainterp.jitexc import JitException
from pypy.jit.metainterp.optimizeopt.optimizer import Optimization
+from pypy.jit.metainterp.history import ConstInt, Const
class CachedField(object):
@@ -23,6 +24,7 @@
# 'cached_fields'.
#
self._cached_fields = {}
+ self._cached_fields_getfield_op = {}
self._lazy_setfield = None
self._lazy_setfield_registered = False
@@ -69,9 +71,10 @@
else:
return self._cached_fields.get(structvalue, None)
- def remember_field_value(self, structvalue, fieldvalue):
+ def remember_field_value(self, structvalue, fieldvalue, getfield_op=None):
assert self._lazy_setfield is None
self._cached_fields[structvalue] = fieldvalue
+ self._cached_fields_getfield_op[structvalue] = getfield_op
def force_lazy_setfield(self, optheap):
op = self._lazy_setfield
@@ -80,7 +83,7 @@
# Now we clear _cached_fields, because actually doing the
# setfield might impact any of the stored result (because of
# possible aliasing).
- self._cached_fields.clear()
+ self.clear()
self._lazy_setfield = None
optheap.next_optimization.propagate_forward(op)
# Once it is done, we can put at least one piece of information
@@ -90,15 +93,38 @@
fieldvalue = optheap.getvalue(op.getarglist()[-1])
self.remember_field_value(structvalue, fieldvalue)
- def get_reconstructed(self, optimizer, valuemap):
+ def clear(self):
+ self._cached_fields.clear()
+ self._cached_fields_getfield_op.clear()
+
+ def turned_constant(self, newvalue, value):
+ if newvalue not in self._cached_fields:
+ self._cached_fields[newvalue] = self._cached_fields[value]
+ op = self._cached_fields_getfield_op[value].clone()
+ constbox = value.box
+ assert isinstance(constbox, Const)
+ op.setarg(0, constbox)
+ self._cached_fields_getfield_op[newvalue] = op
+
+ def get_cloned(self, optimizer, valuemap, short_boxes):
assert self._lazy_setfield is None
cf = CachedField()
for structvalue, fieldvalue in self._cached_fields.iteritems():
- structvalue2 = structvalue.get_reconstructed(optimizer, valuemap)
- fieldvalue2 = fieldvalue .get_reconstructed(optimizer, valuemap)
- cf._cached_fields[structvalue2] = fieldvalue2
+ op = self._cached_fields_getfield_op.get(structvalue, None)
+ if op and op.result in short_boxes and short_boxes[op.result] is op:
+ structvalue2 = structvalue.get_cloned(optimizer, valuemap)
+ fieldvalue2 = fieldvalue .get_cloned(optimizer, valuemap)
+ cf._cached_fields[structvalue2] = fieldvalue2
return cf
+ def produce_potential_short_preamble_ops(self, optimizer,
+ potential_ops, descr):
+ if self._lazy_setfield is not None:
+ return
+ for structvalue, op in self._cached_fields_getfield_op.iteritems():
+ if op and structvalue in self._cached_fields:
+ potential_ops[op.result] = op
+
class BogusPureField(JitException):
pass
@@ -126,10 +152,10 @@
def reconstruct_for_next_iteration(self, short_boxes, surviving_boxes,
optimizer, valuemap):
new = OptHeap()
- return new
for descr, d in self.cached_fields.items():
- new.cached_fields[descr] = d.get_reconstructed(optimizer, valuemap)
+ new.cached_fields[descr] = d.get_cloned(optimizer, valuemap, short_boxes)
+ return new
for descr, submap in self.cached_arrayitems.items():
newdict = {}
@@ -139,6 +165,12 @@
return new
+ def produce_potential_short_preamble_ops(self, potential_ops):
+ for descr, d in self.cached_fields.items():
+ d.produce_potential_short_preamble_ops(self.optimizer,
+ potential_ops, descr)
+
+
def clean_caches(self):
del self._lazy_setfields_and_arrayitems[:]
self.cached_fields.clear()
@@ -208,7 +240,7 @@
self.force_lazy_setfield(fielddescr)
try:
cf = self.cached_fields[fielddescr]
- cf._cached_fields.clear()
+ cf.clear()
except KeyError:
pass
for arraydescr in effectinfo.write_descrs_arrays:
@@ -235,11 +267,11 @@
if value is not newvalue:
for cf in self.cached_fields.itervalues():
if value in cf._cached_fields:
- cf._cached_fields[newvalue] = cf._cached_fields[value]
+ cf.turned_constant(newvalue, value)
for submap in self.cached_arrayitems.itervalues():
for cf in submap.itervalues():
if value in cf._cached_fields:
- cf._cached_fields[newvalue] = cf._cached_fields[value]
+ cf.turned_constant(newvalue, value)
def force_lazy_setfield(self, descr):
try:
@@ -341,7 +373,7 @@
self.emit_operation(op)
# then remember the result of reading the field
fieldvalue = self.getvalue(op.result)
- cf.remember_field_value(structvalue, fieldvalue)
+ cf.remember_field_value(structvalue, fieldvalue, op)
def optimize_SETFIELD_GC(self, op):
if self.has_pure_result(rop.GETFIELD_GC_PURE, [op.getarg(0)],
More information about the pypy-commit
mailing list