Author: Carl Friedrich Bolz <cfb...@gmx.de> Branch: optinfo-into-bridges-3 Changeset: r90290:7385c2391c79 Date: 2017-02-21 21:04 +0100 http://bitbucket.org/pypy/pypy/changeset/7385c2391c79/
Log: a general resume improvement: move the rd_count into the resumecode diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py --- a/rpython/jit/metainterp/compile.py +++ b/rpython/jit/metainterp/compile.py @@ -872,10 +872,9 @@ class ResumeGuardDescr(AbstractResumeGuardDescr): - _attrs_ = ('rd_numb', 'rd_count', 'rd_consts', 'rd_virtuals', + _attrs_ = ('rd_numb', 'rd_consts', 'rd_virtuals', 'rd_pendingfields', 'status') rd_numb = lltype.nullptr(NUMBERING) - rd_count = 0 rd_consts = None rd_virtuals = None rd_pendingfields = lltype.nullptr(PENDINGFIELDSP.TO) @@ -884,7 +883,6 @@ if isinstance(other, ResumeGuardCopiedDescr): other = other.prev assert isinstance(other, ResumeGuardDescr) - self.rd_count = other.rd_count self.rd_consts = other.rd_consts self.rd_pendingfields = other.rd_pendingfields self.rd_virtuals = other.rd_virtuals @@ -897,7 +895,6 @@ def store_final_boxes(self, guard_op, boxes, metainterp_sd): guard_op.setfailargs(boxes) - self.rd_count = len(boxes) self.store_hash(metainterp_sd) def clone(self): diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py --- a/rpython/jit/metainterp/resume.py +++ b/rpython/jit/metainterp/resume.py @@ -256,7 +256,8 @@ def number(self, optimizer, position, trace): snapshot_iter = trace.get_snapshot_iter(position) numb_state = NumberingState(snapshot_iter.size) - numb_state.append_int(0) # patch later + numb_state.append_int(0) # patch later: size of resume section + numb_state.append_int(0) # patch later: number of failargs arr = snapshot_iter.vable_array @@ -461,6 +462,8 @@ self._number_virtuals(liveboxes, optimizer, num_virtuals) self._add_pending_fields(optimizer, pending_setfields) + numb_state.patch(1, len(liveboxes)) + self._add_optimizer_sections(numb_state, liveboxes, liveboxes_from_env) storage.rd_numb = numb_state.create_numbering() storage.rd_consts = self.memo.consts @@ -929,9 +932,9 @@ def _init(self, cpu, storage): self.cpu = cpu self.resumecodereader = resumecode.Reader(storage.rd_numb) - count = self.resumecodereader.next_item() - self.items_resume_section = count - self.count = storage.rd_count + items_resume_section = self.resumecodereader.next_item() + self.items_resume_section = items_resume_section + self.count = self.resumecodereader.next_item() self.consts = storage.rd_consts def _prepare(self, storage): @@ -1075,7 +1078,7 @@ self._init(metainterp.cpu, storage) self.deadframe = deadframe self.metainterp = metainterp - self.liveboxes = [None] * storage.rd_count + self.liveboxes = [None] * self.count self._prepare(storage) def consume_boxes(self, info, boxes_i, boxes_r, boxes_f): diff --git a/rpython/jit/metainterp/resumecode.py b/rpython/jit/metainterp/resumecode.py --- a/rpython/jit/metainterp/resumecode.py +++ b/rpython/jit/metainterp/resumecode.py @@ -2,7 +2,8 @@ """ Resume bytecode. It goes as following: # ----- resume section - [total size of resume section, unencoded] + [total size of resume section] + [number of failargs] [<length> <virtualizable object> <numb> <numb> <numb>] if vinfo is not None -OR- [1 <ginfo object>] if ginfo is not None 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 @@ -36,7 +36,6 @@ rd_consts = [] rd_virtuals = None rd_pendingfields = None - rd_count = 0 class FakeOptimizer(object): @@ -302,12 +301,11 @@ c1, c2, c3 = [ConstInt(111), ConstInt(222), ConstInt(333)] storage = Storage() storage.rd_consts = [c1, c2, c3] - numb = Numbering([tag(0, TAGBOX), tagconst(0), + numb = Numbering([3, tag(0, TAGBOX), tagconst(0), NULLREF, tag(0, TAGBOX), tag(1, TAGBOX)] + - [tagconst(1), tagconst(2)] + + [tagconst(1), tagconst(2)] + [tag(0, TAGBOX), tag(1, TAGBOX), tag(2, TAGBOX)]) storage.rd_numb = numb - storage.rd_count = 3 # cpu = MyCPU([42, gcref1, -66]) metainterp = MyMetaInterp(cpu) @@ -348,7 +346,7 @@ def test_simple_read_tagged_ints(): storage = Storage() storage.rd_consts = [] - numb = Numbering([tag(100, TAGINT)]) + numb = Numbering([1, tag(100, TAGINT)]) storage.rd_numb = numb # cpu = MyCPU([]) @@ -365,10 +363,9 @@ return s class FakeStorage(object): rd_virtuals = [FakeVinfo(), None] - rd_numb = Numbering([]) + rd_numb = Numbering([1]) rd_consts = [] rd_pendingfields = None - rd_count = 0 class FakeMetainterp(object): _already_allocated_resume_virtuals = None cpu = None @@ -776,12 +773,12 @@ assert untag(tagged) == (44, TAGINT) tagged = memo.getconst(ConstInt(-3)) assert untag(tagged) == (-3, TAGINT) - const = ConstInt(50000) + const = ConstInt(5000000) tagged = memo.getconst(const) index, tagbits = untag(tagged) assert tagbits == TAGCONST assert memo.consts[index - TAG_CONST_OFFSET] is const - tagged = memo.getconst(ConstInt(50000)) + tagged = memo.getconst(ConstInt(5000000)) index2, tagbits = untag(tagged) assert tagbits == TAGCONST assert index2 == index @@ -861,7 +858,7 @@ base = [0, 0, tag(0, TAGBOX), tag(1, TAGINT), tag(1, TAGBOX), tag(0, TAGBOX), tag(2, TAGINT)] - assert unpack_numbering(numb) == [16, 0, 0] + base + [0, 2, tag(3, TAGINT), tag(2, TAGBOX), + assert unpack_numbering(numb) == [17, 0, 0, 0] + base + [0, 2, tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(1, TAGINT)] t.append(0) snap2 = t.create_top_snapshot(FakeJitCode("jitcode", 0), 2, Frame(env2), @@ -875,7 +872,7 @@ assert numb_state2.liveboxes == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX), b3: tag(2, TAGBOX)} assert numb_state2.liveboxes is not numb_state.liveboxes - assert unpack_numbering(numb2) == [16, 0, 0] + base + [0, 2, tag(3, TAGINT), tag(2, TAGBOX), + assert unpack_numbering(numb2) == [17, 0, 0, 0] + base + [0, 2, tag(3, TAGINT), tag(2, TAGBOX), tag(0, TAGBOX), tag(3, TAGINT)] t.append(0) @@ -897,7 +894,7 @@ assert numb_state3.num_virtuals == 0 assert numb_state3.liveboxes == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX)} - assert unpack_numbering(numb3) == ([16, 0, 2, tag(3, TAGINT), tag(4, TAGINT), + assert unpack_numbering(numb3) == ([17, 0, 0, 2, tag(3, TAGINT), tag(4, TAGINT), tag(0, TAGBOX), tag(3, TAGINT)] + base + [0, 2]) @@ -914,7 +911,7 @@ assert numb_state4.liveboxes == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX), b4: tag(0, TAGVIRTUAL)} - assert unpack_numbering(numb4) == [16, 0, 2, tag(3, TAGINT), tag(0, TAGVIRTUAL), + assert unpack_numbering(numb4) == [17, 0, 0, 2, tag(3, TAGINT), tag(0, TAGVIRTUAL), tag(0, TAGBOX), tag(3, TAGINT)] + base + [0, 2] t.append(0) @@ -933,7 +930,7 @@ assert numb_state5.liveboxes == {b1: tag(0, TAGBOX), b2: tag(1, TAGBOX), b4: tag(0, TAGVIRTUAL), b5: tag(1, TAGVIRTUAL)} - assert unpack_numbering(numb5) == [21, + assert unpack_numbering(numb5) == [22, 0, 3, tag(0, TAGBOX), tag(0, TAGVIRTUAL), tag(1, TAGVIRTUAL), 0] + base + [ 2, 1, tag(3, TAGINT), tag(0, TAGVIRTUAL), tag(0, TAGBOX), tag(3, TAGINT) @@ -954,14 +951,15 @@ l = unpack_numbering(numb) assert l[0] == len(l) assert l[1] == 0 + assert l[1] == 0 assert l[2] == 0 assert l[3] == 0 assert l[4] == 0 mapping = dict(zip(inpargs, i.inputargs)) for i, item in enumerate(lst): - v, tag = untag(l[i + 5]) + v, tag = untag(l[i + 6]) if tag == TAGBOX: - assert l[i + 5] == numb_state.liveboxes[mapping[item]] + assert l[i + 6] == numb_state.liveboxes[mapping[item]] elif tag == TAGCONST: assert memo.consts[v].getint() == item.getint() elif tag == TAGINT: @@ -1081,7 +1079,7 @@ _next_section(reader, sys.maxint, 2**16, -65) def test_virtual_adder_memo_const_sharing(): - b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**16), ConstInt(-65)] + b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**23), ConstInt(-65)] storage, t = make_storage(b1s, b2s, b3s) metainterp_sd = FakeMetaInterpStaticData() memo = ResumeDataLoopMemo(metainterp_sd) @@ -1091,7 +1089,7 @@ assert len(memo.consts) == 2 assert storage.rd_consts is memo.consts - b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**17), ConstInt(-65)] + b1s, b2s, b3s = [ConstInt(sys.maxint), ConstInt(2**24), ConstInt(-65)] storage2, t = make_storage(b1s, b2s, b3s) i = t.get_iter() modifier2 = ResumeDataVirtualAdder(FakeOptimizer(i), storage2, storage2, @@ -1234,7 +1232,7 @@ liveboxes = [] modifier._number_virtuals(liveboxes, FakeOptimizer(), 0) storage.rd_consts = memo.consts[:] - storage.rd_numb = Numbering([]) + storage.rd_numb = Numbering([0]) # resume b3t, b5t = [IntFrontendOp(0), RefFrontendOp(0)] b5t.setref_base(demo55o) @@ -1305,7 +1303,7 @@ modifier._number_virtuals(liveboxes, FakeOptimizer(), 0) dump_storage(storage, liveboxes) storage.rd_consts = memo.consts[:] - storage.rd_numb = Numbering([]) + storage.rd_numb = Numbering([0]) # resume b1t, b3t, b4t = [IntFrontendOp(0), IntFrontendOp(0), IntFrontendOp(0)] b1t.setint(11) @@ -1358,7 +1356,7 @@ modifier._number_virtuals(liveboxes, FakeOptimizer(), 0) dump_storage(storage, liveboxes) storage.rd_consts = memo.consts[:] - storage.rd_numb = Numbering([]) + storage.rd_numb = Numbering([0]) b4t = RefFrontendOp(0) newboxes = _resume_remap(liveboxes, [#b2s -- virtual b4s], b4t) @@ -1404,7 +1402,7 @@ modifier._add_pending_fields(FakeOptimizer(), [ ResOperation(rop.SETFIELD_GC, [b2s, b4s], descr=LLtypeMixin.nextdescr)]) storage.rd_consts = memo.consts[:] - storage.rd_numb = Numbering([]) + storage.rd_numb = Numbering([0]) # resume demo55.next = lltype.nullptr(LLtypeMixin.NODE) b2t = RefFrontendOp(0) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit