[pypy-commit] pypy jit-optimizeopt-cleanups: Make forced virtuals emit ops using OptVirtualize.emit_operation(). This makes the heap optimizer see those ops, but in the wrong order and everything becomes an obsure mess :( Maybe I can fix that...
hakanardo
noreply at buildbot.pypy.org
Tue Sep 27 19:33:14 CEST 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-optimizeopt-cleanups
Changeset: r47633:0e021f10e9aa
Date: 2011-09-27 19:32 +0200
http://bitbucket.org/pypy/pypy/changeset/0e021f10e9aa/
Log: Make forced virtuals emit ops using OptVirtualize.emit_operation().
This makes the heap optimizer see those ops, but in the wrong order
and everything becomes an obsure mess :( Maybe I can fix that...
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
@@ -50,6 +50,7 @@
if not self._lazy_setfield_registered:
optheap._lazy_setfields_and_arrayitems.append(self)
self._lazy_setfield_registered = True
+
else:
# this is the case where the pending setfield ends up
# storing precisely the value that is already there,
@@ -166,8 +167,9 @@
def flush(self):
self.force_all_lazy_setfields_and_arrayitems()
if self.posponedop:
- self.next_optimization.propagate_forward(self.posponedop)
+ posponedop = self.posponedop
self.posponedop = None
+ self.next_optimization.propagate_forward(posponedop)
def new(self):
return OptHeap()
@@ -216,8 +218,9 @@
def emit_operation(self, op):
self.emitting_operation(op)
if self.posponedop:
- self.next_optimization.propagate_forward(self.posponedop)
+ posponedop = self.posponedop
self.posponedop = None
+ self.next_optimization.propagate_forward(posponedop)
if (op.is_comparison() or op.getopnum() == rop.CALL_MAY_FORCE
or op.is_ovf()):
self.posponedop = op
@@ -367,6 +370,9 @@
cf.remember_field_value(structvalue, fieldvalue, op)
def optimize_SETFIELD_GC(self, op):
+ if op in self.optimizer.volatile:
+ self.emit_operation(op)
+ return
if self.has_pure_result(rop.GETFIELD_GC_PURE, [op.getarg(0)],
op.getdescr()):
os.write(2, '[bogus _immutable_field_ declaration: %s]\n' %
@@ -375,6 +381,7 @@
#
cf = self.field_cache(op.getdescr())
cf.do_setfield(self, op)
+
def optimize_GETARRAYITEM_GC(self, op):
arrayvalue = self.getvalue(op.getarg(0))
@@ -407,6 +414,9 @@
(op.getdescr().repr_of_descr()))
raise BogusPureField
#
+ if op in self.optimizer.volatile:
+ self.emit_operation(op)
+ return
indexvalue = self.getvalue(op.getarg(1))
if indexvalue.is_constant():
arrayvalue = self.getvalue(op.getarg(0))
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
@@ -246,6 +246,10 @@
def emit_operation(self, op):
self.next_optimization.propagate_forward(op)
+ def emit_volatile_operation(self, op):
+ self.optimizer.volatile[op] = True
+ self.emit_operation(op)
+
# FIXME: Move some of these here?
def getvalue(self, box):
return self.optimizer.getvalue(box)
@@ -331,6 +335,8 @@
self.opaque_pointers = {}
self.replaces_guard = {}
self.newoperations = []
+ self.volatile = {}
+ self.optimizer = self
if loop is not None:
self.call_pure_results = loop.call_pure_results
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -39,8 +39,9 @@
def test_sharing_field_lists_of_virtual():
class FakeOptimizer(object):
- class cpu(object):
- pass
+ class optimizer(object):
+ class cpu(object):
+ pass
opt = FakeOptimizer()
virt1 = virtualize.AbstractVirtualStructValue(opt, None)
lst1 = virt1._get_field_descr_list()
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
@@ -113,19 +113,18 @@
#
if not we_are_translated():
op.name = 'FORCE ' + self.source_op.name
-
+
if self._is_immutable_and_filled_with_constants():
- box = self.optimizer.constant_fold(op)
+ box = self.optimizer.optimizer.constant_fold(op)
self.make_constant(box)
for ofs, value in self._fields.iteritems():
subbox = value.force_box()
assert isinstance(subbox, Const)
- execute(self.optimizer.cpu, None, rop.SETFIELD_GC,
+ execute(self.optimizer.optimizer.cpu, None, rop.SETFIELD_GC,
ofs, box, subbox)
# keep self._fields, because it's all immutable anyway
else:
- newoperations = self.optimizer.newoperations
- newoperations.append(op)
+ self.optimizer.emit_operation(op)
self.box = box = op.result
#
iteritems = self._fields.iteritems()
@@ -138,7 +137,8 @@
subbox = value.force_box()
op = ResOperation(rop.SETFIELD_GC, [box, subbox], None,
descr=ofs)
- newoperations.append(op)
+
+ self.optimizer.emit_volatile_operation(op)
def _get_field_descr_list(self):
_cached_sorted_fields = self._cached_sorted_fields
@@ -155,7 +155,7 @@
else:
lst = self._fields.keys()
sort_descrs(lst)
- cache = get_fielddescrlist_cache(self.optimizer.cpu)
+ cache = get_fielddescrlist_cache(self.optimizer.optimizer.cpu)
result = cache.get(lst, None)
if result is None:
cache[lst] = lst
@@ -190,7 +190,7 @@
return modifier.make_virtual(self.known_class, fielddescrs)
def _get_descr(self):
- return vtable2descr(self.optimizer.cpu, self.known_class.getint())
+ return vtable2descr(self.optimizer.optimizer.cpu, self.known_class.getint())
def __repr__(self):
cls_name = self.known_class.value.adr.ptr._obj._TYPE._name
@@ -244,8 +244,7 @@
assert self.source_op is not None
if not we_are_translated():
self.source_op.name = 'FORCE ' + self.source_op.name
- newoperations = self.optimizer.newoperations
- newoperations.append(self.source_op)
+ self.optimizer.emit_operation(self.source_op)
self.box = box = self.source_op.result
for index in range(len(self._items)):
subvalue = self._items[index]
@@ -256,7 +255,7 @@
op = ResOperation(rop.SETARRAYITEM_GC,
[box, ConstInt(index), subbox], None,
descr=self.arraydescr)
- newoperations.append(op)
+ self.optimizer.emit_volatile_operation(op)
def get_args_for_fail(self, modifier):
if self.box is None and not modifier.already_seen_virtual(self.keybox):
@@ -279,17 +278,17 @@
return OptVirtualize()
def make_virtual(self, known_class, box, source_op=None):
- vvalue = VirtualValue(self.optimizer, known_class, box, source_op)
+ vvalue = VirtualValue(self, known_class, box, source_op)
self.make_equal_to(box, vvalue)
return vvalue
def make_varray(self, arraydescr, size, box, source_op=None):
- vvalue = VArrayValue(self.optimizer, arraydescr, size, box, source_op)
+ vvalue = VArrayValue(self, arraydescr, size, box, source_op)
self.make_equal_to(box, vvalue)
return vvalue
def make_vstruct(self, structdescr, box, source_op=None):
- vvalue = VStructValue(self.optimizer, structdescr, box, source_op)
+ vvalue = VStructValue(self, structdescr, box, source_op)
self.make_equal_to(box, vvalue)
return vvalue
@@ -362,7 +361,6 @@
self.make_equal_to(op.result, fieldvalue)
else:
value.ensure_nonnull()
- ###self.heap_op_optimizer.optimize_GETFIELD_GC(op, value)
self.emit_operation(op)
# note: the following line does not mean that the two operations are
@@ -377,7 +375,6 @@
value.setfield(op.getdescr(), fieldvalue)
else:
value.ensure_nonnull()
- ###self.heap_op_optimizer.optimize_SETFIELD_GC(op, value, fieldvalue)
self.emit_operation(op)
def optimize_NEW_WITH_VTABLE(self, op):
@@ -417,7 +414,6 @@
self.make_equal_to(op.result, itemvalue)
return
value.ensure_nonnull()
- ###self.heap_op_optimizer.optimize_GETARRAYITEM_GC(op, value)
self.emit_operation(op)
# note: the following line does not mean that the two operations are
@@ -432,7 +428,6 @@
value.setitem(indexbox.getint(), self.getvalue(op.getarg(2)))
return
value.ensure_nonnull()
- ###self.heap_op_optimizer.optimize_SETARRAYITEM_GC(op, value, fieldvalue)
self.emit_operation(op)
diff --git a/pypy/jit/metainterp/test/test_resume.py b/pypy/jit/metainterp/test/test_resume.py
--- a/pypy/jit/metainterp/test/test_resume.py
+++ b/pypy/jit/metainterp/test/test_resume.py
@@ -576,8 +576,9 @@
class FakeOptimizer_VirtualValue(object):
- class cpu:
- pass
+ class optimizer:
+ class cpu:
+ pass
fakeoptimizer = FakeOptimizer_VirtualValue()
def ConstAddr(addr, cpu): # compatibility
More information about the pypy-commit
mailing list