Author: Maciej Fijalkowski <fij...@gmail.com> Branch: share-guard-info Changeset: r79747:28f21fa3e33a Date: 2015-09-21 21:55 +0200 http://bitbucket.org/pypy/pypy/changeset/28f21fa3e33a/
Log: progress on overflow 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 @@ -402,9 +402,12 @@ def bhimpl_int_sub_ovf(a, b): return ovfcheck(a - b) - @arguments("i", "i", returns="i") - def bhimpl_int_mul_ovf(a, b): - return ovfcheck(a * b) + @arguments("L", "i", "i", returns="i") + def bhimpl_int_mul_jump_if_ovf(label, a, b): + try: + return ovfcheck(a * b) + except OverflowError: + xxx @arguments("i", "i", returns="i") def bhimpl_int_floordiv(a, b): diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py --- a/rpython/jit/metainterp/executor.py +++ b/rpython/jit/metainterp/executor.py @@ -251,9 +251,10 @@ b = box2.getint() try: z = ovfcheck(a + b) + metainterp.ovf_flag = False except OverflowError: assert metainterp is not None - metainterp.execute_raised(OverflowError(), constant=True) + metainterp.ovf_flag = True z = 0 return z @@ -262,9 +263,10 @@ b = box2.getint() try: z = ovfcheck(a - b) + metainterp.ovf_flag = False except OverflowError: assert metainterp is not None - metainterp.execute_raised(OverflowError(), constant=True) + metainterp.ovf_flag = True z = 0 return z @@ -273,9 +275,10 @@ b = box2.getint() try: z = ovfcheck(a * b) + metainterp.ovf_flag = False except OverflowError: assert metainterp is not None - metainterp.execute_raised(OverflowError(), constant=True) + metainterp.ovf_flag = True z = 0 return z 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 @@ -228,17 +228,19 @@ ''' % (_opimpl, FASTPATHS_SAME_BOXES[_opimpl.split("_")[-1]], _opimpl.upper()) ).compile() - for _opimpl in ['int_add_ovf', 'int_sub_ovf', 'int_mul_ovf']: + for (_opimpl, resop) in [ + ('int_add_jump_if_ovf', 'INT_ADD_OVF'), + ('int_sub_jump_if_ovf', 'INT_SUB_OVF'), + ('int_mul_jump_if_ovf', 'INT_MUL_OVF')]: exec py.code.Source(''' - @arguments("box", "box", "orgpc") - def opimpl_%s(self, b1, b2, orgpc): - self.metainterp.clear_exception() + @arguments("label", "box", "box", "orgpc") + def opimpl_%s(self, lbl, b1, b2, orgpc): 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(orgpc) + self.metainterp.handle_possible_overflow_error(lbl, orgpc) return resbox - ''' % (_opimpl, _opimpl.upper())).compile() + ''' % (_opimpl, resop)).compile() for _opimpl in ['int_is_true', 'int_is_zero', 'int_neg', 'int_invert', 'cast_float_to_int', 'cast_int_to_float', @@ -2308,7 +2310,7 @@ if isinstance(key, compile.ResumeAtPositionDescr): self.seen_loop_header_for_jdindex = self.jitdriver_sd.index try: - self.prepare_resume_from_failure(key.guard_opnum, deadframe) + self.prepare_resume_from_failure(deadframe) if self.resumekey_original_loop_token is None: # very rare case raise SwitchToBlackhole(Counters.ABORT_BRIDGE) self.interpret() @@ -2451,7 +2453,8 @@ else: assert 0 self.jitdriver_sd.warmstate.execute_assembler(loop_token, *args) - def prepare_resume_from_failure(self, opnum, deadframe): + def prepare_resume_from_failure(self, deadframe): + xxx frame = self.framestack[-1] if opnum == rop.GUARD_FUTURE_CONDITION: pass @@ -2773,15 +2776,10 @@ else: self.generate_guard(rop.GUARD_NO_EXCEPTION, None, []) - def handle_possible_overflow_error(self, orgpc): - if self.last_exc_value: - 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 - self.last_exc_box = ConstPtr( - lltype.cast_opaque_ptr(llmemory.GCREF, self.last_exc_value)) - self.finishframe_exception() + def handle_possible_overflow_error(self, label, orgpc): + if self.ovf_flag: + self.generate_guard(rop.GUARD_OVERFLOW, None, resumepc=orgpc) + self.pc = label else: self.generate_guard(rop.GUARD_NO_OVERFLOW, None, resumepc=orgpc) 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 @@ -691,7 +691,7 @@ 'GUARD_NO_EXCEPTION/0d/n', # may be called with an exception currently set 'GUARD_EXCEPTION/1d/r', # may be called with an exception currently set 'GUARD_NO_OVERFLOW/0d/n', - 'GUARD_OVERFLOW/0d/r', + 'GUARD_OVERFLOW/0d/n', 'GUARD_NOT_FORCED/0d/n', # may be called with an exception currently set 'GUARD_NOT_FORCED_2/0d/n', # same as GUARD_NOT_FORCED, but for finish() 'GUARD_NOT_INVALIDATED/0d/n', 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 @@ -154,7 +154,10 @@ myjitdriver.can_enter_jit(x=x, y=y, res=res) myjitdriver.jit_merge_point(x=x, y=y, res=res) b = y * 2 - res += ovfcheck(x * x) + b + try: + res += ovfcheck(x * x) + b + except OverflowError: + assert 0 y -= 1 return res res = self.meta_interp(f, [6, 7]) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit