Author: Maciej Fijalkowski <fij...@gmail.com> Branch: resume-refactor Changeset: r68994:4726582b17ae Date: 2014-01-29 16:06 +0100 http://bitbucket.org/pypy/pypy/changeset/4726582b17ae/
Log: finish plumbing until we pass a few more tests diff --git a/TODO b/TODO --- a/TODO +++ b/TODO @@ -5,5 +5,6 @@ * compress the resumedata in the backend -* do escape analysis in the resumeopt.py +* do escape analysis in the resume/optimizer.py +* make_a_counter_per_value got screwed, but a bit no clue what it does 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 @@ -499,24 +499,23 @@ def make_a_counter_per_value(self, guard_value_op): assert guard_value_op.getopnum() == rop.GUARD_VALUE + # XXX I have no clue what exactly it does, but we killed failargs + # so i is always 0 now box = guard_value_op.getarg(0) - try: - i = guard_value_op.getfailargs().index(box) - except ValueError: - return # xxx probably very rare + i = 0 + # used to be i = guard_value_op.getfailargs().index(box) + if i > self.CNT_BASE_MASK: + return # probably never, but better safe than sorry + if box.type == history.INT: + cnt = self.CNT_INT + elif box.type == history.REF: + cnt = self.CNT_REF + elif box.type == history.FLOAT: + cnt = self.CNT_FLOAT else: - if i > self.CNT_BASE_MASK: - return # probably never, but better safe than sorry - if box.type == history.INT: - cnt = self.CNT_INT - elif box.type == history.REF: - cnt = self.CNT_REF - elif box.type == history.FLOAT: - cnt = self.CNT_FLOAT - else: - assert 0, box.type - assert cnt > self.CNT_BASE_MASK - self._counter = cnt | i + assert 0, box.type + assert cnt > self.CNT_BASE_MASK + self._counter = cnt | i def handle_fail(self, deadframe, metainterp_sd, jitdriver_sd): if self.must_compile(deadframe, metainterp_sd, jitdriver_sd): 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 @@ -415,7 +415,6 @@ op = short[i] if op.is_guard(): op = op.clone() - op.setfailargs(None) descr = target_token.resume_at_jump_descr.clone_if_mutable() op.setdescr(descr) short[i] = op @@ -583,7 +582,6 @@ for guard in extra_guards: if guard.is_guard(): descr = target.resume_at_jump_descr.clone_if_mutable() - inliner.inline_descr_inplace(descr) guard.setdescr(descr) self.optimizer.send_extra_operation(guard) diff --git a/rpython/jit/metainterp/test/test_loop_unroll.py b/rpython/jit/metainterp/test/test_loop_unroll.py --- a/rpython/jit/metainterp/test/test_loop_unroll.py +++ b/rpython/jit/metainterp/test/test_loop_unroll.py @@ -8,7 +8,7 @@ enable_opts = ALL_OPTS_NAMES automatic_promotion_result = { - 'int_gt': 1, 'guard_false': 1, 'jump': 1, 'int_add': 3, + 'int_gt': 2, 'guard_false': 2, 'jump': 1, 'int_add': 6, 'guard_value': 1 } diff --git a/rpython/jit/resume/backend.py b/rpython/jit/resume/backend.py --- a/rpython/jit/resume/backend.py +++ b/rpython/jit/resume/backend.py @@ -62,10 +62,10 @@ def resume_new(self, result, descr): self.deps[result] = DepsFields() - def resume_newunicode(self, result, length): + def resume_newstr(self, result, length): self.deps[result] = DepsArray(length) - def resume_concatunicode(self, result, left, right): + def resume_concatstr(self, result, left, right): self.deps[result] = DepsConcat(left, right) def resume_new_with_vtable(self, result, klass): @@ -108,13 +108,13 @@ self.resume_clear(op.getarg(0).getint(), op.getarg(1).getint()) elif op.getopnum() == rop.RESUME_NEWSTR: - xxx + self.resume_newstr(op.result, op.getarg(0).getint()) elif op.getopnum() == rop.RESUME_NEWUNICODE: - self.resume_newunicode(op.result, op.getarg(0).getint()) + self.resume_newstr(op.result, op.getarg(0).getint()) elif op.getopnum() == rop.RESUME_CONCATSTR: - xxx + self.resume_concatstr(op.result, op.getarg(0), op.getarg(1)) elif op.getopnum() == rop.RESUME_CONCATUNICODE: - self.resume_concatunicode(op.result, op.getarg(0), op.getarg(1)) + self.resume_concatstr(op.result, op.getarg(0), op.getarg(1)) elif op.getopnum() == rop.RESUME_STRSETITEM: self.resume_strsetitem(op.getarg(0), op.getarg(1).getint(), op.getarg(2)) @@ -204,13 +204,19 @@ self.builder.resume_clear(op.getarg(0).getint(), op.getarg(1).getint()) elif op.getopnum() == rop.RESUME_NEWSTR: - xxx + v_pos = len(self.virtuals) + self.virtuals[op.result] = v_pos + self.builder.resume_newstr(v_pos, op.getarg(0).getint()) elif op.getopnum() == rop.RESUME_NEWUNICODE: v_pos = len(self.virtuals) self.virtuals[op.result] = v_pos self.builder.resume_newunicode(v_pos, op.getarg(0).getint()) elif op.getopnum() == rop.RESUME_CONCATSTR: - xxx + v_pos = len(self.virtuals) + self.virtuals[op.result] = v_pos + leftpos = self.get_box_pos(op.getarg(0)) + rightpos = self.get_box_pos(op.getarg(1)) + self.builder.resume_concatstr(v_pos, leftpos, rightpos) elif op.getopnum() == rop.RESUME_CONCATUNICODE: v_pos = len(self.virtuals) self.virtuals[op.result] = v_pos diff --git a/rpython/jit/resume/frontend.py b/rpython/jit/resume/frontend.py --- a/rpython/jit/resume/frontend.py +++ b/rpython/jit/resume/frontend.py @@ -22,6 +22,7 @@ def finish(self): nextbh = None + curbh = None for frame in self.framestack: curbh = self.bhinterpbuilder.acquire_interp() curbh.nextblackholeinterp = nextbh diff --git a/rpython/jit/resume/reader.py b/rpython/jit/resume/reader.py --- a/rpython/jit/resume/reader.py +++ b/rpython/jit/resume/reader.py @@ -109,8 +109,11 @@ str2 = lltype.cast_opaque_ptr(lltype.Ptr(rstr.UNICODE), rightval) result = funcptr(str1, str2) return lltype.cast_opaque_ptr(llmemory.GCREF, result) - else: - xxx + funcptr = cic.funcptr_for_oopspec(EffectInfo.OS_STR_CONCAT) + str1 = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), leftval) + str2 = lltype.cast_opaque_ptr(lltype.Ptr(rstr.STR), rightval) + result = funcptr(str1, str2) + return lltype.cast_opaque_ptr(llmemory.GCREF, result) class AbstractResumeReader(object): """ A resume reader that can follow resume until given point. Consult @@ -258,7 +261,11 @@ self.resume_newunicode(v_pos, lgt) pos += 4 elif op == rescode.RESUME_CONCATSTR: - xxx + v_pos = self.read_short(pos + 1) + left = self.read_short(pos + 3) + right = self.read_short(pos + 5) + self.resume_concatstr(v_pos, left, right) + pos += 7 elif op == rescode.RESUME_CONCATUNICODE: v_pos = self.read_short(pos + 1) left = self.read_short(pos + 3) diff --git a/rpython/jit/resume/rescode.py b/rpython/jit/resume/rescode.py --- a/rpython/jit/resume/rescode.py +++ b/rpython/jit/resume/rescode.py @@ -100,6 +100,12 @@ self.write(index) self.write_short(encoded_source) + def resume_concatstr(self, v_pos, leftpos, rightpos): + self.write(RESUME_CONCATSTR) + self.write_short(v_pos) + self.write_short(leftpos) + self.write_short(rightpos) + def resume_newunicode(self, v_pos, lgt): self.write(RESUME_NEWUNICODE) self.write_short(v_pos) # XXX byte virtuals? _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit