diff mbox series

Cleanup tree merging

Message ID 20180902231442.GK68683@kam.mff.cuni.cz
State New
Headers show
Series Cleanup tree merging | expand

Commit Message

Jan Hubicka Sept. 2, 2018, 11:14 p.m. UTC
Hi,
while dropping streaming of now unnecesary fields I forgot to update lto.c
side.  This patch removes few checks form tree merging that will hopefully
make it bit faster. While doing that I also turned DECL_ASSEMBLER_NAME 
check to use DECL_ASSEMBLER_NAME_RAW.

lto-bootstraped/regtested x86_64-linux.
OK?

Honza
	* lto.c (mentions_vars_p_function): Do not check DECL_ARGUMENTS and
	VINDEX.
	(mentions_vars_p_field_decl): Do not check DECL_FCONTEXT.
	(mentions_vars_p_binfo): Do not check BASE_ACCESSES, VIRTUALS and
	VPTR_FIELD.
	(compare_tree_sccs_1): Do no check BLOCKs; do not check
	BINFO_BASE_ACCESSES; function arguments and results, ORIGINAL_TYPE;
	use DECL_ASSEMBLER_NAME_RAW when comparing assembler names;
	do not check DECL_FCONTEXT; do not check DECL_VINDEX; do not check
	TYPE_STUB_DECL.
	(compare_tree_sccs_1): Do not check BINFO_BASE_ACCESS;
	BINFO_VPTR_FIELD, DECL_ARGUMENTS, DECL_VINDEX, DECL_FCONTEXT.

Comments

Richard Biener Sept. 3, 2018, 7:32 a.m. UTC | #1
On Mon, 3 Sep 2018, Jan Hubicka wrote:

> Hi,
> while dropping streaming of now unnecesary fields I forgot to update lto.c
> side.  This patch removes few checks form tree merging that will hopefully
> make it bit faster. While doing that I also turned DECL_ASSEMBLER_NAME 
> check to use DECL_ASSEMBLER_NAME_RAW.
> 
> lto-bootstraped/regtested x86_64-linux.
> OK?
> 
> Honza
> 	* lto.c (mentions_vars_p_function): Do not check DECL_ARGUMENTS and
> 	VINDEX.
> 	(mentions_vars_p_field_decl): Do not check DECL_FCONTEXT.
> 	(mentions_vars_p_binfo): Do not check BASE_ACCESSES, VIRTUALS and
> 	VPTR_FIELD.
> 	(compare_tree_sccs_1): Do no check BLOCKs; do not check
> 	BINFO_BASE_ACCESSES; function arguments and results, ORIGINAL_TYPE;
> 	use DECL_ASSEMBLER_NAME_RAW when comparing assembler names;
> 	do not check DECL_FCONTEXT; do not check DECL_VINDEX; do not check
> 	TYPE_STUB_DECL.
> 	(compare_tree_sccs_1): Do not check BINFO_BASE_ACCESS;
> 	BINFO_VPTR_FIELD, DECL_ARGUMENTS, DECL_VINDEX, DECL_FCONTEXT.
> 	
> Index: lto/lto.c
> ===================================================================
> --- lto/lto.c	(revision 263989)
> +++ lto/lto.c	(working copy)
> @@ -614,8 +614,8 @@ mentions_vars_p_function (tree t)
>  {
>    if (mentions_vars_p_decl_non_common (t))
>      return true;
> -  CHECK_NO_VAR (DECL_ARGUMENTS (t));
> -  CHECK_NO_VAR (DECL_VINDEX (t));
> +  gcc_checking_assert (!DECL_ARGUMENTS (t));
> +  gcc_checking_assert (!DECL_VINDEX (t));
>    CHECK_VAR (DECL_FUNCTION_PERSONALITY (t));
>    return false;
>  }
> @@ -631,7 +630,7 @@ mentions_vars_p_field_decl (tree t)
>    CHECK_NO_VAR (DECL_BIT_FIELD_TYPE (t));
>    CHECK_NO_VAR (DECL_QUALIFIER (t));
>    CHECK_NO_VAR (DECL_FIELD_BIT_OFFSET (t));
> -  CHECK_NO_VAR (DECL_FCONTEXT (t));
> +  gcc_checking_assert (!DECL_FCONTEXT (t));
>    return false;
>  }
>  
> @@ -672,11 +671,8 @@ mentions_vars_p_binfo (tree t)
>      return true;
>    CHECK_VAR (BINFO_VTABLE (t));
>    CHECK_NO_VAR (BINFO_OFFSET (t));
> -  CHECK_NO_VAR (BINFO_VIRTUALS (t));
> -  CHECK_NO_VAR (BINFO_VPTR_FIELD (t));
> -  n = vec_safe_length (BINFO_BASE_ACCESSES (t));
> -  for (i = 0; i < n; i++)
> -    CHECK_NO_VAR (BINFO_BASE_ACCESS (t, i));
> +  gcc_checking_assert (!BINFO_VIRTUALS (t));
> +  gcc_checking_assert (!BINFO_VPTR_FIELD (t));

Can you add

   gcc_checking_assert (vec_safe_lengthh (BINFO_BASE_ACCESSES (t)) == );

for completeness

>    /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
>       and BINFO_VPTR_INDEX; these are used by C++ FE only.  */
>    n = BINFO_N_BASE_BINFOS (t);
> @@ -1210,7 +1206,7 @@ compare_tree_sccs_1 (tree t1, tree t2, t
>    /* BLOCKs are function local and we don't merge anything there, so
>       simply refuse to merge.  */
>    if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
> -    return false;
> +    gcc_unreachable ();
>  
>    if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
>      if (strcmp (TRANSLATION_UNIT_LANGUAGE (t1),
> @@ -1227,9 +1223,8 @@ compare_tree_sccs_1 (tree t1, tree t2, t
>        return false;
>  
>    if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
> -    if (vec_safe_length (BINFO_BASE_ACCESSES (t1))
> -	!= vec_safe_length (BINFO_BASE_ACCESSES (t2)))
> -      return false;
> +    gcc_assert (!vec_safe_length (BINFO_BASE_ACCESSES (t1))
> +		&& !vec_safe_length (BINFO_BASE_ACCESSES (t2)));
>  
>    if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
>      compare_values (CONSTRUCTOR_NELTS);
> @@ -1362,23 +1357,17 @@ compare_tree_sccs_1 (tree t1, tree t2, t
>      {
>        if (code == FUNCTION_DECL)
>  	{
> -	  tree a1, a2;
> -	  for (a1 = DECL_ARGUMENTS (t1), a2 = DECL_ARGUMENTS (t2);
> -	       a1 || a2;
> -	       a1 = TREE_CHAIN (a1), a2 = TREE_CHAIN (a2))
> -	    compare_tree_edges (a1, a2);
> -	  compare_tree_edges (DECL_RESULT (t1), DECL_RESULT (t2));
> +	  gcc_checking_assert (!DECL_ARGUMENTS (t1));
> +	  gcc_checking_assert (!DECL_RESULT (t1));

Does this really work!?  I see we do not stream DECL_ARGUMENTS
but populate that by function body streaming.  Maybe add a comment
here.  I wonder what makes us avoid merging too many FUNCTION_DECLs
then?  Consider two functions with the same TYPE_ARG_TYPES but
differing DECL_BY_REFERENCE on the corresponding PARM_DECL?
[unfortunately type and decl specs are not sufficient on their own
semantically...]

With asserts in compare_tree_sccs_1 please always assert
for both t1 and t2.

Otherwise OK.

Richard.

>  	}
>        else if (code == TYPE_DECL)
> -	compare_tree_edges (DECL_ORIGINAL_TYPE (t1), DECL_ORIGINAL_TYPE (t2));
> +	gcc_checking_assert (!DECL_ORIGINAL_TYPE (t1));
>      }
>  
>    if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
>      {
> -      /* Make sure we don't inadvertently set the assembler name.  */
> -      if (DECL_ASSEMBLER_NAME_SET_P (t1))
> -	compare_tree_edges (DECL_ASSEMBLER_NAME (t1),
> -			    DECL_ASSEMBLER_NAME (t2));
> +      compare_tree_edges (DECL_ASSEMBLER_NAME_RAW (t1),
> +			  DECL_ASSEMBLER_NAME_RAW (t2));
>      }
>  
>    if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
> @@ -1389,14 +1378,14 @@ compare_tree_sccs_1 (tree t1, tree t2, t
>  			  DECL_BIT_FIELD_REPRESENTATIVE (t2));
>        compare_tree_edges (DECL_FIELD_BIT_OFFSET (t1),
>  			  DECL_FIELD_BIT_OFFSET (t2));
> -      compare_tree_edges (DECL_FCONTEXT (t1), DECL_FCONTEXT (t2));
> +      gcc_checking_assert (!DECL_FCONTEXT (t1));
>      }
>  
>    if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
>      {
>        compare_tree_edges (DECL_FUNCTION_PERSONALITY (t1),
>  			  DECL_FUNCTION_PERSONALITY (t2));
> -      compare_tree_edges (DECL_VINDEX (t1), DECL_VINDEX (t2));
> +      gcc_checking_assert (!DECL_VINDEX (t1));
>        compare_tree_edges (DECL_FUNCTION_SPECIFIC_TARGET (t1),
>  			  DECL_FUNCTION_SPECIFIC_TARGET (t2));
>        compare_tree_edges (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t1),
> @@ -1423,7 +1412,7 @@ compare_tree_sccs_1 (tree t1, tree t2, t
>  	compare_tree_edges (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2));
>        /* TYPE_CANONICAL is re-computed during type merging, so do not
>  	 compare it here.  */
> -      compare_tree_edges (TYPE_STUB_DECL (t1), TYPE_STUB_DECL (t2));
> +      gcc_checking_assert (!TYPE_STUB_DECL (t1));
>      }
>  
>    if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
> @@ -1468,7 +1457,7 @@ compare_tree_sccs_1 (tree t1, tree t2, t
>  
>        /* BLOCKs are function local and we don't merge anything there.  */
>        if (TREE_BLOCK (t1) || TREE_BLOCK (t2))
> -	return false;
> +	gcc_unreachable ();
>      }
>  
>    if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
> @@ -1478,11 +1467,9 @@ compare_tree_sccs_1 (tree t1, tree t2, t
>        /* Lengths have already been compared above.  */
>        FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t1), i, t)
>  	compare_tree_edges (t, BINFO_BASE_BINFO (t2, i));
> -      FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (t1), i, t)
> -	compare_tree_edges (t, BINFO_BASE_ACCESS (t2, i));
>        compare_tree_edges (BINFO_OFFSET (t1), BINFO_OFFSET (t2));
>        compare_tree_edges (BINFO_VTABLE (t1), BINFO_VTABLE (t2));
> -      compare_tree_edges (BINFO_VPTR_FIELD (t1), BINFO_VPTR_FIELD (t2));
> +      gcc_checking_assert (!BINFO_VPTR_FIELD (t1));
>        /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
>  	 and BINFO_VPTR_INDEX; these are used by C++ FE only.  */
>      }
> @@ -2621,9 +2608,9 @@ lto_fixup_prevailing_decls (tree t)
>  	}
>        if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
>  	{
> -	  LTO_NO_PREVAIL (DECL_ARGUMENTS (t));
> +          gcc_checking_assert (!DECL_ARGUMENTS (t));
>  	  LTO_SET_PREVAIL (DECL_FUNCTION_PERSONALITY (t));
> -	  LTO_NO_PREVAIL (DECL_VINDEX (t));
> +          gcc_checking_assert (!DECL_VINDEX (t));
>  	}
>        if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
>  	{
> @@ -2631,7 +2618,7 @@ lto_fixup_prevailing_decls (tree t)
>  	  LTO_NO_PREVAIL (DECL_BIT_FIELD_TYPE (t));
>  	  LTO_NO_PREVAIL (DECL_QUALIFIER (t));
>  	  LTO_NO_PREVAIL (DECL_FIELD_BIT_OFFSET (t));
> -	  LTO_NO_PREVAIL (DECL_FCONTEXT (t));
> +          gcc_checking_assert (!DECL_FCONTEXT (t));
>  	}
>      }
>    else if (TYPE_P (t))
> 
>
diff mbox series

Patch

Index: lto/lto.c
===================================================================
--- lto/lto.c	(revision 263989)
+++ lto/lto.c	(working copy)
@@ -614,8 +614,8 @@  mentions_vars_p_function (tree t)
 {
   if (mentions_vars_p_decl_non_common (t))
     return true;
-  CHECK_NO_VAR (DECL_ARGUMENTS (t));
-  CHECK_NO_VAR (DECL_VINDEX (t));
+  gcc_checking_assert (!DECL_ARGUMENTS (t));
+  gcc_checking_assert (!DECL_VINDEX (t));
   CHECK_VAR (DECL_FUNCTION_PERSONALITY (t));
   return false;
 }
@@ -631,7 +630,7 @@  mentions_vars_p_field_decl (tree t)
   CHECK_NO_VAR (DECL_BIT_FIELD_TYPE (t));
   CHECK_NO_VAR (DECL_QUALIFIER (t));
   CHECK_NO_VAR (DECL_FIELD_BIT_OFFSET (t));
-  CHECK_NO_VAR (DECL_FCONTEXT (t));
+  gcc_checking_assert (!DECL_FCONTEXT (t));
   return false;
 }
 
@@ -672,11 +671,8 @@  mentions_vars_p_binfo (tree t)
     return true;
   CHECK_VAR (BINFO_VTABLE (t));
   CHECK_NO_VAR (BINFO_OFFSET (t));
-  CHECK_NO_VAR (BINFO_VIRTUALS (t));
-  CHECK_NO_VAR (BINFO_VPTR_FIELD (t));
-  n = vec_safe_length (BINFO_BASE_ACCESSES (t));
-  for (i = 0; i < n; i++)
-    CHECK_NO_VAR (BINFO_BASE_ACCESS (t, i));
+  gcc_checking_assert (!BINFO_VIRTUALS (t));
+  gcc_checking_assert (!BINFO_VPTR_FIELD (t));
   /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
      and BINFO_VPTR_INDEX; these are used by C++ FE only.  */
   n = BINFO_N_BASE_BINFOS (t);
@@ -1210,7 +1206,7 @@  compare_tree_sccs_1 (tree t1, tree t2, t
   /* BLOCKs are function local and we don't merge anything there, so
      simply refuse to merge.  */
   if (CODE_CONTAINS_STRUCT (code, TS_BLOCK))
-    return false;
+    gcc_unreachable ();
 
   if (CODE_CONTAINS_STRUCT (code, TS_TRANSLATION_UNIT_DECL))
     if (strcmp (TRANSLATION_UNIT_LANGUAGE (t1),
@@ -1227,9 +1223,8 @@  compare_tree_sccs_1 (tree t1, tree t2, t
       return false;
 
   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
-    if (vec_safe_length (BINFO_BASE_ACCESSES (t1))
-	!= vec_safe_length (BINFO_BASE_ACCESSES (t2)))
-      return false;
+    gcc_assert (!vec_safe_length (BINFO_BASE_ACCESSES (t1))
+		&& !vec_safe_length (BINFO_BASE_ACCESSES (t2)));
 
   if (CODE_CONTAINS_STRUCT (code, TS_CONSTRUCTOR))
     compare_values (CONSTRUCTOR_NELTS);
@@ -1362,23 +1357,17 @@  compare_tree_sccs_1 (tree t1, tree t2, t
     {
       if (code == FUNCTION_DECL)
 	{
-	  tree a1, a2;
-	  for (a1 = DECL_ARGUMENTS (t1), a2 = DECL_ARGUMENTS (t2);
-	       a1 || a2;
-	       a1 = TREE_CHAIN (a1), a2 = TREE_CHAIN (a2))
-	    compare_tree_edges (a1, a2);
-	  compare_tree_edges (DECL_RESULT (t1), DECL_RESULT (t2));
+	  gcc_checking_assert (!DECL_ARGUMENTS (t1));
+	  gcc_checking_assert (!DECL_RESULT (t1));
 	}
       else if (code == TYPE_DECL)
-	compare_tree_edges (DECL_ORIGINAL_TYPE (t1), DECL_ORIGINAL_TYPE (t2));
+	gcc_checking_assert (!DECL_ORIGINAL_TYPE (t1));
     }
 
   if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
     {
-      /* Make sure we don't inadvertently set the assembler name.  */
-      if (DECL_ASSEMBLER_NAME_SET_P (t1))
-	compare_tree_edges (DECL_ASSEMBLER_NAME (t1),
-			    DECL_ASSEMBLER_NAME (t2));
+      compare_tree_edges (DECL_ASSEMBLER_NAME_RAW (t1),
+			  DECL_ASSEMBLER_NAME_RAW (t2));
     }
 
   if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
@@ -1389,14 +1378,14 @@  compare_tree_sccs_1 (tree t1, tree t2, t
 			  DECL_BIT_FIELD_REPRESENTATIVE (t2));
       compare_tree_edges (DECL_FIELD_BIT_OFFSET (t1),
 			  DECL_FIELD_BIT_OFFSET (t2));
-      compare_tree_edges (DECL_FCONTEXT (t1), DECL_FCONTEXT (t2));
+      gcc_checking_assert (!DECL_FCONTEXT (t1));
     }
 
   if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
     {
       compare_tree_edges (DECL_FUNCTION_PERSONALITY (t1),
 			  DECL_FUNCTION_PERSONALITY (t2));
-      compare_tree_edges (DECL_VINDEX (t1), DECL_VINDEX (t2));
+      gcc_checking_assert (!DECL_VINDEX (t1));
       compare_tree_edges (DECL_FUNCTION_SPECIFIC_TARGET (t1),
 			  DECL_FUNCTION_SPECIFIC_TARGET (t2));
       compare_tree_edges (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (t1),
@@ -1423,7 +1412,7 @@  compare_tree_sccs_1 (tree t1, tree t2, t
 	compare_tree_edges (TYPE_CONTEXT (t1), TYPE_CONTEXT (t2));
       /* TYPE_CANONICAL is re-computed during type merging, so do not
 	 compare it here.  */
-      compare_tree_edges (TYPE_STUB_DECL (t1), TYPE_STUB_DECL (t2));
+      gcc_checking_assert (!TYPE_STUB_DECL (t1));
     }
 
   if (CODE_CONTAINS_STRUCT (code, TS_TYPE_NON_COMMON))
@@ -1468,7 +1457,7 @@  compare_tree_sccs_1 (tree t1, tree t2, t
 
       /* BLOCKs are function local and we don't merge anything there.  */
       if (TREE_BLOCK (t1) || TREE_BLOCK (t2))
-	return false;
+	gcc_unreachable ();
     }
 
   if (CODE_CONTAINS_STRUCT (code, TS_BINFO))
@@ -1478,11 +1467,9 @@  compare_tree_sccs_1 (tree t1, tree t2, t
       /* Lengths have already been compared above.  */
       FOR_EACH_VEC_ELT (*BINFO_BASE_BINFOS (t1), i, t)
 	compare_tree_edges (t, BINFO_BASE_BINFO (t2, i));
-      FOR_EACH_VEC_SAFE_ELT (BINFO_BASE_ACCESSES (t1), i, t)
-	compare_tree_edges (t, BINFO_BASE_ACCESS (t2, i));
       compare_tree_edges (BINFO_OFFSET (t1), BINFO_OFFSET (t2));
       compare_tree_edges (BINFO_VTABLE (t1), BINFO_VTABLE (t2));
-      compare_tree_edges (BINFO_VPTR_FIELD (t1), BINFO_VPTR_FIELD (t2));
+      gcc_checking_assert (!BINFO_VPTR_FIELD (t1));
       /* Do not walk BINFO_INHERITANCE_CHAIN, BINFO_SUBVTT_INDEX
 	 and BINFO_VPTR_INDEX; these are used by C++ FE only.  */
     }
@@ -2621,9 +2608,9 @@  lto_fixup_prevailing_decls (tree t)
 	}
       if (CODE_CONTAINS_STRUCT (code, TS_FUNCTION_DECL))
 	{
-	  LTO_NO_PREVAIL (DECL_ARGUMENTS (t));
+          gcc_checking_assert (!DECL_ARGUMENTS (t));
 	  LTO_SET_PREVAIL (DECL_FUNCTION_PERSONALITY (t));
-	  LTO_NO_PREVAIL (DECL_VINDEX (t));
+          gcc_checking_assert (!DECL_VINDEX (t));
 	}
       if (CODE_CONTAINS_STRUCT (code, TS_FIELD_DECL))
 	{
@@ -2631,7 +2618,7 @@  lto_fixup_prevailing_decls (tree t)
 	  LTO_NO_PREVAIL (DECL_BIT_FIELD_TYPE (t));
 	  LTO_NO_PREVAIL (DECL_QUALIFIER (t));
 	  LTO_NO_PREVAIL (DECL_FIELD_BIT_OFFSET (t));
-	  LTO_NO_PREVAIL (DECL_FCONTEXT (t));
+          gcc_checking_assert (!DECL_FCONTEXT (t));
 	}
     }
   else if (TYPE_P (t))