Author: Carl Friedrich Bolz <cfb...@gmx.de>
Branch: better-storesink
Changeset: r87728:e61a042a601e
Date: 2016-09-22 18:49 +0200
http://bitbucket.org/pypy/pypy/changeset/e61a042a601e/

Log:    don't remove things if they can raise

diff --git a/rpython/translator/backendopt/cse.py 
b/rpython/translator/backendopt/cse.py
--- a/rpython/translator/backendopt/cse.py
+++ b/rpython/translator/backendopt/cse.py
@@ -233,7 +233,8 @@
                 return self._var_rep(arg)
             return arg
         added_same_as = 0
-        for op in block.operations:
+        for opindex in range(len(block.operations) - block.canraise):
+            op = block.operations[opindex]
             # heap operations
             if op.opname == 'getfield':
                 fieldname = op.args[1].value
diff --git a/rpython/translator/backendopt/test/test_cse.py 
b/rpython/translator/backendopt/test/test_cse.py
--- a/rpython/translator/backendopt/test/test_cse.py
+++ b/rpython/translator/backendopt/test/test_cse.py
@@ -565,8 +565,20 @@
         def f(x):
             return p(x) + p(x)
 
-        self.check(f, [int], fullopts=False, direct_call=1)
+        self.check(f, [int], direct_call=1)
 
+    def test_remove_duplicate_elidable_call_raises(self):
+        @jit.elidable
+        def p(x):
+            return x + 1
+
+        def f(x):
+            try:
+                return p(x) + p(x)
+            except IndexError:
+                return -5
+
+        self.check(f, [int], direct_call=2)
 
 def fakevar(name='v'):
     var = Variable(name)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to