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