[PATCH] Restore defensive check in tree_nop_conversion (also PR89779 "fix")

Richard Biener rguenther@suse.de
Thu Mar 21 14:04:00 GMT 2019


On Thu, 21 Mar 2019, Richard Biener wrote:

> 
> 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).

Ugh, looks like my defense installed for released SSA names is now
relied upon by the C++ FE via

#2  0x0000000001864a96 in tree_strip_nop_conversions (
    exp=<convert_expr 0x7ffff69bc920>)
    at /space/rguenther/src/svn/trunk2/gcc/tree.c:12848
#3  0x0000000000ab2d2f in iterative_hash_template_arg (
    arg=<convert_expr 0x7ffff69bc920>, val=3363282904)
    at /space/rguenther/src/svn/trunk2/gcc/cp/pt.c:1751

for

 <convert_expr 0x7ffff69bc920
    type <integer_type 0x7ffff68985e8 int public type_6 SI
        size <integer_cst 0x7ffff689c078 constant 32>
        unit-size <integer_cst 0x7ffff689c090 constant 4>
        align:32 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
0x7ffff68985e8 precision:32 min <integer_cst 0x7ffff689c030 -2147483648> 
max <integer_cst 0x7ffff689c048 2147483647>
        pointer_to_this <pointer_type 0x7ffff68a19d8>>
   
    arg:0 <scope_ref 0x7ffff69d0b40 tree_0
        arg:0 <template_type_parm 0x7ffff69d17e0 i tree_0 type_0 type_6 
VOID
            align:8 warn_if_not_align:0 symtab:0 alias-set -1 
canonical-type 0x7ffff69d1150
           index 0 level 1 orig_level 1
            chain <type_decl 0x7ffff69d2098 i>>
        arg:1 <identifier_node 0x7ffff69c39c0 c
            normal local bindings <(nil)>>>>

where both the SCOPE_REF and TEMPLATE_TYPE_PARM have NULL
TREE_TYPE.

So I'll restore the NULL check in tree_nop_conversion.

But since the C++ FE overloads almost every tree field possible
I wonder whether that STRIP_NOPS in iterative_hash_template_arg
is a good idea?

Also I hope the FE doesn't call into operand_equal_p with such
typed trees.

Updated patch below, retesting now.

Thanks,
Richard.

2019-03-21  Richard Biener  <rguenther@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 || 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);
+}



More information about the Gcc-patches mailing list