[pypy-commit] pypy optresult-unroll: fix virtualizables
fijal
noreply at buildbot.pypy.org
Fri Aug 28 11:53:40 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79271:6aa509ce12e3
Date: 2015-08-28 11:53 +0200
http://bitbucket.org/pypy/pypy/changeset/6aa509ce12e3/
Log: fix virtualizables
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
@@ -229,7 +229,8 @@
if not we_are_translated():
loop.check_consistency()
jitcell_token.target_tokens = [target_token]
- send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, "loop")
+ send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, "loop",
+ inputargs)
record_loop_or_bridge(metainterp_sd, loop)
return target_token
@@ -295,7 +296,8 @@
if not we_are_translated():
loop.check_consistency()
jitcell_token.target_tokens = [start_descr] + jitcell_token.target_tokens
- send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, "loop")
+ send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, "loop",
+ inputargs)
record_loop_or_bridge(metainterp_sd, loop)
return start_descr
@@ -346,7 +348,7 @@
# loop.quasi_immutable_deps = quasi_immutable_deps
target_token = loop.operations[-1].getdescr()
- resumekey.compile_and_attach(metainterp, loop)
+ resumekey.compile_and_attach(metainterp, loop, inputargs)
record_loop_or_bridge(metainterp_sd, loop)
return target_token
@@ -380,7 +382,7 @@
for a in op.getfailargs()])
lst.append(op)
-def patch_new_loop_to_load_virtualizable_fields(loop, jitdriver_sd):
+def patch_new_loop_to_load_virtualizable_fields(loop, jitdriver_sd, vable):
# XXX merge with rewriting
vinfo = jitdriver_sd.virtualizable_info
extra_ops = []
@@ -398,7 +400,6 @@
i += 1
arrayindex = 0
for descr in vinfo.array_field_descrs:
- vable = vable_box.getref_base()
arraylen = vinfo.get_array_length(vable, arrayindex)
arrayop = ResOperation(rop.GETFIELD_GC_R, [vable_box], descr)
emit_op(extra_ops, arrayop)
@@ -454,12 +455,14 @@
if reset_values:
item.reset_value()
-def send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, type):
+def send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, type,
+ orig_inpargs):
forget_optimization_info(loop.operations)
forget_optimization_info(loop.inputargs)
vinfo = jitdriver_sd.virtualizable_info
if vinfo is not None:
- patch_new_loop_to_load_virtualizable_fields(loop, jitdriver_sd)
+ vable = orig_inpargs[jitdriver_sd.index_of_virtualizable].getref_base()
+ patch_new_loop_to_load_virtualizable_fields(loop, jitdriver_sd, vable)
original_jitcell_token = loop.original_jitcell_token
globaldata = metainterp_sd.globaldata
@@ -756,7 +759,7 @@
# incremented at all as long as ST_BUSY_FLAG was set.
self.status &= ~self.ST_BUSY_FLAG
- def compile_and_attach(self, metainterp, new_loop):
+ def compile_and_attach(self, metainterp, new_loop, orig_inputargs):
# We managed to create a bridge. Attach the new operations
# to the corresponding guard_op and compile from there
assert metainterp.resumekey_original_loop_token is not None
@@ -943,7 +946,7 @@
def __init__(self, original_greenkey):
self.original_greenkey = original_greenkey
- def compile_and_attach(self, metainterp, new_loop):
+ def compile_and_attach(self, metainterp, new_loop, orig_inputargs):
# We managed to create a bridge going from the interpreter
# to previously-compiled code. We keep 'new_loop', which is not
# a loop at all but ends in a jump to the target loop. It starts
@@ -953,7 +956,8 @@
new_loop.original_jitcell_token = jitcell_token = make_jitcell_token(jitdriver_sd)
#propagate_original_jitcell_token(new_loop)
send_loop_to_backend(self.original_greenkey, metainterp.jitdriver_sd,
- metainterp_sd, new_loop, "entry bridge")
+ metainterp_sd, new_loop, "entry bridge",
+ orig_inputargs)
# send the new_loop to warmspot.py, to be called directly the next time
jitdriver_sd.warmstate.attach_procedure_to_interp(
self.original_greenkey, jitcell_token)
@@ -1014,7 +1018,7 @@
if info.final():
new_trace.inputargs = info.inputargs
target_token = new_trace.operations[-1].getdescr()
- resumekey.compile_and_attach(metainterp, new_trace)
+ resumekey.compile_and_attach(metainterp, new_trace, inputargs)
record_loop_or_bridge(metainterp_sd, new_trace)
return target_token
new_trace.inputargs = info.renamed_inputargs
diff --git a/rpython/jit/metainterp/test/test_virtualizable.py b/rpython/jit/metainterp/test/test_virtualizable.py
--- a/rpython/jit/metainterp/test/test_virtualizable.py
+++ b/rpython/jit/metainterp/test/test_virtualizable.py
@@ -283,7 +283,8 @@
res = self.meta_interp(f, [16])
assert res == 3001 + 16 * 80
self.check_simple_loop(setarrayitem_gc=0, setfield_gc=0,
- getarrayitem_gc=0, getfield_gc=0)
+ getarrayitem_gc_i=0, getarrayitem_gc_r=0, getfield_gc_i=0,
+ getfield_gc_r=0)
def test_synchronize_arrays_in_return(self):
myjitdriver = JitDriver(greens = [], reds = ['n', 'xy2'],
More information about the pypy-commit
mailing list