This also avoids the ICE in PR89779 but IMHO is not a real fix.

Still it restores a previously active check against released SSA names
which now have error_mark_node type rather than NULL.  The new way
opens up consolidation so I've adjusted tree_nop_conversion plus
operand_equal_p which got a defensive check at the same time
(and checks for error_mark_node right before that check).

Bootstrap & regtest running on x86_64-unknown-linux-gnu.

The testcase comes with the other patch (but still included below).

Richard.

2019-03-21  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/89779
        * tree.c (tree_nop_conversion): Consolidate and fix defensive
        checks with respect to released SSA names now having error_mark_node
        type.
        * fold-const.c (operand_equal_p): Likewise.

Index: gcc/tree.c
===================================================================
--- gcc/tree.c  (revision 269832)
+++ gcc/tree.c  (working copy)
@@ -12812,13 +12812,10 @@ tree_nop_conversion (const_tree exp)
   if (!CONVERT_EXPR_P (exp)
       && TREE_CODE (exp) != NON_LVALUE_EXPR)
     return false;
-  if (TREE_OPERAND (exp, 0) == error_mark_node)
-    return false;
 
   outer_type = TREE_TYPE (exp);
   inner_type = TREE_TYPE (TREE_OPERAND (exp, 0));
-
-  if (!inner_type)
+  if (inner_type == error_mark_node)
     return false;
 
   return tree_nop_conversion_p (outer_type, inner_type);
Index: gcc/fold-const.c
===================================================================
--- gcc/fold-const.c    (revision 269832)
+++ gcc/fold-const.c    (working copy)
@@ -2973,11 +2973,6 @@ operand_equal_p (const_tree arg0, const_
       || TREE_TYPE (arg1) == error_mark_node)
     return 0;
 
-  /* Similar, if either does not have a type (like a released SSA name), 
-     they aren't equal.  */
-  if (!TREE_TYPE (arg0) || !TREE_TYPE (arg1))
-    return 0;
-
   /* We cannot consider pointers to different address space equal.  */
   if (POINTER_TYPE_P (TREE_TYPE (arg0))
       && POINTER_TYPE_P (TREE_TYPE (arg1))
Index: gcc/testsuite/gcc.dg/torture/pr89779.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr89779.c      (nonexistent)
+++ gcc/testsuite/gcc.dg/torture/pr89779.c      (working copy)
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+typedef int a;
+void h(a);
+void c(a *d, int b)
+{
+  int e, f, g;
+  for (; e; e++)
+    for (f = 0; f < 4; f++)
+      if (d)
+       for (g = e + 1; g; g++)
+         h(d[g]);
+}
+void i()
+{
+  a *j;
+  int k, l;
+  for (; k; k++)
+    c(j, l);
+}

Reply via email to