re PR middle-end/70843 (ICE in add_expr, at tree.c:7913)
authorJakub Jelinek <jakub@redhat.com>
Thu, 28 Apr 2016 22:23:01 +0000 (00:23 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 28 Apr 2016 22:23:01 +0000 (00:23 +0200)
PR middle-end/70843
* fold-const.c (operand_equal_p): Don't verify hash value equality
if arg0 == arg1.
* tree.c (inchash::add_expr): Handle STATEMENT_LIST.  Ignore BLOCK
and OMP_CLAUSE.

* gcc.dg/pr70843.c: New test.

From-SVN: r235615

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr70843.c [new file with mode: 0644]
gcc/tree.c

index 2a23ed86b91222ec74d7deff6e0f1ffe9aad7a33..400a65af02a365c2008d0122dc1244378a726d8e 100644 (file)
@@ -1,3 +1,11 @@
+2016-04-29  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/70843
+       * fold-const.c (operand_equal_p): Don't verify hash value equality
+       if arg0 == arg1.
+       * tree.c (inchash::add_expr): Handle STATEMENT_LIST.  Ignore BLOCK
+       and OMP_CLAUSE.
+
 2016-04-28  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/70858
index 96d8484c1eb7e46e0d7d9e875dd714396a1954fc..69749a85231ef2eff03a7cbf179a01182d80086f 100644 (file)
@@ -2756,12 +2756,15 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
     {
       if (operand_equal_p (arg0, arg1, flags | OEP_NO_HASH_CHECK))
        {
-         inchash::hash hstate0 (0), hstate1 (0);
-         inchash::add_expr (arg0, hstate0, flags);
-         inchash::add_expr (arg1, hstate1, flags);
-         hashval_t h0 = hstate0.end ();
-         hashval_t h1 = hstate1.end ();
-         gcc_assert (h0 == h1);
+         if (arg0 != arg1)
+           {
+             inchash::hash hstate0 (0), hstate1 (0);
+             inchash::add_expr (arg0, hstate0, flags);
+             inchash::add_expr (arg1, hstate1, flags);
+             hashval_t h0 = hstate0.end ();
+             hashval_t h1 = hstate1.end ();
+             gcc_assert (h0 == h1);
+           }
          return 1;
        }
       else
index 595e3a8e016804bdf53440d8bbc376839331846b..d9e1e03760eebae18a551d5f734bd6245044bee3 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-29  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/70843
+       * gcc.dg/pr70843.c: New test.
+
 2016-04-28  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/70858
diff --git a/gcc/testsuite/gcc.dg/pr70843.c b/gcc/testsuite/gcc.dg/pr70843.c
new file mode 100644 (file)
index 0000000..c3c9212
--- /dev/null
@@ -0,0 +1,9 @@
+/* PR middle-end/70843 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+int
+foo (int x, int y)
+{
+  return ({ int a = 5; a += x; a *= y; a; }) ? : 2;
+}
index 869218207b7d39b2e38c07be0449d9070a0e3d51..8ec2d5c146c1d5e31838b4167c16ff7e05f596a7 100644 (file)
@@ -7836,6 +7836,10 @@ add_expr (const_tree t, inchash::hash &hstate, unsigned int flags)
     case PLACEHOLDER_EXPR:
       /* The node itself doesn't matter.  */
       return;
+    case BLOCK:
+    case OMP_CLAUSE:
+      /* Ignore.  */
+      return;
     case TREE_LIST:
       /* A list of expressions, for a CALL_EXPR or as the elements of a
         VECTOR_CST.  */
@@ -7854,6 +7858,14 @@ add_expr (const_tree t, inchash::hash &hstate, unsigned int flags)
          }
        return;
       }
+    case STATEMENT_LIST:
+      {
+       tree_stmt_iterator i;
+       for (i = tsi_start (CONST_CAST_TREE (t));
+            !tsi_end_p (i); tsi_next (&i))
+         inchash::add_expr (tsi_stmt (i), hstate, flags);
+       return;
+      }
     case FUNCTION_DECL:
       /* When referring to a built-in FUNCTION_DECL, use the __builtin__ form.
         Otherwise nodes that compare equal according to operand_equal_p might