Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult-unroll Changeset: r79160:ed85c661a0e3 Date: 2015-08-23 17:49 +0200 http://bitbucket.org/pypy/pypy/changeset/ed85c661a0e3/
Log: pass arraydescr a bit everywhere for short preamble diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py --- a/rpython/jit/metainterp/optimizeopt/heap.py +++ b/rpython/jit/metainterp/optimizeopt/heap.py @@ -198,17 +198,17 @@ return op.getarg(2) def _getfield(self, opinfo, descr, optheap): - res = opinfo.getitem(self.index, optheap) + res = opinfo.getitem(descr, self.index, optheap) if isinstance(res, PreambleOp): index = res.preamble_op.getarg(1).getint() res = optheap.optimizer.force_op_from_preamble(res) - opinfo.setitem(index, None, res, optheap=optheap) + opinfo.setitem(descr, index, None, res, optheap=optheap) return res def _setfield(self, op, opinfo, optheap): arg = optheap.get_box_replacement(op.getarg(2)) struct = optheap.get_box_replacement(op.getarg(0)) - opinfo.setitem(self.index, struct, arg, self, optheap) + opinfo.setitem(op.getdescr(), self.index, struct, arg, self, optheap) def invalidate(self, descr): for opinfo in self.cached_infos: @@ -589,7 +589,7 @@ self.emit_operation(op) # the remember the result of reading the array item if cf is not None: - arrayinfo.setitem(indexb.getint(), + arrayinfo.setitem(op.getdescr(), indexb.getint(), self.get_box_replacement(op.getarg(0)), self.get_box_replacement(op), cf, self) diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py --- a/rpython/jit/metainterp/optimizeopt/info.py +++ b/rpython/jit/metainterp/optimizeopt/info.py @@ -317,16 +317,19 @@ return visitor.visit_vrawslice(self.offset) class ArrayPtrInfo(AbstractVirtualPtrInfo): - _attrs_ = ('length', '_items', 'lenbound', '_clear') + _attrs_ = ('length', '_items', 'lenbound', '_clear', 'arraydescr') _items = None lenbound = None length = -1 - def __init__(self, const=None, size=0, clear=False, vdescr=None): + def __init__(self, arraydescr, const=None, size=0, clear=False, + vdescr=None): from rpython.jit.metainterp.optimizeopt import intutils self.vdescr = vdescr + self.arraydescr = arraydescr if vdescr is not None: + assert vdescr is arraydescr self._init_items(const, size, clear) self.lenbound = intutils.ConstIntBound(size) self._clear = clear @@ -350,9 +353,9 @@ def all_items(self): return self._items - def copy_fields_to_const(self, constinfo, optheap): + def copy_fields_to_const(self, arraydescr, constinfo, optheap): if self._items is not None: - info = constinfo._get_array_info(optheap) + info = constinfo._get_array_info(arraydescr, optheap) info._items = self._items[:] def _force_elements(self, op, optforce, descr): @@ -371,7 +374,7 @@ optforce.emit_operation(setop) optforce.pure_from_args(rop.ARRAYLEN_GC, [op], ConstInt(len(self._items))) - def setitem(self, index, struct_op, op, cf=None, optheap=None): + def setitem(self, descr, index, struct_op, op, cf=None, optheap=None): if self._items is None: self._items = [None] * (index + 1) if index >= len(self._items): @@ -381,7 +384,7 @@ assert not self.is_virtual() cf.register_dirty_field(struct_op, self) - def getitem(self, index, optheap=None): + def getitem(self, descr, index, optheap=None): if self._items is None or index >= len(self._items): return None return self._items[index] @@ -418,7 +421,7 @@ def make_guards(self, op, short): AbstractVirtualPtrInfo.make_guards(self, op, short) if self.lenbound is not None: - lenop = ResOperation(rop.ARRAYLEN_GC, [op]) + lenop = ResOperation(rop.ARRAYLEN_GC, [op], descr=self.arraydescr) short.append(lenop) self.lenbound.make_guards(lenop, short) @@ -503,11 +506,11 @@ optheap.const_infos[ref] = info return info - def _get_array_info(self, optheap): + def _get_array_info(self, arraydescr, optheap): ref = self._const.getref_base() info = optheap.const_infos.get(ref, None) if info is None: - info = ArrayPtrInfo() + info = ArrayPtrInfo(arraydescr) optheap.const_infos[ref] = info return info @@ -515,13 +518,13 @@ info = self._get_info(optheap) return info.getfield(descr) - def getitem(self, index, optheap=None): - info = self._get_array_info(optheap) - return info.getitem(index) + def getitem(self, descr, index, optheap=None): + info = self._get_array_info(descr, optheap) + return info.getitem(descr, index) - def setitem(self, index, struct, op, cf=None, optheap=None): - info = self._get_array_info(optheap) - info.setitem(index, struct, op, cf) + def setitem(self, descr, index, struct, op, cf=None, optheap=None): + info = self._get_array_info(descr, optheap) + info.setitem(descr, index, struct, op, cf) def setfield(self, descr, struct, op, optheap=None, cf=None): info = self._get_info(optheap) diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py --- a/rpython/jit/metainterp/optimizeopt/rewrite.py +++ b/rpython/jit/metainterp/optimizeopt/rewrite.py @@ -549,7 +549,7 @@ # XXX fish fish fish for index in range(length.getint()): if source_info and source_info.is_virtual(): - val = source_info.getitem(index + source_start) + val = source_info.getitem(arraydescr, index + source_start) else: opnum = OpHelpers.getarrayitem_for_descr(arraydescr) newop = ResOperation(opnum, @@ -561,7 +561,7 @@ if val is None: continue if dest_info and dest_info.is_virtual(): - dest_info.setitem(index + dest_start, + dest_info.setitem(arraydescr, index + dest_start, self.get_box_replacement(op.getarg(2)), val) else: diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py b/rpython/jit/metainterp/optimizeopt/shortpreamble.py --- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py +++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py @@ -69,7 +69,8 @@ else: index = g.getarg(1).getint() assert index >= 0 - opinfo.setitem(index, self.res, pop, optheap=optheap) + opinfo.setitem(self.getfield_op.getdescr(), index, self.res, + pop, optheap=optheap) def add_op_to_short(self, sb): sop = self.getfield_op diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py --- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py @@ -489,7 +489,7 @@ info2 = VArrayStateInfo(descr) info2.fieldstate = [innerinfo2] - value1 = info.ArrayPtrInfo(vdescr=descr, size=1) + value1 = info.ArrayPtrInfo(descr, vdescr=descr, size=1) box = InputArgRef(self.nodeaddr) value1._items[0] = box diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py --- a/rpython/jit/metainterp/optimizeopt/unroll.py +++ b/rpython/jit/metainterp/optimizeopt/unroll.py @@ -48,7 +48,7 @@ if known_class: self.make_constant_class(op, known_class, False) if isinstance(preamble_info, info.ArrayPtrInfo): - arr_info = info.ArrayPtrInfo(None) + arr_info = info.ArrayPtrInfo(preamble_info.arraydescr) arr_info.lenbound = preamble_info.getlenbound(None) op.set_forwarded(arr_info) if preamble_info.is_nonnull(): @@ -210,25 +210,27 @@ def inline_short_preamble(self, jump_args, short_inputargs, short_ops, short_jump_op, patchguardop): - self._check_no_forwarding([short_inputargs, short_ops], False) - assert len(short_inputargs) == len(jump_args) - for i in range(len(jump_args)): - short_inputargs[i].set_forwarded(None) - self.make_equal_to(short_inputargs[i], jump_args[i]) - for op in short_ops: - if op.is_guard(): - op = self.replace_op_with(op, op.getopnum(), - descr=compile.ResumeAtPositionDescr()) - op.rd_snapshot = patchguardop.rd_snapshot - op.rd_frame_info_list = patchguardop.rd_frame_info_list - self.optimizer.send_extra_operation(op) - res = [self.optimizer.get_box_replacement(op) for op in - short_jump_op] - for op in short_inputargs: - op.set_forwarded(None) - for op in short_ops: - op.set_forwarded(None) - return res + try: + self._check_no_forwarding([short_inputargs, short_ops], False) + assert len(short_inputargs) == len(jump_args) + for i in range(len(jump_args)): + short_inputargs[i].set_forwarded(None) + self.make_equal_to(short_inputargs[i], jump_args[i]) + for op in short_ops: + if op.is_guard(): + op = self.replace_op_with(op, op.getopnum(), + descr=compile.ResumeAtPositionDescr()) + op.rd_snapshot = patchguardop.rd_snapshot + op.rd_frame_info_list = patchguardop.rd_frame_info_list + self.optimizer.send_extra_operation(op) + res = [self.optimizer.get_box_replacement(op) for op in + short_jump_op] + return res + finally: + for op in short_inputargs: + op.set_forwarded(None) + for op in short_ops: + op.set_forwarded(None) def export_state(self, start_label, original_label_args, renamed_inputargs): end_args = [self.get_box_replacement(a) for a in original_label_args] diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py --- a/rpython/jit/metainterp/optimizeopt/virtualize.py +++ b/rpython/jit/metainterp/optimizeopt/virtualize.py @@ -28,7 +28,8 @@ opinfo = info.ArrayStructInfo(size, vdescr=arraydescr) else: const = self.new_const_item(arraydescr) - opinfo = info.ArrayPtrInfo(const, size, clear, vdescr=arraydescr) + opinfo = info.ArrayPtrInfo(arraydescr, const, size, clear, + vdescr=arraydescr) newop = self.replace_op_with(source_op, source_op.getopnum()) newop.set_forwarded(opinfo) return opinfo @@ -277,7 +278,7 @@ if opinfo and opinfo.is_virtual(): indexbox = self.get_constant_box(op.getarg(1)) if indexbox is not None: - item = opinfo.getitem(indexbox.getint()) + item = opinfo.getitem(op.getdescr(), indexbox.getint()) if item is None: # reading uninitialized array items? assert False, "can't read uninitialized items" itemvalue = value.constvalue # bah, just return 0 @@ -299,7 +300,7 @@ if opinfo and opinfo.is_virtual(): indexbox = self.get_constant_box(op.getarg(1)) if indexbox is not None: - opinfo.setitem(indexbox.getint(), + opinfo.setitem(op.getdescr(), indexbox.getint(), self.get_box_replacement(op.getarg(0)), self.get_box_replacement(op.getarg(2))) return diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py b/rpython/jit/metainterp/optimizeopt/virtualstate.py --- a/rpython/jit/metainterp/optimizeopt/virtualstate.py +++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py @@ -223,7 +223,7 @@ if len(self.fieldstate) > info.getlength(): raise BadVirtualState for i in range(len(self.fieldstate)): - fieldbox = info.getitem(i) + fieldbox = info.getitem(self.arraydescr, i) if fieldbox is None: xxx v = value.get_missing_null_value() diff --git a/rpython/jit/metainterp/test/test_resume.py b/rpython/jit/metainterp/test/test_resume.py --- a/rpython/jit/metainterp/test/test_resume.py +++ b/rpython/jit/metainterp/test/test_resume.py @@ -1285,7 +1285,8 @@ modifier.liveboxes = {} modifier.vfieldboxes = {} - v2 = info.ArrayPtrInfo(vdescr=LLtypeMixin.arraydescr, size=2) + v2 = info.ArrayPtrInfo(LLtypeMixin.arraydescr, + vdescr=LLtypeMixin.arraydescr, size=2) b2s.set_forwarded(v2) v2._items = [b4s, c1s] modifier.register_virtual_fields(b2s, [b4s, c1s]) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit