Author: Carl Friedrich Bolz <[email protected]>
Branch:
Changeset: r87149:78469828ece4
Date: 2016-09-16 22:45 +0200
http://bitbucket.org/pypy/pypy/changeset/78469828ece4/
Log: don't crash in merge_if_blocks if the values are symbolics
(bit obscure case, but managed to get it)
diff --git a/rpython/translator/backendopt/merge_if_blocks.py
b/rpython/translator/backendopt/merge_if_blocks.py
--- a/rpython/translator/backendopt/merge_if_blocks.py
+++ b/rpython/translator/backendopt/merge_if_blocks.py
@@ -20,6 +20,14 @@
return False
if isinstance(op.args[0], Constant) and isinstance(op.args[1], Constant):
return False
+ # check that the constant is hashable (ie not a symbolic)
+ try:
+ if isinstance(op.args[0], Constant):
+ hash(op.args[0].value)
+ else:
+ hash(op.args[1].value)
+ except TypeError:
+ return False
return True
def merge_chain(chain, checkvar, varmap, graph):
diff --git a/rpython/translator/backendopt/test/test_merge_if_blocks.py
b/rpython/translator/backendopt/test/test_merge_if_blocks.py
--- a/rpython/translator/backendopt/test/test_merge_if_blocks.py
+++ b/rpython/translator/backendopt/test/test_merge_if_blocks.py
@@ -2,11 +2,12 @@
from rpython.translator.backendopt.merge_if_blocks import merge_if_blocks
from rpython.translator.backendopt.all import backend_optimizations
from rpython.translator.translator import TranslationContext, graphof as
tgraphof
-from rpython.flowspace.model import Block
+from rpython.flowspace.model import Block, checkgraph
from rpython.translator.backendopt.removenoops import remove_same_as
from rpython.rtyper.llinterp import LLInterpreter
from rpython.rlib.rarithmetic import r_uint, r_ulonglong, r_longlong, r_int
from rpython.annotator.model import SomeChar, SomeUnicodeCodePoint
+from rpython.rlib.objectmodel import CDefinedIntSymbolic
def do_test_merge(fn, testvalues):
t = TranslationContext()
@@ -225,3 +226,29 @@
malloc.remove_mallocs(t, t.graphs)
from rpython.translator import simplify
simplify.join_blocks(graph)
+
+def test_switch_on_symbolic():
+ symb1 = CDefinedIntSymbolic("1", 1)
+ symb2 = CDefinedIntSymbolic("2", 2)
+ symb3 = CDefinedIntSymbolic("3", 3)
+ def fn(x):
+ res = 0
+ if x == symb1:
+ res += x + 1
+ elif x == symb2:
+ res += x + 2
+ elif x == symb3:
+ res += x + 3
+ res += 1
+ return res
+ t = TranslationContext()
+ a = t.buildannotator()
+ a.build_types(fn, [int])
+ rtyper = t.buildrtyper()
+ rtyper.specialize()
+ graph = t.graphs[0]
+ remove_same_as(graph)
+ res = merge_if_blocks_once(graph)
+ assert not res
+ checkgraph(graph)
+
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit