Author: Maciej Fijalkowski <fij...@gmail.com> Branch: share-guard-info Changeset: r79741:070844031819 Date: 2015-09-21 17:22 +0200 http://bitbucket.org/pypy/pypy/changeset/070844031819/
Log: checkin in-progress diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py --- a/rpython/jit/metainterp/blackhole.py +++ b/rpython/jit/metainterp/blackhole.py @@ -1503,7 +1503,8 @@ elif opnum == rop.GUARD_NO_OVERFLOW: # Produced by int_xxx_ovf(). The pc is just after the opcode. # We get here because it did not used to overflow, but now it does. - return get_llexception(self.cpu, OverflowError()) + #return get_llexception(self.cpu, OverflowError()) + pass # elif opnum == rop.GUARD_OVERFLOW: # Produced by int_xxx_ovf(). The pc is just after the opcode. diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py --- a/rpython/jit/metainterp/optimizeopt/optimizer.py +++ b/rpython/jit/metainterp/optimizeopt/optimizer.py @@ -567,13 +567,15 @@ self.metainterp_sd.profiler.count(jitprof.Counters.OPT_OPS) if op.is_guard(): assert isinstance(op, GuardResOp) - if self.origin_jitcode is not None: - if (self.origin_jitcode is op.rd_frame_info_list.jitcode and - self.origin_pc is op.rd_frame_info_list.pc): - self.origin_jitcode = None - self.origin_pc = 0 - else: - return # we optimize the guard + #if self.origin_jitcode is not None: + # if (self.origin_jitcode is op.rd_frame_info_list.jitcode and + # self.origin_pc is op.rd_frame_info_list.pc): + # self.origin_jitcode = None + # self.origin_pc = 0 + # else: + # import pdb + # pdb.set_trace() + # return # we optimize the guard self.metainterp_sd.profiler.count(jitprof.Counters.OPT_GUARDS) pendingfields = self.pendingfields self.pendingfields = None @@ -595,14 +597,13 @@ def emit_guard_operation(self, op, pendingfields): guard_op = self.replace_op_with(op, op.getopnum()) if (self._last_guard_op and guard_op.getdescr() is None and - guard_op.getopnum() != rop.GUARD_VALUE and - not guard_op.same_guard_position(self._last_guard_op)): + guard_op.getopnum() != rop.GUARD_VALUE): op = self._copy_resume_data_from(guard_op, self._last_guard_op) else: op = self.store_final_boxes_in_guard(guard_op, pendingfields) - if op.getopnum() not in (rop.GUARD_EXCEPTION, rop.GUARD_OVERFLOW): - self._last_guard_op = op + #if op.getopnum() not in (rop.GUARD_EXCEPTION, rop.GUARD_OVERFLOW): + self._last_guard_op = op # for unrolling for farg in op.getfailargs(): if farg: diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py --- a/rpython/jit/metainterp/pyjitpl.py +++ b/rpython/jit/metainterp/pyjitpl.py @@ -230,13 +230,13 @@ for _opimpl in ['int_add_ovf', 'int_sub_ovf', 'int_mul_ovf']: exec py.code.Source(''' - @arguments("box", "box") - def opimpl_%s(self, b1, b2): + @arguments("box", "box", "orgpc") + def opimpl_%s(self, b1, b2, orgpc): self.metainterp.clear_exception() resbox = self.execute(rop.%s, b1, b2) self.make_result_of_lastop(resbox) # same as execute_varargs() if not isinstance(resbox, Const): - self.metainterp.handle_possible_overflow_error() + self.metainterp.handle_possible_overflow_error(orgpc) return resbox ''' % (_opimpl, _opimpl.upper())).compile() @@ -418,7 +418,7 @@ assert box.getint() == 0 target = switchdict.dict[const1.getint()] self.metainterp.generate_guard(rop.GUARD_FALSE, box, - resumepc=target) + resumepc=orgpc) else: # found one of the cases self.implement_guard_value(valuebox, orgpc) @@ -2480,11 +2480,12 @@ pass # XXX we want to do something special in resume descr, # but not now elif opnum == rop.GUARD_NO_OVERFLOW: # an overflow now detected - self.execute_raised(OverflowError(), constant=True) - try: - self.finishframe_exception() - except ChangeFrame: - pass + pass + #self.execute_raised(OverflowError(), constant=True) + #try: + # self.finishframe_exception() + #except ChangeFrame: + # pass elif opnum == rop.GUARD_OVERFLOW: # no longer overflowing self.clear_exception() else: @@ -2772,9 +2773,9 @@ else: self.generate_guard(rop.GUARD_NO_EXCEPTION, None, []) - def handle_possible_overflow_error(self): + def handle_possible_overflow_error(self, orgpc): if self.last_exc_value: - op = self.generate_guard(rop.GUARD_OVERFLOW, None) + op = self.generate_guard(rop.GUARD_OVERFLOW, None, resumepc=orgpc) op.setref_base(lltype.cast_opaque_ptr(llmemory.GCREF, self.last_exc_value)) assert self.class_of_last_exc_is_const @@ -2782,7 +2783,7 @@ lltype.cast_opaque_ptr(llmemory.GCREF, self.last_exc_value)) self.finishframe_exception() else: - self.generate_guard(rop.GUARD_NO_OVERFLOW, None) + self.generate_guard(rop.GUARD_NO_OVERFLOW, None, resumepc=orgpc) def assert_no_exception(self): assert not self.last_exc_value diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py --- a/rpython/jit/metainterp/resoperation.py +++ b/rpython/jit/metainterp/resoperation.py @@ -378,12 +378,6 @@ newop.rd_frame_info_list = self.rd_frame_info_list return newop - def same_guard_position(self, other): - assert isinstance(other, GuardResOp) - frame_info1 = self.rd_frame_info_list - frame_info2 = other.rd_frame_info_list - return (frame_info1.jitcode is frame_info2.jitcode and - frame_info1.pc == frame_info2.pc) # =========== # type mixins diff --git a/rpython/jit/metainterp/test/test_ajit.py b/rpython/jit/metainterp/test/test_ajit.py --- a/rpython/jit/metainterp/test/test_ajit.py +++ b/rpython/jit/metainterp/test/test_ajit.py @@ -723,6 +723,7 @@ elif n == 7: a = 3 else: a = 2 x = intmask(x * 10 + a) + #print "XXXXXXXXXXXXXXXX", x i += 1 return x res = self.meta_interp(f, [0], backendopt=True) @@ -1866,7 +1867,8 @@ res = self.meta_interp(g, [6, 20]) assert res == g(6, 20) self.check_trace_count(8) - self.check_resops(getarrayitem_gc_i=10) + # 6 extra from sharing guard data + self.check_resops(getarrayitem_gc_i=10 + 6) def test_multiple_specialied_versions_bridge(self): myjitdriver = JitDriver(greens = [], reds = ['y', 'x', 'z', 'res']) @@ -2055,8 +2057,8 @@ res = self.meta_interp(g, [3, 23]) assert res == 7068153 self.check_trace_count(6) - self.check_resops(guard_true=6, guard_class=2, int_mul=3, - int_add=3, guard_false=3) + self.check_resops(guard_true=8, guard_class=2, int_mul=3, + int_add=3, guard_false=4) def test_dont_trace_every_iteration(self): myjitdriver = JitDriver(greens = [], reds = ['a', 'b', 'i', 'sa']) @@ -2079,7 +2081,7 @@ self.check_enter_count(2) def test_current_trace_length(self): - myjitdriver = JitDriver(greens = ['g'], reds = ['x']) + myjitdriver = JitDriver(greens = ['g'], reds = ['x', 'l']) @dont_look_inside def residual(): print "hi there" @@ -2090,14 +2092,15 @@ residual() y += 1 def f(x, g): + l = [] n = 0 while x > 0: - myjitdriver.can_enter_jit(x=x, g=g) - myjitdriver.jit_merge_point(x=x, g=g) + myjitdriver.can_enter_jit(x=x, g=g, l=l) + myjitdriver.jit_merge_point(x=x, g=g, l=l) loop(g) x -= 1 - n = current_trace_length() - return n + l.append(current_trace_length()) + return l[-2] # not the blackholed version res = self.meta_interp(f, [5, 8]) assert 14 < res < 42 res = self.meta_interp(f, [5, 2]) @@ -2638,7 +2641,7 @@ i += 1 return sa assert self.meta_interp(f, [20]) == f(20) - self.check_resops(int_lt=4, int_le=0, int_ge=0, int_gt=2) + self.check_resops(int_lt=4, int_le=0, int_ge=0, int_gt=4) def test_intbounds_not_generalized1(self): myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'sa']) @@ -2655,7 +2658,7 @@ i += 1 return sa assert self.meta_interp(f, [20]) == f(20) - self.check_resops(int_lt=6, int_le=2, int_ge=4, int_gt=3) + self.check_resops(int_lt=6, int_le=2, int_ge=4, int_gt=5) def test_intbounds_not_generalized2(self): @@ -2676,7 +2679,7 @@ i += 1 return sa assert self.meta_interp(f, [20]) == f(20) - self.check_resops(int_lt=4, int_le=3, int_ge=3, int_gt=2) + self.check_resops(int_lt=4, int_le=3, int_ge=3, int_gt=4) def test_retrace_limit1(self): myjitdriver = JitDriver(greens = [], reds = ['n', 'i', 'sa', 'a']) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit