[pypy-commit] pypy share-guard-info: don't share across potentially raising call_pure

fijal noreply at buildbot.pypy.org
Tue Sep 22 11:44:20 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: share-guard-info
Changeset: r79760:22755212f028
Date: 2015-09-22 11:44 +0200
http://bitbucket.org/pypy/pypy/changeset/22755212f028/

Log:	don't share across potentially raising call_pure

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
@@ -587,7 +587,8 @@
                 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():
+        if (op.has_no_side_effect() or op.is_guard() or op.is_jit_debug() and
+            not self.is_call_pure_pure_canraise(op)):
             pass
         else:
             self._last_guard_op = None
@@ -602,7 +603,6 @@
                                              self._last_guard_op)
         else:
             op = self.store_final_boxes_in_guard(guard_op, pendingfields)
-            #if op.getopnum() not in (rop.GUARD_EXCEPTION, rop.GUARD_OVERFLOW):
             self._last_guard_op = op
             # for unrolling
             for farg in op.getfailargs():
@@ -627,6 +627,14 @@
     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()


More information about the pypy-commit mailing list