[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