Author: fijal Branch: share-resume-info-frontend Changeset: r79951:8f127bb6d398 Date: 2015-10-03 14:55 +0200 http://bitbucket.org/pypy/pypy/changeset/8f127bb6d398/
Log: start fighting with sharing guards on the frontend, give up for now diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py --- a/rpython/jit/metainterp/history.py +++ b/rpython/jit/metainterp/history.py @@ -615,10 +615,13 @@ def __init__(self): self.inputargs = None self.operations = [] + self.last_guard_valid = False @specialize.argtype(3) def record(self, opnum, argboxes, value, descr=None): op = ResOperation(opnum, argboxes, descr) + if op.can_invalidate_guard_operation(): + self.last_guard_valid = False if value is None: assert op.type == 'v' elif isinstance(value, bool): 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 @@ -581,8 +581,7 @@ op = self.emit_guard_operation(op, pendingfields) elif op.can_raise(): self.exception_might_have_happened = True - if ((op.has_no_side_effect() or op.is_guard() or op.is_jit_debug() or - op.is_ovf()) and not self.is_call_pure_pure_canraise(op)): + if not op.can_invalidate_guard_operation(): pass else: self._last_guard_op = None @@ -649,14 +648,6 @@ def getlastop(self): return self._really_emitted_operation - def is_call_pure_pure_canraise(self, op): - if not op.is_call_pure(): - return False - effectinfo = op.getdescr().get_extra_info() - if effectinfo.check_can_raise(ignore_memoryerror=True): - return True - return False - def replace_guard_op(self, old_op_pos, new_op): old_op = self._newoperations[old_op_pos] assert old_op.is_guard() diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py --- a/rpython/jit/metainterp/pyjitpl.py +++ b/rpython/jit/metainterp/pyjitpl.py @@ -2046,7 +2046,9 @@ else: guard_op = self.history.record(opnum, moreargs, None) assert isinstance(guard_op, GuardResOp) - self.capture_resumedata(guard_op, resumepc) + if not self.history.last_guard_valid: + self.capture_resumedata(guard_op, resumepc) + self.history.last_guard_valid = True self.staticdata.profiler.count_ops(opnum, Counters.GUARDS) # count self.attach_debug_info(guard_op) diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py --- a/rpython/jit/metainterp/resoperation.py +++ b/rpython/jit/metainterp/resoperation.py @@ -322,6 +322,21 @@ def forget_value(self): pass + def can_invalidate_guard_operation(self): + if ((self.has_no_side_effect() or self.is_guard() or self.is_jit_debug() or + self.is_ovf()) and not self.is_call_pure_pure_canraise()): + return False + return True + + def is_call_pure_pure_canraise(self): + if not self.is_call_pure(): + return False + effectinfo = self.getdescr().get_extra_info() + if effectinfo.check_can_raise(ignore_memoryerror=True): + return True + return False + + # =================== # Top of the hierachy _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit