Author: Maciej Fijalkowski <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit