Author: Maciej Fijalkowski <fij...@gmail.com> Branch: share-guard-info Changeset: r79794:36135e62ace3 Date: 2015-09-23 18:41 +0200 http://bitbucket.org/pypy/pypy/changeset/36135e62ace3/
Log: shuffle code around so we don't flush setfields when guards are optimized away diff --git a/rpython/jit/metainterp/optimizeopt/heap.py b/rpython/jit/metainterp/optimizeopt/heap.py --- a/rpython/jit/metainterp/optimizeopt/heap.py +++ b/rpython/jit/metainterp/optimizeopt/heap.py @@ -11,7 +11,7 @@ from rpython.jit.metainterp.optimizeopt.shortpreamble import PreambleOp from rpython.jit.metainterp.optimize import InvalidLoop from rpython.jit.metainterp.resoperation import rop, ResOperation, OpHelpers,\ - AbstractResOp + AbstractResOp, GuardResOp from rpython.rlib.objectmodel import we_are_translated from rpython.jit.metainterp.optimizeopt import info @@ -289,6 +289,19 @@ return cf def emit_operation(self, op): + if op.is_guard(): + assert isinstance(op, GuardResOp) + origin_jitcode = self.optimizer.origin_jitcode + origin_pc = self.optimizer.origin_pc + if origin_jitcode is not None: + if (origin_jitcode is op.rd_frame_info_list.jitcode and + origin_pc == op.rd_frame_info_list.pc): + self.optimizer.origin_jitcode = None + self.optimizer.origin_pc = 0 + elif op.getopnum() != rop.GUARD_OVERFLOW: + self.optimizer.potentially_change_ovf_op_to_no_ovf(op) + return # we optimize the guard + self.emitting_operation(op) self.emit_postponed_op() if (op.is_comparison() or op.is_call_may_force() diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py --- a/rpython/jit/metainterp/optimizeopt/info.py +++ b/rpython/jit/metainterp/optimizeopt/info.py @@ -107,7 +107,10 @@ self.last_guard_pos = -1 def mark_last_guard(self, optimizer): - if optimizer.getlastop() is None: + if (optimizer.getlastop() is None or + not optimizer.getlastop().is_guard()): + # there can be a really emitted operation that's not a guard + # e.g. a setfield, ignore those return self.last_guard_pos = len(optimizer._newoperations) - 1 assert self.get_last_guard(optimizer).is_guard() 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 @@ -567,14 +567,6 @@ self.metainterp_sd.profiler.count(jitprof.Counters.OPT_OPS) if op.is_guard(): assert isinstance(op, GuardResOp) - if self.origin_jitcode is not None: - if (self.origin_jitcode is op.rd_frame_info_list.jitcode and - self.origin_pc == op.rd_frame_info_list.pc): - self.origin_jitcode = None - self.origin_pc = 0 - elif op.getopnum() != rop.GUARD_OVERFLOW: - self.potentially_change_ovf_op_to_no_ovf(op) - return # we optimize the guard self.metainterp_sd.profiler.count(jitprof.Counters.OPT_GUARDS) pendingfields = self.pendingfields self.pendingfields = None @@ -618,6 +610,9 @@ # a guard_no_overflow change to int_add if op.getopnum() != rop.GUARD_NO_OVERFLOW: return + if not self._newoperations: + # got optimized otherwise + return op = self._newoperations[-1] if not op.is_ovf(): return _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit