Author: Carl Friedrich Bolz <[email protected]>
Branch: guard-compatible
Changeset: r85437:09617ecb9107
Date: 2016-06-28 16:49 +0200
http://bitbucket.org/pypy/pypy/changeset/09617ecb9107/
Log: fix the problem
when attaching a new bridge to a GuardCompatibleDescr and we cannot
find out whether the new bridge is checking conditions on the same
variable as the GuardCompatibleDescr, the guard needs to henceforth
always jump to that new trace if none of the other traces match.
Otherwise we will keep compiling more and more code.
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
@@ -1091,6 +1091,12 @@
# list of compatibility conditions about the same variable, with
# bridges attached to them
self.other_compat_conditions = []
+ # fallback jump target is the one to jump to if the generated bridges
+ # do not start with a guard_compatible at all, so we don't have a basis
+ # to decide on
+ # XXX it would be better to patch the guard properly in the backend,
+ # but later
+ self.fallback_jump_target = 0
def find_compatible(self, cpu, ref):
""" callback for the CPU: given a value ref, it returns:
@@ -1108,7 +1114,10 @@
if _compatibility_conditions.check_compat_and_activate(
cpu, ref, self.rd_loop_token):
return _compatibility_conditions.jump_target
- return 0
+ # none of the other conditions matched. if we have a
+ # fallback_jump_target, go there (otherwise we run the risk of
+ # producing arbitrary amounts of code)
+ return self.fallback_jump_target
def compile_and_attach(self, metainterp, new_loop, orig_inputargs):
# if new_loop starts with another guard_compatible on the same argument
@@ -1131,6 +1140,9 @@
self, metainterp, new_loop, orig_inputargs)
if compat_cond:
compat_cond.jump_target = asminfo.asmaddr
+ else:
+ assert self.fallback_jump_target == 0 # this can never happen twice
+ self.fallback_jump_target = asminfo.asmaddr
return asminfo
def make_a_counter_per_value(self, guard_value_op, index):
diff --git a/rpython/jit/metainterp/test/test_compatible.py
b/rpython/jit/metainterp/test/test_compatible.py
--- a/rpython/jit/metainterp/test/test_compatible.py
+++ b/rpython/jit/metainterp/test/test_compatible.py
@@ -418,8 +418,7 @@
x = self.meta_interp(main, [])
- # trace, two bridges, a finish bridge
- self.check_trace_count(4)
+ self.check_trace_count(6)
def test_merge_switch_object(self):
S = lltype.GcStruct('S', ('x', lltype.Signed))
@@ -611,7 +610,7 @@
x = self.meta_interp(main, [False])
assert x < 70
- self.check_trace_count(9)
+ self.check_trace_count(7)
self.check_resops(call_i=0)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit