Author: Hakan Ardo <ha...@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 _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit