Author: fijal
Branch: jit-leaner-frontend
Changeset: r82849:91bcb43bca18
Date: 2016-03-07 18:04 +0200
http://bitbucket.org/pypy/pypy/changeset/91bcb43bca18/

Log:    almost fix test_optimizeopt, two tests left

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
@@ -38,10 +38,13 @@
 
     This is the case of label() ops label()
     """
-    def __init__(self, trace, call_pure_results=None, enable_opts=None):
+    def __init__(self, trace, runtime_boxes, call_pure_results=None,
+                 enable_opts=None):
         self.enable_opts = enable_opts
         self.trace = trace
         self.call_pure_results = call_pure_results
+        assert runtime_boxes is not None
+        self.runtime_boxes = runtime_boxes
 
     def optimize(self, metainterp_sd, jitdriver_sd, optimizations, unroll):
         from rpython.jit.metainterp.optimizeopt.unroll import (UnrollOptimizer,
@@ -50,6 +53,7 @@
         if unroll:
             opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
             return opt.optimize_preamble(self.trace,
+                                         self.runtime_boxes,
                                          self.call_pure_results,
                                          self.box_names_memo)
         else:
diff --git a/rpython/jit/metainterp/optimizeopt/info.py 
b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -114,7 +114,7 @@
         assert self.get_last_guard(optimizer).is_guard()
 
     def make_guards(self, op, short, optimizer):
-        op = ResOperation(rop.GUARD_NONNULL, [op], None)
+        op = ResOperation(rop.GUARD_NONNULL, [op])
         short.append(op)
 
 class AbstractVirtualPtrInfo(NonNullPtrInfo):
@@ -592,7 +592,7 @@
     def make_guards(self, op, short, optimizer):
         AbstractVirtualPtrInfo.make_guards(self, op, short, optimizer)
         c_type_id = ConstInt(self.descr.get_type_id())
-        short.append(ResOperation(rop.GUARD_GC_TYPE, [op, c_type_id], None))
+        short.append(ResOperation(rop.GUARD_GC_TYPE, [op, c_type_id]))
         if self.lenbound is not None:
             lenop = ResOperation(rop.ARRAYLEN_GC, [op], descr=self.descr)
             short.append(lenop)
diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py 
b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
--- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
+++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
@@ -396,7 +396,7 @@
                 arg.set_forwarded(None)
         self.short.append(preamble_op)
         if preamble_op.is_ovf():
-            self.short.append(ResOperation(rop.GUARD_NO_OVERFLOW, [], None))
+            self.short.append(ResOperation(rop.GUARD_NO_OVERFLOW, []))
         info = preamble_op.get_forwarded()
         preamble_op.set_forwarded(None)
         if optimizer is not None:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -49,7 +49,6 @@
                       call_pure_results=None, expected_short=None,
                       jump_values=None):
         loop = self.parse(ops)
-        self.set_values(loop.operations, jump_values)
         if expected != "crash!":
             expected = self.parse(expected)
         if expected_preamble:
@@ -58,7 +57,7 @@
             # the short preamble doesn't have fail descrs, they are patched in 
when it is used
             expected_short = self.parse(expected_short, want_fail_descr=False)
 
-        info = self.unroll_and_optimize(loop, call_pure_results)
+        info = self.unroll_and_optimize(loop, call_pure_results, jump_values)
         preamble = info.preamble
         preamble.check_consistency(check_descr=False)
 
@@ -873,7 +872,7 @@
         jump(i1, p1, p3sub)
         """
         self.optimize_loop(ops, expected, preamble,
-                jump_values=[None, self.nodefulladdr, self.nodefulladdr, None])
+                jump_values=[None, self.nodefulladdr, self.nodefulladdr])
 
     def test_dont_delay_setfields(self):
         ops = """
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py 
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -570,18 +570,21 @@
             op.position = newop.position
         return trace
 
-    def unroll_and_optimize(self, loop, call_pure_results=None):
+    def unroll_and_optimize(self, loop, call_pure_results=None,
+                            jump_values=None):
         self.add_guard_future_condition(loop)
         jump_op = loop.operations[-1]
         assert jump_op.getopnum() == rop.JUMP
         celltoken = JitCellToken()
+        runtime_boxes = self.pack_into_boxes(jump_op, jump_values)
         jump_op.setdescr(celltoken)
         #start_label = ResOperation(rop.LABEL, loop.inputargs,
         #                           descr=jump_op.getdescr())
         #end_label = jump_op.copy_and_change(opnum=rop.LABEL)
         call_pure_results = self._convert_call_pure_results(call_pure_results)
         t = self.convert_loop_to_packed(loop)
-        preamble_data = compile.LoopCompileData(t, call_pure_results)
+        preamble_data = compile.LoopCompileData(t, runtime_boxes,
+                                                call_pure_results)
         start_state, preamble_ops = self._do_optimize_loop(preamble_data)
         preamble_data.forget_optimization_info()
         loop_data = compile.UnrolledLoopData(preamble_data.trace,
@@ -597,13 +600,16 @@
         return Info(preamble, loop_info.target_token.short_preamble,
                     start_state.virtual_state)
 
-    def set_values(self, ops, jump_values=None):
-        jump_op = ops[-1]
+    def pack_into_boxes(self, jump_op, jump_values):
         assert jump_op.getopnum() == rop.JUMP
+        r = []
         if jump_values is not None:
+            assert len(jump_values) == len(jump_op.getarglist())
             for i, v in enumerate(jump_values):
                 if v is not None:
-                    jump_op.getarg(i).setref_base(v)
+                    r.append(InputArgRef(v))
+                else:
+                    r.append(None)
         else:
             for i, box in enumerate(jump_op.getarglist()):
                 if box.type == 'r' and not box.is_constant():
@@ -611,9 +617,10 @@
                     # object here.  If you need something different, you
                     # need to pass a 'jump_values' argument to e.g.
                     # optimize_loop()
-                    box.setref_base(self.nodefulladdr)
-
-
+                    r.append(InputArgRef(self.nodefulladdr))
+                else:
+                    r.append(None)
+        return r
 
 class FakeDescr(compile.ResumeGuardDescr):
     def clone_if_mutable(self):
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
@@ -121,11 +121,12 @@
         if check_newops:
             assert not self.optimizer._newoperations
     
-    def optimize_preamble(self, trace, call_pure_results, memo):
+    def optimize_preamble(self, trace, runtime_boxes, call_pure_results, memo):
         info, newops = self.optimizer.propagate_all_forward(trace.get_iter(),
             call_pure_results, flush=False)
         exported_state = self.export_state(info.jump_op.getarglist(),
-                                           info.inputargs, memo)
+                                           info.inputargs,
+                                           runtime_boxes, memo)
         exported_state.quasi_immutable_deps = info.quasi_immutable_deps
         # we need to absolutely make sure that we've cleaned up all
         # the optimization info
@@ -182,13 +183,14 @@
                     self.optimizer._newoperations)            
 
         try:
-            new_virtual_state = self.jump_to_existing_trace(end_jump, label_op)
+            new_virtual_state = self.jump_to_existing_trace(end_jump, label_op,
+                                                            
state.runtime_boxes)
         except InvalidLoop:
             # inlining short preamble failed, jump to preamble
             self.jump_to_preamble(celltoken, end_jump, info)
             return (UnrollInfo(target_token, label_op, extra_same_as,
                                self.optimizer.quasi_immutable_deps),
-                    self.optimizer._newoperations)            
+                    self.optimizer._newoperations)
         if new_virtual_state is not None:
             self.jump_to_preamble(celltoken, end_jump, info)
             return (UnrollInfo(target_token, label_op, extra_same_as,
@@ -286,7 +288,7 @@
         return info, self.optimizer._newoperations[:]
 
 
-    def jump_to_existing_trace(self, jump_op, label_op):
+    def jump_to_existing_trace(self, jump_op, label_op, runtime_boxes):
         jitcelltoken = jump_op.getdescr()
         assert isinstance(jitcelltoken, JitCellToken)
         virtual_state = self.get_virtual_state(jump_op.getarglist())
@@ -297,7 +299,7 @@
                 continue
             try:
                 extra_guards = target_virtual_state.generate_guards(
-                    virtual_state, args, jump_op.getarglist(), self.optimizer)
+                    virtual_state, args, runtime_boxes, self.optimizer)
                 patchguardop = self.optimizer.patchguardop
                 for guard in extra_guards.extra_guards:
                     if isinstance(guard, GuardResOp):
@@ -407,7 +409,8 @@
                 continue
             self._expand_info(item, infos)
 
-    def export_state(self, original_label_args, renamed_inputargs, memo):
+    def export_state(self, original_label_args, renamed_inputargs,
+                     runtime_boxes, memo):
         end_args = [self.optimizer.force_box_for_end_of_preamble(a)
                     for a in original_label_args]
         self.optimizer.flush()
@@ -431,7 +434,7 @@
         self.optimizer._clean_optimization_info(end_args)
         return ExportedState(label_args, end_args, virtual_state, infos,
                              short_boxes, renamed_inputargs,
-                             short_inputargs, memo)
+                             short_inputargs, runtime_boxes, memo)
 
     def import_state(self, targetargs, exported_state):
         # the mapping between input args (from old label) and what we need
@@ -492,11 +495,13 @@
     * renamed_inputargs - the start label arguments in optimized version
     * short_inputargs - the renamed inputargs for short preamble
     * quasi_immutable_deps - for tracking quasi immutables
+    * runtime_boxes - runtime values for boxes, necessary when generating
+                      guards to jump to
     """
     
     def __init__(self, end_args, next_iteration_args, virtual_state,
                  exported_infos, short_boxes, renamed_inputargs,
-                 short_inputargs, memo):
+                 short_inputargs, runtime_boxes, memo):
         self.end_args = end_args
         self.next_iteration_args = next_iteration_args
         self.virtual_state = virtual_state
@@ -504,6 +509,7 @@
         self.short_boxes = short_boxes
         self.renamed_inputargs = renamed_inputargs
         self.short_inputargs = short_inputargs
+        self.runtime_boxes = runtime_boxes
         self.dump(memo)
 
     def dump(self, memo):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to