[pypy-commit] pypy optresult-unroll: a fix to force the right virtual state if we have one, maybe we can simplify jump_to_existing trace just by passing one

fijal noreply at buildbot.pypy.org
Wed Sep 2 11:39:03 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79368:ededaf3d4b4d
Date: 2015-09-02 11:38 +0200
http://bitbucket.org/pypy/pypy/changeset/ededaf3d4b4d/

Log:	a fix to force the right virtual state if we have one, maybe we can
	simplify jump_to_existing trace just by passing one

diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -562,7 +562,7 @@
         frame_depth = max(self.current_clt.frame_info.jfi_frame_depth,
                           frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE)
         if logger:
-            logger.log_bridge(inputargs, operations, "rewritten",
+            logger.log_bridge(inputargs, operations, "rewritten", faildescr,
                               ops_offset=ops_offset)
         self.fixup_target_tokens(rawstart)
         self.update_frame_depth(frame_depth)
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
@@ -3,6 +3,7 @@
 from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes,\
      ShortPreambleBuilder, ExtendedShortPreambleBuilder, PreambleOp
 from rpython.jit.metainterp.optimizeopt import info, intutils
+from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,\
      Optimization, LoopInfo, MININT, MAXINT
 from rpython.jit.metainterp.optimizeopt.vstring import StrPtrInfo
@@ -122,7 +123,18 @@
             start_label.getarglist()[:], ops, call_pure_results, False,
             flush=False)
         label_op = ResOperation(rop.LABEL, label_args, start_label.getdescr())
-        args = state.virtual_state.make_inputargs(
+        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,
+                                                       state.virtual_state,
+                                                celltoken.target_tokens)
+        # force the boxes for virtual state to match
+        args = target_virtual_state.make_inputargs(
             [self.get_box_replacement(x) for x in end_jump.getarglist()],
             self.optimizer, force_boxes=True)
         for arg in args:
@@ -131,11 +143,8 @@
         target_token = self.finalize_short_preamble(label_op,
                                                     state.virtual_state)
         label_op.setdescr(target_token)
-        # force the boxes for virtual state to match
         new_virtual_state = self.jump_to_existing_trace(end_jump, label_op)
         if new_virtual_state is not None:
-            celltoken = start_label.getdescr()
-            assert isinstance(celltoken, JitCellToken)
             self.jump_to_preamble(celltoken, end_jump, info)
             return (UnrollInfo(target_token, label_op, [],
                                self.optimizer.quasi_immutable_deps),
@@ -144,6 +153,16 @@
                            self.optimizer.quasi_immutable_deps),
                 self.optimizer._newoperations)
 
+    def pick_virtual_state(self, my_vs, label_vs, target_tokens):
+        if target_tokens is None:
+            return label_vs # for tests
+        for token in target_tokens:
+            if token.virtual_state is None:
+                continue
+            if token.virtual_state.generalization_of(my_vs, self.optimizer):
+                return token.virtual_state
+        return label_vs
+
     def optimize_bridge(self, start_label, operations, call_pure_results,
                         inline_short_preamble):
         self._check_no_forwarding([start_label.getarglist(),
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
@@ -145,10 +145,12 @@
         assert isinstance(other, AbstractVirtualStructStateInfo)
         assert len(self.fielddescrs) == len(self.fieldstate)
         assert len(other.fielddescrs) == len(other.fieldstate)
-        opinfo = state.optimizer.getptrinfo(box)
         if runtime_box is not None:
+            opinfo = state.optimizer.getptrinfo(box)
             assert opinfo.is_virtual()
-        assert isinstance(opinfo, AbstractStructPtrInfo)
+            assert isinstance(opinfo, AbstractStructPtrInfo)
+        else:
+            opinfo = None
 
         if len(self.fielddescrs) != len(other.fielddescrs):
             raise VirtualStatesCantMatch("field descrs don't match")
@@ -551,8 +553,8 @@
             if s:
                 s.enum(self)
 
-    def generalization_of(self, other, bad=None, cpu=None):
-        state = GenerateGuardState(cpu=cpu, bad=bad)
+    def generalization_of(self, other, optimizer):
+        state = GenerateGuardState(optimizer)
         assert len(self.state) == len(other.state)
         try:
             for i in range(len(self.state)):
diff --git a/rpython/jit/metainterp/test/test_virtual.py b/rpython/jit/metainterp/test/test_virtual.py
--- a/rpython/jit/metainterp/test/test_virtual.py
+++ b/rpython/jit/metainterp/test/test_virtual.py
@@ -214,7 +214,7 @@
         assert res == f(20)
         self.check_trace_count(2)
         self.check_resops(**{self._new_op: 1})
-        self.check_resops(int_mul=0, call=1)
+        self.check_resops(int_mul=0, call_i=1)
 
     def test_two_virtuals(self):
         myjitdriver = JitDriver(greens=[], reds=['n', 'prev'])


More information about the pypy-commit mailing list