[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