diff mbox

[P1,PR,tree-optimization/80374] Do not try to convert integer_zero_node to undesirable types

Message ID 748896a2-9273-b008-f840-815a4e59f3f7@redhat.com
State New
Headers show

Commit Message

Jeff Law April 10, 2017, 7:20 p.m. UTC
fold_convert can fail for certain types.  It can fail either by 
returning a error_mark_node or triggering a gcc_assert depending on the 
exact situation.

Both are problematical.  This patch checks that we can convert 
integer_zero_node to the proper type before calling fold_convert.

Bootstrapped and regression tested on x86_64.  Installing on the trunk.

Jeff
diff mbox

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6edad21..7db5359 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@ 
+2017-04-10  Jeff Law  <law@redhat.com>
+
+	PR tree-optimization/80374
+	* tree-ssa-dom.c (derive_equivalences_from_bit_ior): Do not try to
+	record anything if we can not convert integer_zero_node to the
+	desired type.
+
 2017-04-10  Bin Cheng  <bin.cheng@arm.com>
 
 	PR tree-optimization/80153
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b87d0ee..6ed3c99 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@ 
+2017-04-10  Jeff Law  <law@redhat.com>
+
+	PR tree-optimization/80374
+	* g++.dg/pr80374.c: New test.
+
 2017-04-10  Daniel Santos <daniel.santos@pobox.com>
 
 	PR testsuite/79867
diff --git a/gcc/testsuite/g++.dg/pr80374.C b/gcc/testsuite/g++.dg/pr80374.C
new file mode 100644
index 0000000..b02b656
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr80374.C
@@ -0,0 +1,19 @@ 
+void a (const char *, const char *, int, const char *)
+  __attribute__ ((__noreturn__));
+template <typename b, int>
+void
+c () try
+  {
+    throw;
+  }
+catch (b d)
+  {
+    if (d)
+      a ("", "", 2, __PRETTY_FUNCTION__);
+  }
+main ()
+{
+  using e = decltype (nullptr);
+  c<volatile e, true> ();
+}
+
diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c
index d2263bb..d9e5942 100644
--- a/gcc/tree-ssa-dom.c
+++ b/gcc/tree-ssa-dom.c
@@ -701,7 +701,8 @@  derive_equivalences_from_bit_ior (tree name,
 				  const_and_copies *const_and_copies,
 				  int recursion_limit)
 {
-  if (recursion_limit == 0)
+  if (recursion_limit == 0
+      || !fold_convertible_p (TREE_TYPE (name), integer_zero_node))
     return;
 
   if (TREE_CODE (name) == SSA_NAME)