[pypy-commit] pypy default: Fix for an obscure case in which prejit_optimizations() renames
arigo
noreply at buildbot.pypy.org
Sat Sep 3 10:35:03 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch:
Changeset: r47035:e24ce043ef77
Date: 2011-09-03 10:34 +0200
http://bitbucket.org/pypy/pypy/changeset/e24ce043ef77/
Log: Fix for an obscure case in which prejit_optimizations() renames some
variables in the jit_merge_point, after which the original op cannot
be found in the graph any more.
diff --git a/pypy/jit/metainterp/warmspot.py b/pypy/jit/metainterp/warmspot.py
--- a/pypy/jit/metainterp/warmspot.py
+++ b/pypy/jit/metainterp/warmspot.py
@@ -130,8 +130,15 @@
results = _find_jit_marker(graphs, 'jit_merge_point')
if not results:
raise Exception("no jit_merge_point found!")
+ seen = set([graph for graph, block, pos in results])
+ assert len(seen) == len(results), (
+ "found several jit_merge_points in the same graph")
return results
+def locate_jit_merge_point(graph):
+ [(graph, block, pos)] = find_jit_merge_points([graph])
+ return block, pos, block.operations[pos]
+
def find_set_param(graphs):
return _find_jit_marker(graphs, 'set_param')
@@ -235,7 +242,7 @@
def split_graph_and_record_jitdriver(self, graph, block, pos):
op = block.operations[pos]
jd = JitDriverStaticData()
- jd._jit_merge_point_pos = (graph, op)
+ jd._jit_merge_point_in = graph
args = op.args[2:]
s_binding = self.translator.annotator.binding
jd._portal_args_s = [s_binding(v) for v in args]
@@ -504,7 +511,8 @@
self.make_args_specification(jd)
def make_args_specification(self, jd):
- graph, op = jd._jit_merge_point_pos
+ graph = jd._jit_merge_point_in
+ _, _, op = locate_jit_merge_point(graph)
greens_v, reds_v = support.decode_hp_hint_args(op)
ALLARGS = [v.concretetype for v in (greens_v + reds_v)]
jd._green_args_spec = [v.concretetype for v in greens_v]
@@ -552,7 +560,7 @@
assert jitdriver in sublists, \
"can_enter_jit with no matching jit_merge_point"
jd, sublist = sublists[jitdriver]
- origportalgraph = jd._jit_merge_point_pos[0]
+ origportalgraph = jd._jit_merge_point_in
if graph is not origportalgraph:
sublist.append((graph, block, index))
jd.no_loop_header = False
@@ -582,7 +590,7 @@
can_enter_jits = [(jd.portal_graph, jd.portal_graph.startblock, 0)]
for graph, block, index in can_enter_jits:
- if graph is jd._jit_merge_point_pos[0]:
+ if graph is jd._jit_merge_point_in:
continue
op = block.operations[index]
@@ -640,7 +648,7 @@
# while 1:
# more stuff
#
- origportalgraph = jd._jit_merge_point_pos[0]
+ origportalgraph = jd._jit_merge_point_in
portalgraph = jd.portal_graph
PORTALFUNC = jd._PORTAL_FUNCTYPE
@@ -794,14 +802,7 @@
# ____________________________________________________________
# Now mutate origportalgraph to end with a call to portal_runner_ptr
#
- _, op = jd._jit_merge_point_pos
- for origblock in origportalgraph.iterblocks():
- if op in origblock.operations:
- break
- else:
- assert False, "lost the operation %r in the graph %r" % (
- op, origportalgraph)
- origindex = origblock.operations.index(op)
+ origblock, origindex, op = locate_jit_merge_point(origportalgraph)
assert op.opname == 'jit_marker'
assert op.args[0].value == 'jit_merge_point'
greens_v, reds_v = support.decode_hp_hint_args(op)
More information about the pypy-commit
mailing list