[pypy-commit] pypy jit-leaner-frontend: start fighting with unrolling, make most of the tests pass in test_optimizeopt by simplifying what CompileData stores

fijal pypy.commits at gmail.com
Mon Mar 7 10:16:17 EST 2016


Author: fijal
Branch: jit-leaner-frontend
Changeset: r82846:19da356e7036
Date: 2016-03-07 17:15 +0200
http://bitbucket.org/pypy/pypy/changeset/19da356e7036/

Log:	start fighting with unrolling, make most of the tests pass in
	test_optimizeopt by simplifying what CompileData stores

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
@@ -29,11 +29,8 @@
     memo = None
     
     def forget_optimization_info(self):
-        return # no longer necessary?
-        for arg in self.start_label.getarglist():
+        for arg in self.trace.inputargs:
             arg.set_forwarded(None)
-        for op in self.operations:
-            op.set_forwarded(None)
 
 class LoopCompileData(CompileData):
     """ An object that accumulates all of the necessary info for
@@ -41,13 +38,8 @@
 
     This is the case of label() ops label()
     """
-    def __init__(self, start_label, end_label, trace,
-                 call_pure_results=None, enable_opts=None):
-        self.start_label = start_label
-        self.end_label = end_label
+    def __init__(self, trace, call_pure_results=None, enable_opts=None):
         self.enable_opts = enable_opts
-        assert start_label.getopnum() == rop.LABEL
-        assert end_label.getopnum() == rop.LABEL
         self.trace = trace
         self.call_pure_results = call_pure_results
 
@@ -57,22 +49,19 @@
 
         if unroll:
             opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
-            return opt.optimize_preamble(self.start_label, self.end_label,
-                                         self.trace,
+            return opt.optimize_preamble(self.trace,
                                          self.call_pure_results,
                                          self.box_names_memo)
         else:
             opt = Optimizer(metainterp_sd, jitdriver_sd, optimizations)
-            return opt.propagate_all_forward(self.start_label.getarglist(),
-               self.trace, self.call_pure_results)
+            return opt.propagate_all_forward(self.trace, self.call_pure_results)
 
 class SimpleCompileData(CompileData):
     """ This represents label() ops jump with no extra info associated with
     the label
     """
-    def __init__(self, start_label, trace, call_pure_results=None,
+    def __init__(self, trace, call_pure_results=None,
                  enable_opts=None):
-        self.start_label = start_label
         self.trace = trace
         self.call_pure_results = call_pure_results
         self.enable_opts = enable_opts
@@ -82,7 +71,8 @@
 
         #assert not unroll
         opt = Optimizer(metainterp_sd, jitdriver_sd, optimizations)
-        return opt.propagate_all_forward(self.trace, self.call_pure_results)
+        return opt.propagate_all_forward(self.trace.get_iter(),
+            self.call_pure_results)
 
 class BridgeCompileData(CompileData):
     """ This represents ops() with a jump at the end that goes to some
@@ -109,12 +99,11 @@
     """ This represents label() ops jump with extra info that's from the
     run of LoopCompileData. Jump goes to the same label
     """
-    def __init__(self, start_label, end_jump, operations, state,
+    def __init__(self, trace, celltoken, state,
                  call_pure_results=None, enable_opts=None,
                  inline_short_preamble=True):
-        self.start_label = start_label
-        self.end_jump = end_jump
-        self.operations = operations
+        self.trace = trace
+        self.celltoken = celltoken
         self.enable_opts = enable_opts
         self.state = state
         self.call_pure_results = call_pure_results
@@ -125,9 +114,8 @@
 
         assert unroll # we should not be here if it's disabled
         opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations)
-        return opt.optimize_peeled_loop(self.start_label, self.end_jump,
-            self.operations, self.state, self.call_pure_results,
-            self.inline_short_preamble)
+        return opt.optimize_peeled_loop(self.trace, self.celltoken, self.state,
+            self.call_pure_results, self.inline_short_preamble)
 
 def show_procedures(metainterp_sd, procedure=None, error=None):
     # debugging
diff --git a/rpython/jit/metainterp/opencoder.py b/rpython/jit/metainterp/opencoder.py
--- a/rpython/jit/metainterp/opencoder.py
+++ b/rpython/jit/metainterp/opencoder.py
@@ -61,6 +61,7 @@
         self.trace = trace
         self.inputargs = [rop.inputarg_from_tp(arg.type) for
                           arg in self.trace.inputargs]
+        self.start = 0
         self.pos = 0
         self._count = 0
         self.end = end
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
@@ -326,17 +326,17 @@
 
     def make_guards(self, op, short, optimizer):
         if self._known_class is not None:
-            short.append(ResOperation(rop.GUARD_NONNULL, [op], None))
+            short.append(ResOperation(rop.GUARD_NONNULL, [op]))
             if not optimizer.cpu.remove_gctypeptr:
-                short.append(ResOperation(rop.GUARD_IS_OBJECT, [op], None))
+                short.append(ResOperation(rop.GUARD_IS_OBJECT, [op]))
             short.append(ResOperation(rop.GUARD_CLASS,
-                                      [op, self._known_class], None))
+                                      [op, self._known_class]))
         elif self.descr is not None:
-            short.append(ResOperation(rop.GUARD_NONNULL, [op], None))
+            short.append(ResOperation(rop.GUARD_NONNULL, [op]))
             if not optimizer.cpu.remove_gctypeptr:
-                short.append(ResOperation(rop.GUARD_IS_OBJECT, [op], None))
+                short.append(ResOperation(rop.GUARD_IS_OBJECT, [op]))
             short.append(ResOperation(rop.GUARD_SUBCLASS, [op,
-                            ConstInt(self.descr.get_vtable())], None))
+                            ConstInt(self.descr.get_vtable())]))
         else:
             AbstractStructPtrInfo.make_guards(self, op, short, optimizer)
 
@@ -349,8 +349,8 @@
         if self.descr is not None:
             c_typeid = ConstInt(self.descr.get_type_id())
             short.extend([
-                ResOperation(rop.GUARD_NONNULL, [op], None),
-                ResOperation(rop.GUARD_GC_TYPE, [op, c_typeid], None)
+                ResOperation(rop.GUARD_NONNULL, [op]),
+                ResOperation(rop.GUARD_GC_TYPE, [op, c_typeid])
             ])
 
     @specialize.argtype(1)
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
@@ -25,9 +25,9 @@
     pass
 
 class BasicLoopInfo(LoopInfo):
-    def __init__(self, inputargs, quasi_immutable_deps):
+    def __init__(self, inputargs, quasi_immutable_deps, jump_op):
         self.inputargs = inputargs
-        self.label_op = ResOperation(rop.LABEL, inputargs, -1)
+        self.jump_op = jump_op
         self.quasi_immutable_deps = quasi_immutable_deps
         self.extra_same_as = []
 
@@ -506,7 +506,6 @@
             return CONST_0
 
     def propagate_all_forward(self, trace, call_pure_results=None, flush=True):
-        trace = trace.get_iter()
         self.trace = trace
         self.call_pure_results = call_pure_results
         last_op = None
@@ -522,11 +521,11 @@
         # accumulate counters
         if flush:
             self.flush()
-        if last_op:
-            self.first_optimization.propagate_forward(last_op)
+            if last_op:
+                self.first_optimization.propagate_forward(last_op)
         self.resumedata_memo.update_counters(self.metainterp_sd.profiler)
         
-        return (BasicLoopInfo(trace.inputargs, self.quasi_immutable_deps),
+        return (BasicLoopInfo(trace.inputargs, self.quasi_immutable_deps, last_op),
                 self._newoperations)
 
     def _clean_optimization_info(self, lst):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -24,15 +24,13 @@
     def optimize_loop(self, ops, optops, call_pure_results=None):
         loop = self.parse(ops)
         token = JitCellToken()
-        label_op = ResOperation(rop.LABEL, loop.inputargs, -1,
-                                descr=TargetToken(token))
         if loop.operations[-1].getopnum() == rop.JUMP:
             loop.operations[-1].setdescr(token)
         exp = parse(optops, namespace=self.namespace.copy())
         expected = convert_old_style_to_targets(exp, jump=True)
         call_pure_results = self._convert_call_pure_results(call_pure_results)
         trace = self.convert_loop_to_packed(loop)
-        compile_data = compile.SimpleCompileData(label_op, trace,
+        compile_data = compile.SimpleCompileData(trace,
                                                  call_pure_results)
         info, ops = self._do_optimize_loop(compile_data)
         label_op = ResOperation(rop.LABEL, info.inputargs, -1)
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
@@ -574,19 +574,18 @@
         self.add_guard_future_condition(loop)
         jump_op = loop.operations[-1]
         assert jump_op.getopnum() == rop.JUMP
-        jump_op.setdescr(JitCellToken())
-        start_label = ResOperation(rop.LABEL, loop.inputargs,
-                                   descr=jump_op.getdescr())
-        end_label = jump_op.copy_and_change(opnum=rop.LABEL)
+        celltoken = JitCellToken()
+        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, skip_last=True)
-        preamble_data = compile.LoopCompileData(start_label, end_label, t,
-                                                call_pure_results)
+        t = self.convert_loop_to_packed(loop)
+        preamble_data = compile.LoopCompileData(t, call_pure_results)
         start_state, preamble_ops = self._do_optimize_loop(preamble_data)
         preamble_data.forget_optimization_info()
-        loop_data = compile.UnrolledLoopData(start_label, jump_op,
-                                             t, start_state,
-                                             call_pure_results)
+        loop_data = compile.UnrolledLoopData(preamble_data.trace,
+            celltoken, start_state, call_pure_results)
         loop_info, ops = self._do_optimize_loop(loop_data)
         preamble = TreeLoop('preamble')
         preamble.inputargs = start_state.renamed_inputargs
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
@@ -115,19 +115,16 @@
         return modifier.get_virtual_state(args)
 
     def _check_no_forwarding(self, lsts, check_newops=True):
-        return
         for lst in lsts:
             for op in lst:
                 assert op.get_forwarded() is None
         if check_newops:
             assert not self.optimizer._newoperations
     
-    def optimize_preamble(self, start_label, end_label, trace, call_pure_results,
-                          memo):
-        #self._check_no_forwarding([[start_label, end_label], ops])
-        info, newops = self.optimizer.propagate_all_forward(trace,
+    def optimize_preamble(self, trace, call_pure_results, memo):
+        info, newops = self.optimizer.propagate_all_forward(trace.get_iter(),
             call_pure_results, flush=False)
-        exported_state = self.export_state(start_label, end_label.getarglist(),
+        exported_state = self.export_state(info.jump_op.getarglist(),
                                            info.inputargs, memo)
         exported_state.quasi_immutable_deps = info.quasi_immutable_deps
         # we need to absolutely make sure that we've cleaned up all
@@ -135,11 +132,11 @@
         self.optimizer._clean_optimization_info(self.optimizer._newoperations)
         return exported_state, self.optimizer._newoperations
 
-    def optimize_peeled_loop(self, start_label, end_jump, trace, state,
+    def optimize_peeled_loop(self, trace, celltoken, state,
                              call_pure_results, inline_short_preamble=True):
-        #self._check_no_forwarding([[start_label, end_jump], ops])
+        trace = trace.get_iter()
         try:
-            label_args = self.import_state(start_label, state)
+            label_args = self.import_state(trace.inputargs, state)
         except VirtualStatesCantMatch:
             raise InvalidLoop("Cannot import state, virtual states don't match")
         self.potential_extra_ops = {}
@@ -149,14 +146,14 @@
                 trace, call_pure_results, flush=False)
         except SpeculativeError:
             raise InvalidLoop("Speculative heap access would be ill-typed")
+        end_jump = info.jump_op
         label_op = ResOperation(rop.LABEL, label_args,
-                                descr=start_label.getdescr())
+                                descr=celltoken)
         for a in end_jump.getarglist():
             self.optimizer.force_box_for_end_of_preamble(
                 self.optimizer.get_box_replacement(a))
         current_vs = self.get_virtual_state(end_jump.getarglist())
         # pick the vs we want to jump to
-        celltoken = start_label.getdescr()
         assert isinstance(celltoken, JitCellToken)
         
         target_virtual_state = self.pick_virtual_state(current_vs,
@@ -227,11 +224,10 @@
 
     def optimize_bridge(self, start_label, operations, call_pure_results,
                         inline_short_preamble, box_names_memo):
-        self._check_no_forwarding([start_label.getarglist(),
-                                    operations])
+        self._check_no_forwarding([start_label.getarglist()])
         info, ops = self.optimizer.propagate_all_forward(
             start_label.getarglist()[:], operations[:-1],
-            call_pure_results, True)
+            call_pure_results)
         jump_op = operations[-1]
         cell_token = jump_op.getdescr()
         assert isinstance(cell_token, JitCellToken)
@@ -375,8 +371,7 @@
                     op = sop.copy_and_change(sop.getopnum(), arglist,
                                     descr=compile.ResumeAtPositionDescr())
                     assert isinstance(op, GuardResOp)
-                    op.rd_snapshot = patchguardop.rd_snapshot
-                    op.rd_frame_info_list = patchguardop.rd_frame_info_list
+                    op.rd_resume_position = patchguardop.rd_resume_position
                 else:
                     op = sop.copy_and_change(sop.getopnum(), arglist)
                 mapping[sop] = op
@@ -412,8 +407,7 @@
                 continue
             self._expand_info(item, infos)
 
-    def export_state(self, start_label, original_label_args, renamed_inputargs,
-                     memo):
+    def export_state(self, original_label_args, renamed_inputargs, memo):
         end_args = [self.optimizer.force_box_for_end_of_preamble(a)
                     for a in original_label_args]
         self.optimizer.flush()
@@ -435,18 +429,17 @@
             if not isinstance(op, Const):
                 self._expand_info(op, infos)
         self.optimizer._clean_optimization_info(end_args)
-        self.optimizer._clean_optimization_info(start_label.getarglist())
         return ExportedState(label_args, end_args, virtual_state, infos,
                              short_boxes, renamed_inputargs,
                              short_inputargs, memo)
 
-    def import_state(self, targetop, exported_state):
+    def import_state(self, targetargs, exported_state):
         # the mapping between input args (from old label) and what we need
         # to actually emit. Update the info
         assert (len(exported_state.next_iteration_args) ==
-                len(targetop.getarglist()))
+                len(targetargs))
         for i, target in enumerate(exported_state.next_iteration_args):
-            source = targetop.getarg(i)
+            source = targetargs[i]
             assert source is not target
             source.set_forwarded(target)
             info = exported_state.exported_infos.get(target, None)
@@ -456,7 +449,7 @@
         # import the optimizer state, starting from boxes that can be produced
         # by short preamble
         label_args = exported_state.virtual_state.make_inputargs(
-            targetop.getarglist(), self.optimizer)
+            targetargs, self.optimizer)
         
         self.short_preamble_producer = ShortPreambleBuilder(
             label_args, exported_state.short_boxes,


More information about the pypy-commit mailing list