[pypy-commit] pypy optresult-unroll: fix fix ifx

fijal noreply at buildbot.pypy.org
Wed Sep 2 13:09:41 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r79370:03db733f67cf
Date: 2015-09-02 12:51 +0200
http://bitbucket.org/pypy/pypy/changeset/03db733f67cf/

Log:	fix fix ifx

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,4 +1,5 @@
 
+import sys
 from rpython.jit.metainterp.history import Const, TargetToken, JitCellToken
 from rpython.jit.metainterp.optimizeopt.shortpreamble import ShortBoxes,\
      ShortPreambleBuilder, ExtendedShortPreambleBuilder, PreambleOp
@@ -143,16 +144,37 @@
         target_token = self.finalize_short_preamble(label_op,
                                                     state.virtual_state)
         label_op.setdescr(target_token)
-        new_virtual_state = self.jump_to_existing_trace(end_jump, label_op)
+        try:
+            new_virtual_state = self.jump_to_existing_trace(end_jump, label_op)
+        except InvalidLoop:
+            # inlining short preamble failed, jump to preamble
+            self.jump_to_preamble(celltoken, end_jump, info)
+            return (UnrollInfo(target_token, label_op, [],
+                               self.optimizer.quasi_immutable_deps),
+                    self.optimizer._newoperations)            
         if new_virtual_state is not None:
             self.jump_to_preamble(celltoken, end_jump, info)
             return (UnrollInfo(target_token, label_op, [],
                                self.optimizer.quasi_immutable_deps),
                     self.optimizer._newoperations)
+
+        self.disable_retracing_if_max_retrace_guards(
+            self.optimizer._newoperations, target_token)
+        
         return (UnrollInfo(target_token, label_op, extra_same_as,
                            self.optimizer.quasi_immutable_deps),
                 self.optimizer._newoperations)
 
+    def disable_retracing_if_max_retrace_guards(self, ops, target_token):
+        maxguards = self.optimizer.metainterp_sd.warmrunnerdesc.memory_manager.max_retrace_guards
+        count = 0
+        for op in ops:
+            if op.is_guard():
+                count += 1
+        if count > maxguards:
+            assert isinstance(target_token, TargetToken)
+            target_token.targeting_jitcell_token.retraced_count = sys.maxint
+
     def pick_virtual_state(self, my_vs, label_vs, target_tokens):
         if target_tokens is None:
             return label_vs # for tests
@@ -191,12 +213,6 @@
         else:
             debug_print("Retrace count reached, jumping to preamble")
             return self.jump_to_preamble(cell_token, jump_op, info)
-        #maxguards = warmrunnerdescr.memory_manager.max_retrace_guards
-        #guard_count = self.count_guards(self.optimizer._newoperations)
-        #if guard_count > maxguards:
-        #    target_token = cell_token.target_tokens[0]
-        #    target_token.targeting_jitcell_token.retraced_count = sys.maxint
-        #    return self.jump_to_preamble(cell_token, jump_op, info)
         exported_state = self.export_state(start_label,
                                            operations[-1].getarglist(),
                                            info.inputargs)
@@ -370,13 +386,6 @@
             return effectinfo.extraeffect != effectinfo.EF_ELIDABLE_CANNOT_RAISE
         return False
 
-    def count_guards(self, ops):
-        guard_count = 0
-        for op in ops:
-            if op.is_guard():
-                guard_count += 1
-        return guard_count
-
 
 class UnrollInfo(LoopInfo):
     """ A state after optimizing the peeled loop, contains the following:
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
@@ -294,15 +294,18 @@
                 raise VirtualStatesCantMatch("other is a different kind of array")
         fieldbox = None
         fieldbox_runtime = None
-        opinfo = state.optimizer.getptrinfo(box)
-        assert isinstance(opinfo, ArrayPtrInfo)
+        if box is not None:
+            opinfo = state.optimizer.getptrinfo(box)
+            assert isinstance(opinfo, ArrayPtrInfo)
+        else:
+            opinfo = None            
         for i in range(self.length):
             for descr in self.fielddescrs:
                 index = i * len(self.fielddescrs) + descr.get_index()
                 fieldstate = self.fieldstate[index]
                 if fieldstate is None:
                     continue
-                if box is not None:
+                if box is not None and opinfo is not None:
                     fieldbox = opinfo._items[index]
                     fieldbox_runtime = state.get_runtime_interiorfield(
                         runtime_box, descr, i)


More information about the pypy-commit mailing list