Author: Maciej Fijalkowski <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit