Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult-unroll Changeset: r78910:7c3ad0460623 Date: 2015-08-11 14:53 +0200 http://bitbucket.org/pypy/pypy/changeset/7c3ad0460623/
Log: fix test_bug_3 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 @@ -128,6 +128,9 @@ assert not self.is_virtual() self._fields = [None] * len(self._fields) + def all_items(self): + return self._fields + def setfield(self, descr, struct, op, optheap=None, cf=None): self.init_fields(descr.get_parent_descr(), descr.get_index()) assert isinstance(op, AbstractValue) @@ -175,7 +178,6 @@ getfield_op = ResOperation(opnum, [structbox], descr=descr) shortboxes.add_heap_op(op, getfield_op) - class InstancePtrInfo(AbstractStructPtrInfo): _attrs_ = ('_known_class',) _fields = None @@ -193,6 +195,14 @@ assert self.is_virtual() return visitor.visit_virtual(self.vdescr, fielddescrs) + def make_guards(self, op, short): + if self._known_class is not None: + op = ResOperation(rop.GUARD_NONNULL_CLASS, [op, self._known_class], + None) + short.append(op) + else: + AbstractStructPtrInfo.make_guards(self, op, short) + class StructPtrInfo(AbstractStructPtrInfo): def __init__(self, vdescr=None): self.vdescr = vdescr diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -2776,7 +2776,7 @@ p3 = getfield_gc_r(p1, descr=otherdescr) guard_nonnull(ConstPtr(nodeaddr)) [] guard_class(p3, ConstClass(node_vtable)) [] - setfield_gc(p3, p2, descr=otherdescr) + setfield_gc(p3, p2, descr=nextdescr) p1a = new_with_vtable(descr=nodesize2) p2a = new_with_vtable(descr=nodesize) p3a = new_with_vtable(descr=nodesize) @@ -2793,7 +2793,7 @@ p3 = getfield_gc_r(p1, descr=otherdescr) guard_class(p3, ConstClass(node_vtable)) [] p3a = new_with_vtable(descr=nodesize) - setfield_gc(p3, p2, descr=otherdescr) + setfield_gc(p3, p2, descr=nextdescr) escape_n(p3a) jump(p3a) """ @@ -2807,7 +2807,7 @@ # p2a = new_with_vtable(descr=nodesize) p3anew = new_with_vtable(descr=nodesize) p2 = new_with_vtable(descr=nodesize) - setfield_gc(p3a, p2, descr=otherdescr) # p3a.other = p2a + setfield_gc(p3a, p2, descr=nextdescr) # p3a.other = p2a escape_n(p3anew) jump(p3anew) """ @@ -2819,10 +2819,10 @@ guard_nonnull(p1) [] guard_class(p1, ConstClass(node_vtable2)) [] p2 = getfield_gc_r(p1, descr=nextdescr) - guard_nonnull(12) [] + guard_nonnull(ConstPtr(nodeaddr)) [] guard_class(p2, ConstClass(node_vtable)) [] p3 = getfield_gc_r(p1, descr=otherdescr) - guard_nonnull(12) [] + guard_nonnull(ConstPtr(nodeaddr)) [] guard_class(p3, ConstClass(node_vtable)) [] p1a = new_with_vtable(descr=nodesize2) p2a = new_with_vtable(descr=nodesize) 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 @@ -26,12 +26,22 @@ return op return preamble_op - def setinfo_from_preamble(self, op, preamble_info): + def setinfo_from_preamble_list(self, lst, infos): + for item in lst: + if item is None: + continue + i = infos.get(item, None) + if i is not None: + self.setinfo_from_preamble(item, i, infos) + + def setinfo_from_preamble(self, op, preamble_info, exported_infos): op = self.get_box_replacement(op) if isinstance(preamble_info, info.PtrInfo): if preamble_info.is_virtual(): # XXX do we want to sanitize this? op.set_forwarded(preamble_info) + self.setinfo_from_preamble_list(preamble_info.all_items(), + exported_infos) return if op.is_constant(): return # nothing we can learn @@ -245,6 +255,8 @@ for arg in end_args: infos[arg] = self.optimizer.getinfo(arg) label_args = virtual_state.make_inputargs(end_args, self.optimizer) + for arg in label_args: + infos[arg] = self.optimizer.getinfo(arg) sb = ShortBoxes() short_boxes = sb.create_short_boxes(self.optimizer, renamed_inputargs, label_args) @@ -314,7 +326,8 @@ source.set_forwarded(target) info = exported_state.exported_infos.get(target, None) if info is not None: - self.optimizer.setinfo_from_preamble(source, info) + self.optimizer.setinfo_from_preamble(source, info, + exported_state.exported_infos) # import the optimizer state, starting from boxes that can be produced # by short preamble self.short_preamble_producer = ShortPreambleBuilder( _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit