re PR tree-optimization/82264 (ICE in vn_phi_lookup at gcc/tree-ssa-sccvn.c:3125)
authorRichard Biener <rguenther@suse.de>
Wed, 20 Sep 2017 11:08:35 +0000 (11:08 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 20 Sep 2017 11:08:35 +0000 (11:08 +0000)
2017-09-20  Richard Biener  <rguenther@suse.de>

PR tree-optimization/82264
* tree-ssa-sccvn.c (vn_phi_eq): Use safe_dyn_cast to check
for GIMPLE_CONDs.
(vn_phi_lookup): Likewise.
(vn_phi_insert): Likewise.

* gcc.dg/torture/pr82264.c: New testcase.

From-SVN: r253005

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr82264.c [new file with mode: 0644]
gcc/tree-ssa-sccvn.c

index b82df9f61add084ceb73d8c4bd8d6f293b540c02..15b1095f1d12b71fa690ffd58607841026348622 100644 (file)
@@ -1,3 +1,11 @@
+2017-09-20  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/82264
+       * tree-ssa-sccvn.c (vn_phi_eq): Use safe_dyn_cast to check
+       for GIMPLE_CONDs.
+       (vn_phi_lookup): Likewise.
+       (vn_phi_insert): Likewise.
+
 2017-09-20  Jakub Jelinek  <jakub@redhat.com>
 
        * dwarf2out.c (tree_add_const_value_attribute): For INTEGER_CST
index 0247ada60f4563495f6105c8c028d861e4042495..da107c34b3d705122a48427402c3e847599478db 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-20  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/82264
+       * gcc.dg/torture/pr82264.c: New testcase.
+
 2017-09-20  Jakub Jelinek  <jakub@redhat.com>
 
        * g++.dg/debug/dwarf2/template-params-13.C: New test.
diff --git a/gcc/testsuite/gcc.dg/torture/pr82264.c b/gcc/testsuite/gcc.dg/torture/pr82264.c
new file mode 100644 (file)
index 0000000..2bc0367
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+
+char a;
+int c;
+unsigned b ();
+unsigned
+setjmp ()
+{
+}
+static void
+d ()
+{
+  if (b ())
+    c = 3;
+}
+void
+e ()
+{
+  d ();
+  a && ({ setjmp (); });
+}
index 0b0c5106d3022c362344617a2bb7735535ecad06..ca78e2d97cf6bcaf027fbf6180d7a8ca5b48cd8d 100644 (file)
@@ -3028,16 +3028,13 @@ vn_phi_eq (const_vn_phi_t const vp1, const_vn_phi_t const vp2)
              return false;
 
            /* Verify the controlling stmt is the same.  */
-           gimple *last1 = last_stmt (idom1);
-           gimple *last2 = last_stmt (idom2);
-           if (gimple_code (last1) != GIMPLE_COND
-               || gimple_code (last2) != GIMPLE_COND)
+           gcond *last1 = safe_dyn_cast <gcond *> (last_stmt (idom1));
+           gcond *last2 = safe_dyn_cast <gcond *> (last_stmt (idom2));
+           if (! last1 || ! last2)
              return false;
            bool inverted_p;
-           if (! cond_stmts_equal_p (as_a <gcond *> (last1),
-                                     vp1->cclhs, vp1->ccrhs,
-                                     as_a <gcond *> (last2),
-                                     vp2->cclhs, vp2->ccrhs,
+           if (! cond_stmts_equal_p (last1, vp1->cclhs, vp1->ccrhs,
+                                     last2, vp2->cclhs, vp2->ccrhs,
                                      &inverted_p))
              return false;
 
@@ -3122,7 +3119,7 @@ vn_phi_lookup (gimple *phi)
   vp1.ccrhs = NULL_TREE;
   basic_block idom1 = get_immediate_dominator (CDI_DOMINATORS, vp1.block);
   if (EDGE_COUNT (idom1->succs) == 2)
-    if (gcond *last1 = dyn_cast <gcond *> (last_stmt (idom1)))
+    if (gcond *last1 = safe_dyn_cast <gcond *> (last_stmt (idom1)))
       {
        vp1.cclhs = vn_valueize (gimple_cond_lhs (last1));
        vp1.ccrhs = vn_valueize (gimple_cond_rhs (last1));
@@ -3168,7 +3165,7 @@ vn_phi_insert (gimple *phi, tree result)
   vp1->ccrhs = NULL_TREE;
   basic_block idom1 = get_immediate_dominator (CDI_DOMINATORS, vp1->block);
   if (EDGE_COUNT (idom1->succs) == 2)
-    if (gcond *last1 = dyn_cast <gcond *> (last_stmt (idom1)))
+    if (gcond *last1 = safe_dyn_cast <gcond *> (last_stmt (idom1)))
       {
        vp1->cclhs = vn_valueize (gimple_cond_lhs (last1));
        vp1->ccrhs = vn_valueize (gimple_cond_rhs (last1));