Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: optresult-unroll
Changeset: r79176:0e3a0ea12d66
Date: 2015-08-24 10:12 +0200
http://bitbucket.org/pypy/pypy/changeset/0e3a0ea12d66/

Log:    rework the retracing

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
@@ -289,18 +289,11 @@
                               original_jitcell_token=jitcell_token)
     start_label = ResOperation(rop.LABEL, start_state.renamed_inputargs,
                                descr=start_descr)
-    mid_descr_token = TargetToken(jitcell_token,
-                                  original_jitcell_token=jitcell_token)
-    mid_descr_token.short_preamble = loop_info.short_preamble
-    mid_descr_token.virtual_state = start_state.virtual_state
-    mid_label = ResOperation(rop.LABEL, loop_info.label_args,
-                             descr=mid_descr_token)
     # XXX assign short preamble and virtual state
-    loop_ops[-1].setdescr(mid_descr_token)
     loop.operations = ([start_label] + preamble_ops + loop_info.extra_same_as +
-                       [mid_label] + loop_ops)
+                       [loop_info.label_op] + loop_ops)
     loop.check_consistency()
-    jitcell_token.target_tokens = [start_descr, mid_descr_token]
+    jitcell_token.target_tokens = [start_descr] + jitcell_token.target_tokens
     send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, "loop")
     record_loop_or_bridge(metainterp_sd, loop)
     return start_descr
@@ -333,33 +326,13 @@
         loop_info, loop_ops = optimize_trace(metainterp_sd, jitdriver_sd,
                                              loop_data)
     except InvalidLoop:
+        # Fall back on jumping to preamble
         xxx
-        # Fall back on jumping to preamble
-        target_token = label.getdescr()
-        assert isinstance(target_token, TargetToken)
-        part.operations = [orignial_label] + \
-                          [ResOperation(rop.JUMP, inputargs[:],
-                                        descr=loop_jitcell_token)]
-        try:
-            optimize_trace(metainterp_sd, jitdriver_sd, part,
-                           jitdriver_sd.warmstate.enable_opts,
-                           inline_short_preamble=False, 
start_state=start_state,
-                           export_state=False)
-        except InvalidLoop:
-            xxx # XXX forget optimizations
-            return None
 
     loop = partial_trace
-    target_token = TargetToken(loop_jitcell_token)
-    target_token.original_jitcell_token = loop_jitcell_token
-    target_token.short_preamble = loop_info.short_preamble
-    target_token.virtual_state = start_state.virtual_state
-    loop_ops[-1].setdescr(target_token)
-    mid_label = ResOperation(rop.LABEL, loop_info.label_args,
-                             descr=target_token)
-    loop.operations = (loop.operations + loop_info.extra_same_as + [mid_label]
+    loop.operations = (loop.operations + loop_info.extra_same_as +
+                       [loop_info.label_op]
                        + loop_ops)
-    loop_jitcell_token.target_tokens.append(target_token)
 
     #quasi_immutable_deps = {}
     #if loop.quasi_immutable_deps:
@@ -369,6 +342,7 @@
     #if quasi_immutable_deps:
     #    loop.quasi_immutable_deps = quasi_immutable_deps
 
+    target_token = loop.operations[-1].getdescr()
     resumekey.compile_and_attach(metainterp, loop)
 
     record_loop_or_bridge(metainterp_sd, loop)
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
@@ -336,6 +336,8 @@
                 sb = self.optunroll.short_preamble_producer
                 sb.add_preamble_op(preamble_op)
         if info is not None:
+            if op.type == 'i' and info.is_constant():
+                return ConstInt(info.getint())
             return info.force_box(op, self)
         return op
 
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
@@ -393,9 +393,9 @@
         self.used_boxes.append(preamble_op.op)            
         self.short_preamble_jump.append(preamble_op.preamble_op)
 
-    def build_short_preamble(self):
+    def build_short_preamble(self, sb_jump):
         label_op = ResOperation(rop.LABEL, self.short_inputargs[:])
-        jump_op = ResOperation(rop.JUMP, self.short_preamble_jump)
+        jump_op = ResOperation(rop.JUMP, sb_jump)
         TreeLoop.check_consistency_of(self.short_inputargs,
                                       self.short + [jump_op], 
check_descr=False)
         return [label_op] + self.short + [jump_op]
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
@@ -8122,7 +8122,7 @@
         i4 = int_add(i3, i3)
         i5 = int_add(i4, i4)
         i6 = int_add(i5, i5)
-        jump(i6, i3)
+        jump(i6)
         """
         self.optimize_loop(ops, expected, expected_short=short)
 
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
@@ -483,7 +483,9 @@
         jump_op = loop.operations[-1]
         assert jump_op.getopnum() == rop.JUMP
         ops = loop.operations[:-1]
-        start_label = ResOperation(rop.LABEL, loop.inputargs)
+        jump_op.setdescr(JitCellToken())
+        start_label = ResOperation(rop.LABEL, loop.inputargs,
+                                   jump_op.getdescr())
         end_label = jump_op.copy_and_change(opnum=rop.LABEL)
         call_pure_results = self._convert_call_pure_results(call_pure_results)
         preamble_data = compile.LoopCompileData(start_label, end_label, ops,
@@ -497,12 +499,11 @@
         preamble = TreeLoop('preamble')
         preamble.inputargs = start_state.renamed_inputargs
         start_label = ResOperation(rop.LABEL, start_state.renamed_inputargs)
-        emit_end_label = ResOperation(rop.LABEL, loop_info.label_args)
         preamble.operations = ([start_label] + preamble_ops +
-                               loop_info.extra_same_as + [emit_end_label])
-        loop.inputargs = loop_info.label_args[:]
-        loop.operations = [emit_end_label] + ops
-        return Info(preamble, loop_info.short_preamble,
+                               loop_info.extra_same_as + [loop_info.label_op])
+        loop.inputargs = loop_info.label_op.getarglist()[:]
+        loop.operations = [loop_info.label_op] + ops
+        return Info(preamble, loop_info.target_token.short_preamble,
                     start_state.virtual_state)
 
 
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
@@ -1,6 +1,6 @@
 
 import sys
-from rpython.jit.metainterp.history import Const
+from rpython.jit.metainterp.history import Const, TargetToken
 from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes,\
      ShortPreambleBuilder, PreambleOp
 from rpython.jit.metainterp.optimizeopt import info, intutils
@@ -58,10 +58,10 @@
         elif isinstance(preamble_info, intutils.IntBound):
             if preamble_info.lower > MININT/2 or preamble_info.upper < 
MAXINT/2:
                 intbound = self.getintbound(op)
-                if preamble_info.lower > MININT/2:
+                if preamble_info.has_lower and preamble_info.lower > MININT/2:
                     intbound.has_lower = True
                     intbound.lower = preamble_info.lower
-                if preamble_info.upper < MAXINT/2:
+                if preamble_info.has_upper and preamble_info.upper < MAXINT/2:
                     intbound.has_upper = True
                     intbound.upper = preamble_info.upper
 
@@ -108,29 +108,24 @@
         label_args = state.virtual_state.make_inputargs(
             start_label.getarglist(), self.optimizer)
         self.optimizer.init_inparg_dict_from(label_args)
-        self.optimizer.propagate_all_forward(start_label.getarglist()[:], ops,
-                                             call_pure_results, False)
-        orig_jump_args = [self.get_box_replacement(op)
-                     for op in end_jump.getarglist()]
-        jump_args = state.virtual_state.make_inputargs(orig_jump_args,
-                                    self.optimizer, force_boxes=True)
-        pass_to_short = state.virtual_state.make_inputargs(orig_jump_args,
-                                    self.optimizer, force_boxes=True,
-                                    append_virtuals=True)
-        sb = self.short_preamble_producer
-        self.optimizer._clean_optimization_info(sb.short_inputargs)
-        extra_jump_args = self.inline_short_preamble(pass_to_short,
-                                sb.short_inputargs, sb.short,
-                                sb.short_preamble_jump,
-                                self.optimizer.patchguardop)
-        # remove duplicates, removes stuff from used boxes too
-        label_args, jump_args = self.filter_extra_jump_args(
-            label_args + self.short_preamble_producer.used_boxes,
-            jump_args + extra_jump_args)
-        jump_op = ResOperation(rop.JUMP, jump_args)
-        self.optimizer.send_extra_operation(jump_op)
-        return (UnrollInfo(self.short_preamble_producer.build_short_preamble(),
-                           label_args,
+        info, _ = self.optimizer.propagate_all_forward(
+            start_label.getarglist()[:], ops, call_pure_results, False)
+        label_op = ResOperation(rop.LABEL, label_args, start_label.getdescr())
+        target_token, extra = self.finalize_short_preamble(label_op,
+                                                    state.virtual_state)
+        label_op.setdescr(target_token)
+        label_op.initarglist(label_op.getarglist() + extra)
+        # force the boxes for virtual state to match
+        x = state.virtual_state.make_inputargs(
+            [self.get_box_replacement(x) for x in end_jump.getarglist()],
+            self.optimizer, force_boxes=True)
+        new_virtual_state = self.jump_to_existing_trace(end_jump)
+        if new_virtual_state is not None:
+            res = self.jump_to_preamble(start_label.getdescr(), end_jump,
+                                         info)
+            xxx
+            #return new_virtual_state, self.optimizer._newoperations
+        return (UnrollInfo(target_token, label_op,
                            self.short_preamble_producer.extra_same_as),
                 self.optimizer._newoperations)
 
@@ -145,7 +140,7 @@
         cell_token = jump_op.getdescr()
         if not inline_short_preamble or len(cell_token.target_tokens) == 1:
             return self.jump_to_preamble(cell_token, jump_op, info)
-        vs = self.jump_to_existing_trace(jump_op, inline_short_preamble)
+        vs = self.jump_to_existing_trace(jump_op)
         if vs is None:
             return info, self.optimizer._newoperations[:]
         warmrunnerdescr = self.optimizer.metainterp_sd.warmrunnerdesc
@@ -171,6 +166,32 @@
         self.optimizer._clean_optimization_info(self.optimizer._newoperations)
         return exported_state, self.optimizer._newoperations
 
+    def finalize_short_preamble(self, label_op, virtual_state):
+        sb = self.short_preamble_producer
+        self.optimizer._clean_optimization_info(sb.short_inputargs)
+        d = {}
+        for arg in label_op.getarglist():
+            d[arg] = None
+        new_used_boxes = []
+        new_sb_jump = []
+        for i in range(len(sb.used_boxes)):
+            ub = sb.used_boxes[i]
+            if ub in d:
+                continue
+            new_used_boxes.append(ub)
+            new_sb_jump.append(sb.short_preamble_jump[i])
+        short_preamble = sb.build_short_preamble(new_sb_jump)
+        jitcelltoken = label_op.getdescr()
+        if jitcelltoken.target_tokens is None:
+            jitcelltoken.target_tokens = []
+        target_token = TargetToken(jitcelltoken,
+                                   original_jitcell_token=jitcelltoken)
+        target_token.original_jitcell_token = jitcelltoken
+        target_token.virtual_state = virtual_state
+        target_token.short_preamble = short_preamble
+        jitcelltoken.target_tokens.append(target_token)
+        return target_token, new_used_boxes
+
     def jump_to_preamble(self, cell_token, jump_op, info):
         assert cell_token.target_tokens[0].virtual_state is None
         jump_op = jump_op.copy_and_change(rop.JUMP,
@@ -179,7 +200,7 @@
         return info, self.optimizer._newoperations[:]
 
 
-    def jump_to_existing_trace(self, jump_op, inline_short_preamble):
+    def jump_to_existing_trace(self, jump_op):
         jitcelltoken = jump_op.getdescr()
         args = [self.get_box_replacement(op) for op in jump_op.getarglist()]
         virtual_state = self.get_virtual_state(args)
@@ -203,7 +224,7 @@
                 continue
             short_preamble = target_token.short_preamble
             pass_to_short = target_virtual_state.make_inputargs(args,
-                self.optimizer, force_boxes=True, append_virtuals=True)
+                self.optimizer, append_virtuals=True)
             args = target_virtual_state.make_inputargs(args,
                 self.optimizer)
             extra = self.inline_short_preamble(pass_to_short,
@@ -215,22 +236,6 @@
             return None # explicit because the return can be non-None
         return virtual_state
 
-    def filter_extra_jump_args(self, label_args, jump_args):
-        label_args = [self.get_box_replacement(x, True) for x in label_args]
-        jump_args = [self.get_box_replacement(x) for x in jump_args]
-        new_label_args = []
-        new_jump_args = []
-        assert len(label_args) == len(jump_args)
-        d = {}
-        for i in range(len(label_args)):
-            arg = label_args[i]
-            if arg in d:
-                continue
-            new_label_args.append(arg)
-            new_jump_args.append(jump_args[i])
-            d[arg] = None
-        return new_label_args, new_jump_args
-
     def inline_short_preamble(self, jump_args, short_inputargs, short_ops,
                               short_jump_op, patchguardop):
         try:
@@ -318,13 +323,13 @@
 class UnrollInfo(LoopInfo):
     """ A state after optimizing the peeled loop, contains the following:
 
-    * short_preamble - list of operations that go into short preamble
-    * label_args - additional things to put in the label
+    * target_token - generated target token
+    * 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, short_preamble, label_args, extra_same_as):
-        self.short_preamble = short_preamble
-        self.label_args = label_args
+    def __init__(self, target_token, label_op, extra_same_as):
+        self.target_token = target_token
+        self.label_op = label_op
         self.extra_same_as = extra_same_as
 
     def final(self):
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py 
b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -133,12 +133,18 @@
             if box is not None:
                 fieldbox = opinfo._fields[self.fielddescrs[i].get_index()]
                 # must be there
-                fieldinfo = get_forwarded(fieldbox)
+                if fieldbox is not None:
+                    fieldinfo = get_forwarded(fieldbox)
+                else:
+                    fieldinfo = None
             else:
                 fieldbox = None
                 fieldinfo = None
-            self.fieldstate[i].generate_guards(other.fieldstate[i], fieldbox,
-                                               fieldinfo, state)
+            # XXX all those ifs are for tests, not sure what to do
+            if self.fieldstate[i] is not None:
+                self.fieldstate[i].generate_guards(other.fieldstate[i],
+                                                   fieldbox,
+                                                   fieldinfo, state)
 
 
     def _generalization_of_structpart(self, other):
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to