Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79305:4a71f8c4189d
Date: 2015-08-30 23:17 +0200
http://bitbucket.org/pypy/pypy/changeset/4a71f8c4189d/

Log:    pass test_quasiimmut

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
@@ -220,6 +220,8 @@
     loop = create_empty_loop(metainterp)
     loop.original_jitcell_token = jitcell_token
     loop.inputargs = loop_info.inputargs
+    if loop_info.quasi_immutable_deps:
+        loop.quasi_immutable_deps = loop_info.quasi_immutable_deps
     jump_op = ops[-1]
     target_token = TargetToken(jitcell_token)
     target_token.original_jitcell_token = jitcell_token
@@ -287,6 +289,13 @@
     loop = create_empty_loop(metainterp)
     loop.original_jitcell_token = jitcell_token
     loop.inputargs = start_state.renamed_inputargs
+    quasi_immutable_deps = {}
+    if start_state.quasi_immutable_deps:
+        quasi_immutable_deps.update(start_state.quasi_immutable_deps)
+    if loop_info.quasi_immutable_deps:
+        quasi_immutable_deps.update(loop_info.quasi_immutable_deps)
+    if quasi_immutable_deps:
+        loop.quasi_immutable_deps = quasi_immutable_deps
     start_descr = TargetToken(jitcell_token,
                               original_jitcell_token=jitcell_token)
     start_label = ResOperation(rop.LABEL, start_state.renamed_inputargs,
@@ -335,17 +344,18 @@
         return None
 
     loop = partial_trace
+    loop.original_jitcell_token = loop_jitcell_token
     loop.operations = (loop.operations + loop_info.extra_same_as +
                        [loop_info.label_op]
                        + loop_ops)
 
-    #quasi_immutable_deps = {}
-    #if loop.quasi_immutable_deps:
-    #    quasi_immutable_deps.update(loop.quasi_immutable_deps)
-    #if part.quasi_immutable_deps:
-    #    quasi_immutable_deps.update(part.quasi_immutable_deps)
-    #if quasi_immutable_deps:
-    #    loop.quasi_immutable_deps = quasi_immutable_deps
+    quasi_immutable_deps = {}
+    if loop_info.quasi_immutable_deps:
+        quasi_immutable_deps.update(loop_info.quasi_immutable_deps)
+    if start_state.quasi_immutable_deps:
+        quasi_immutable_deps.update(start_state.quasi_immutable_deps)
+    if quasi_immutable_deps:
+        loop.quasi_immutable_deps = quasi_immutable_deps
 
     target_token = loop.operations[-1].getdescr()
     resumekey.compile_and_attach(metainterp, loop, inputargs)
@@ -420,13 +430,12 @@
         emit_op(extra_ops, op)
     loop.operations = extra_ops
 
-#def propagate_original_jitcell_token(trace):
-#    for op in trace.operations:
-#        if op.getopnum() == rop.LABEL:
-#            token = op.getdescr()
-#            assert isinstance(token, TargetToken)
-#            assert token.original_jitcell_token is None
-#            token.original_jitcell_token = trace.original_jitcell_token
+def propagate_original_jitcell_token(trace):
+    for op in trace.operations:
+        if op.getopnum() == rop.LABEL:
+            token = op.getdescr()
+            assert isinstance(token, TargetToken)
+            token.original_jitcell_token = trace.original_jitcell_token
 
 
 def do_compile_loop(jd_id, unique_id, metainterp_sd, inputargs, operations,
@@ -767,7 +776,7 @@
         inputargs = new_loop.inputargs
         if not we_are_translated():
             self._debug_suboperations = new_loop.operations
-        #propagate_original_jitcell_token(new_loop)
+        propagate_original_jitcell_token(new_loop)
         send_bridge_to_backend(metainterp.jitdriver_sd, metainterp.staticdata,
                                self, inputargs, new_loop.operations,
                                new_loop.original_jitcell_token)
@@ -954,7 +963,7 @@
         metainterp_sd = metainterp.staticdata
         jitdriver_sd = metainterp.jitdriver_sd
         new_loop.original_jitcell_token = jitcell_token = 
make_jitcell_token(jitdriver_sd)
-        #propagate_original_jitcell_token(new_loop)
+        propagate_original_jitcell_token(new_loop)
         send_loop_to_backend(self.original_greenkey, metainterp.jitdriver_sd,
                              metainterp_sd, new_loop, "entry bridge",
                              orig_inputargs)
@@ -1015,6 +1024,8 @@
 
     new_trace = create_empty_loop(metainterp)
     new_trace.operations = newops
+    if info.quasi_immutable_deps:
+        new_trace.quasi_immutable_deps = info.quasi_immutable_deps
     if info.final():
         new_trace.inputargs = info.inputargs
         target_token = new_trace.operations[-1].getdescr()
diff --git a/rpython/jit/metainterp/history.py 
b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -782,6 +782,15 @@
         if 'getfield_gc' in check:
             assert check.pop('getfield_gc') == 0
             check['getfield_gc_i'] = check['getfield_gc_r'] = 
check['getfield_gc_f'] = 0
+        if 'getfield_gc_pure' in check:
+            assert check.pop('getfield_gc_pure') == 0
+            check['getfield_gc_pure_i'] = check['getfield_gc_pure_r'] = 
check['getfield_gc_pure_f'] = 0
+        if 'getarrayitem_gc_pure' in check:
+            assert check.pop('getarrayitem_gc_pure') == 0
+            check['getarrayitem_gc_pure_i'] = check['getarrayitem_gc_pure_r'] 
= check['getarrayitem_gc_pure_f'] = 0            
+        if 'getarrayitem_gc' in check:
+            assert check.pop('getarrayitem_gc') == 0
+            check['getarrayitem_gc_i'] = check['getarrayitem_gc_r'] = 
check['getarrayitem_gc_f'] = 0
         for loop in self.get_all_loops():
             insns = loop.summary(adding_insns=insns, omit_finish=omit_finish)
         return self._check_insns(insns, expected, check)
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
@@ -24,8 +24,9 @@
     pass
 
 class BasicLoopInfo(LoopInfo):
-    def __init__(self, inputargs):
+    def __init__(self, inputargs, quasi_immutable_deps):
         self.inputargs = inputargs
+        self.quasi_immutable_deps = quasi_immutable_deps
 
     def final(self):
         return True
@@ -508,15 +509,14 @@
         for i in range(last):
             self._really_emitted_operation = None
             self.first_optimization.propagate_forward(ops[i])
-        #self.loop.operations = self.get_newoperations()
-        #self.loop.quasi_immutable_deps = self.quasi_immutable_deps
         # accumulate counters
         if flush:
             self.flush()
         if extra_jump:
             self.first_optimization.propagate_forward(ops[-1])
         self.resumedata_memo.update_counters(self.metainterp_sd.profiler)
-        return BasicLoopInfo(newargs), self._newoperations
+        return (BasicLoopInfo(newargs, self.quasi_immutable_deps),
+                self._newoperations)
 
     def _clean_optimization_info(self, lst):
         for op in lst:
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py 
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -105,6 +105,7 @@
             flush=False)
         exported_state = self.export_state(start_label, end_label.getarglist(),
                                            info.inputargs)
+        exported_state.quasi_immutable_deps = info.quasi_immutable_deps
         # we need to absolutely make sure that we've cleaned up all
         # the optimization info
         self.optimizer._clean_optimization_info(self.optimizer._newoperations)
@@ -138,7 +139,8 @@
             return (UnrollInfo(target_token, label_op, []),
                     self.optimizer._newoperations)
             #return new_virtual_state, self.optimizer._newoperations
-        return (UnrollInfo(target_token, label_op, extra_same_as),
+        return (UnrollInfo(target_token, label_op, extra_same_as,
+                           self.optimizer.quasi_immutable_deps),
                 self.optimizer._newoperations)
 
     def optimize_bridge(self, start_label, operations, call_pure_results,
@@ -181,6 +183,7 @@
         exported_state = self.export_state(start_label,
                                            operations[-1].getarglist(),
                                            info.inputargs)
+        exported_state.quasi_immutable_deps = 
self.optimizer.quasi_immutable_deps
         self.optimizer._clean_optimization_info(self.optimizer._newoperations)
         return exported_state, self.optimizer._newoperations
 
@@ -198,7 +201,7 @@
         target_token.virtual_state = virtual_state
         target_token.short_preamble = short_preamble
         jitcelltoken.target_tokens.append(target_token)
-        self.short_preamble_producer = ExtendedShortPreambleBuilder()
+        self.short_preamble_producer = None # ExtendedShortPreambleBuilder()
         label_op.initarglist(label_op.getarglist() + sb.used_boxes)
         return target_token
 
@@ -350,10 +353,12 @@
     * label_args - label operations at the beginning
     * extra_same_as - list of extra same as to add at the end of the preamble
     """
-    def __init__(self, target_token, label_op, extra_same_as):
+    def __init__(self, target_token, label_op, extra_same_as,
+                 quasi_immutable_deps):
         self.target_token = target_token
         self.label_op = label_op
         self.extra_same_as = extra_same_as
+        self.quasi_immutable_deps = quasi_immutable_deps
 
     def final(self):
         return True
@@ -370,6 +375,7 @@
     * short boxes - a mapping op -> preamble_op
     * renamed_inputargs - the start label arguments in optimized version
     * short_inputargs - the renamed inputargs for short preamble
+    * quasi_immutable_deps - for tracking quasi immutables
     """
     
     def __init__(self, end_args, next_iteration_args, virtual_state,
diff --git a/rpython/jit/metainterp/test/test_quasiimmut.py 
b/rpython/jit/metainterp/test/test_quasiimmut.py
--- a/rpython/jit/metainterp/test/test_quasiimmut.py
+++ b/rpython/jit/metainterp/test/test_quasiimmut.py
@@ -124,7 +124,8 @@
         assert f(100, 7) == 721
         res = self.meta_interp(f, [100, 7])
         assert res == 721
-        self.check_resops(guard_not_invalidated=0, getfield_gc=1, 
getfield_gc_pure=2)
+        self.check_resops(guard_not_invalidated=0, getfield_gc_r=1,
+                          getfield_gc_pure_i=2)
         #
         from rpython.jit.metainterp.warmspot import get_stats
         loops = get_stats().loops
@@ -369,8 +370,12 @@
         #
         res = self.meta_interp(f, [100, 7])
         assert res == 700
-        self.check_resops(getarrayitem_gc_pure=0, guard_not_invalidated=2,
-                          getarrayitem_gc=0, getfield_gc=0, getfield_gc_pure=0)
+        self.check_resops(getarrayitem_gc_pure_i=0, guard_not_invalidated=2,
+                          getarrayitem_gc_pure_r=0,
+                          getarrayitem_gc_i=0,
+                          getarrayitem_gc_r=0,
+                          getfield_gc_i=0, getfield_gc_pure_i=0,
+                          getfield_gc_r=0, getfield_gC_pure_r=0)
         #
         from rpython.jit.metainterp.warmspot import get_stats
         loops = get_stats().loops
@@ -399,8 +404,10 @@
         res = self.meta_interp(f, [100, 7], enable_opts="")
         assert res == 700
         # operations must have been removed by the frontend
-        self.check_resops(getarrayitem_gc_pure=0, guard_not_invalidated=1,
-                          getarrayitem_gc=0, getfield_gc=0, getfield_gc_pure=0)
+        self.check_resops(getarrayitem_gc_pure_i=0, guard_not_invalidated=1,
+                          getarrayitem_gc_i=0,
+                          getfield_gc=0, getfield_gc_pure_i=0,
+                          getfield_gc_pure_r=0)
 
     def test_list_length_1(self):
         myjitdriver = JitDriver(greens=['foo'], reds=['x', 'total'])
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to