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

Reply via email to