Cleanup global decl stream reference streaming, part 2

Message ID 20200601171545.GA68692@kam.mff.cuni.cz
State New
Headers show
Series
  • Cleanup global decl stream reference streaming, part 2
Related show

Commit Message

Jan Hubicka June 1, 2020, 5:15 p.m.
Hi,
this patch removes unnecesary ref tags and replaces them by one tag
for all references to the global stream.

lto-bootstrapped/regtested x86_64-linux, comitted.

Honza

gcc/ChangeLog:

2020-06-01  Jan Hubicka  <hubicka@ucw.cz>

	* lto-streamer.h (enum LTO_tags): Remove LTO_field_decl_ref,
	LTO_function_decl_ref, LTO_label_decl_ref, LTO_namespace_decl_ref,
	LTO_result_decl_ref, LTO_type_decl_ref, LTO_type_ref,
	LTO_const_decl_ref, LTO_imported_decl_ref,
	LTO_translation_unit_decl_ref, LTO_global_decl_ref and
	LTO_namelist_decl_ref; add LTO_global_stream_ref.
	* lto-streamer-in.c (lto_input_tree_ref): Simplify.
	(lto_input_scc): Update.
	(lto_input_tree_1): Update.
	* lto-streamer-out.c (lto_indexable_tree_ref): Simlify.
	* lto-streamer.c (lto_tag_name): Update.

Patch

diff --git a/gcc/lto-streamer-in.c b/gcc/lto-streamer-in.c
index d77b4f5e9ff..5eaba7d16d4 100644
--- a/gcc/lto-streamer-in.c
+++ b/gcc/lto-streamer-in.c
@@ -316,34 +316,17 @@  lto_input_tree_ref (class lto_input_block *ib, class data_in *data_in,
   unsigned HOST_WIDE_INT ix_u;
   tree result = NULL_TREE;
 
-  lto_tag_check_range (tag, LTO_field_decl_ref, LTO_namelist_decl_ref);
-
-  switch (tag)
+  if (tag == LTO_ssa_name_ref)
     {
-    case LTO_ssa_name_ref:
       ix_u = streamer_read_uhwi (ib);
       result = (*SSANAMES (fn))[ix_u];
-      break;
-
-    case LTO_type_ref:
-    case LTO_field_decl_ref:
-    case LTO_function_decl_ref:
-    case LTO_type_decl_ref:
-    case LTO_namespace_decl_ref:
-    case LTO_global_decl_ref:
-    case LTO_result_decl_ref:
-    case LTO_const_decl_ref:
-    case LTO_imported_decl_ref:
-    case LTO_label_decl_ref:
-    case LTO_translation_unit_decl_ref:
-    case LTO_namelist_decl_ref:
+    }
+  else
+    {
+      gcc_checking_assert (tag == LTO_global_stream_ref);
       ix_u = streamer_read_uhwi (ib);
       result = (*data_in->file_data->current_decl_state
 		->streams[LTO_DECL_STREAM])[ix_u];
-      break;
-
-    default:
-      gcc_unreachable ();
     }
 
   gcc_assert (result);
@@ -1485,7 +1468,7 @@  lto_input_scc (class lto_input_block *ib, class data_in *data_in,
 	{
 	  enum LTO_tags tag = streamer_read_record_start (ib);
 	  if (tag == LTO_null
-	      || (tag >= LTO_field_decl_ref && tag <= LTO_global_decl_ref)
+	      || tag == LTO_global_stream_ref
 	      || tag == LTO_tree_pickle_reference
 	      || tag == LTO_integer_cst
 	      || tag == LTO_tree_scc
@@ -1549,7 +1532,7 @@  lto_input_tree_1 (class lto_input_block *ib, class data_in *data_in,
 
   if (tag == LTO_null)
     result = NULL_TREE;
-  else if (tag >= LTO_field_decl_ref && tag <= LTO_namelist_decl_ref)
+  else if (tag == LTO_global_stream_ref || tag == LTO_ssa_name_ref)
     {
       /* If TAG is a reference to an indexable tree, the next value
 	 in IB is the index into the table where we expect to find
diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c
index a44ed0037ee..dfc4603d7ae 100644
--- a/gcc/lto-streamer-out.c
+++ b/gcc/lto-streamer-out.c
@@ -252,84 +252,18 @@  static void
 lto_indexable_tree_ref (struct output_block *ob, tree expr,
 			enum LTO_tags *tag, unsigned *index)
 {
-  enum tree_code code;
-  enum lto_decl_stream_e_t encoder;
-
   gcc_checking_assert (tree_is_indexable (expr));
 
-  if (TYPE_P (expr))
+  if (TREE_CODE (expr) == SSA_NAME)
     {
-      *tag = LTO_type_ref;
-      encoder = LTO_DECL_STREAM;
+      *tag = LTO_ssa_name_ref;
+      *index = SSA_NAME_VERSION (expr);
     }
   else
     {
-      code = TREE_CODE (expr);
-      switch (code)
-	{
-	case SSA_NAME:
-	  *tag = LTO_ssa_name_ref;
-	  *index = SSA_NAME_VERSION (expr);
-	  return;
-	  break;
-
-	case FIELD_DECL:
-	  *tag = LTO_field_decl_ref;
-	  encoder = LTO_DECL_STREAM;
-	  break;
-
-	case FUNCTION_DECL:
-	  *tag = LTO_function_decl_ref;
-	  encoder = LTO_DECL_STREAM;
-	  break;
-
-	case VAR_DECL:
-	case DEBUG_EXPR_DECL:
-	  gcc_checking_assert (decl_function_context (expr) == NULL
-			       || TREE_STATIC (expr));
-	  /* FALLTHRU */
-	case PARM_DECL:
-	  *tag = LTO_global_decl_ref;
-	  encoder = LTO_DECL_STREAM;
-	  break;
-
-	case CONST_DECL:
-	  *tag = LTO_const_decl_ref;
-	  encoder = LTO_DECL_STREAM;
-	  break;
-
-	case TYPE_DECL:
-	  *tag = LTO_type_decl_ref;
-	  encoder = LTO_DECL_STREAM;
-	  break;
-
-	case NAMESPACE_DECL:
-	  *tag = LTO_namespace_decl_ref;
-	  encoder = LTO_DECL_STREAM;
-	  break;
-
-	case LABEL_DECL:
-	  *tag = LTO_label_decl_ref;
-	  encoder = LTO_DECL_STREAM;
-	  break;
-
-	case RESULT_DECL:
-	  *tag = LTO_result_decl_ref;
-	  encoder = LTO_DECL_STREAM;
-	  break;
-
-	case TRANSLATION_UNIT_DECL:
-	  *tag = LTO_translation_unit_decl_ref;
-	  encoder = LTO_DECL_STREAM;
-	  break;
-
-	default:
-	  /* No other node is indexable, so it should have been handled by
-	     lto_output_tree.  */
-	  gcc_unreachable ();
-	}
+      *tag = LTO_global_stream_ref;
+      *index = lto_get_index (&ob->decl_state->streams[LTO_DECL_STREAM], expr);
     }
-  *index = lto_get_index (&ob->decl_state->streams[encoder], expr);
 }
 
 
diff --git a/gcc/lto-streamer.c b/gcc/lto-streamer.c
index f7d3f24b0b1..7d0fd3924c0 100644
--- a/gcc/lto-streamer.c
+++ b/gcc/lto-streamer.c
@@ -84,24 +84,10 @@  lto_tag_name (enum LTO_tags tag)
       return "LTO_ert_must_not_throw";
     case LTO_tree_pickle_reference:
       return "LTO_tree_pickle_reference";
-    case LTO_field_decl_ref:
-      return "LTO_field_decl_ref";
-    case LTO_function_decl_ref:
-      return "LTO_function_decl_ref";
-    case LTO_label_decl_ref:
-      return "LTO_label_decl_ref";
-    case LTO_namespace_decl_ref:
-      return "LTO_namespace_decl_ref";
-    case LTO_result_decl_ref:
-      return "LTO_result_decl_ref";
+    case LTO_global_stream_ref:
+      return "LTO_global_sream_ref";
     case LTO_ssa_name_ref:
       return "LTO_ssa_name_ref";
-    case LTO_type_decl_ref:
-      return "LTO_type_decl_ref";
-    case LTO_type_ref:
-      return "LTO_type_ref";
-    case LTO_global_decl_ref:
-      return "LTO_global_decl_ref";
     default:
       return "LTO_UNKNOWN";
     }
diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
index fc7e4312420..241a46d4f31 100644
--- a/gcc/lto-streamer.h
+++ b/gcc/lto-streamer.h
@@ -185,28 +185,15 @@  enum LTO_tags
   LTO_trees,
 
   /* References to indexable tree nodes.  These objects are stored in
-     tables that are written separately from the function bodies that
-     reference them.  This way they can be instantiated even when the
-     referencing functions aren't (e.g., during WPA) and it also allows
-     functions to be copied from one file to another without having
-     to unpickle the body first (the references are location
-     independent).
-
-     NOTE, do not regroup these values as the grouping is exposed
-     in the range checks done in lto_input_tree.  */
-  LTO_field_decl_ref,			/* Do not change.  */
-  LTO_function_decl_ref,
-  LTO_label_decl_ref,
-  LTO_namespace_decl_ref,
-  LTO_result_decl_ref,
+     tables that are written separately from the function bodies
+     and variable constructors that reference them.  This way they can be
+     instantiated even when the referencing functions aren't (e.g., during WPA)
+     and it also allows functions to be copied from one file to another without
+     having to unpickle the body first (the references are location
+     independent).  */
+  LTO_global_stream_ref,
+
   LTO_ssa_name_ref,
-  LTO_type_decl_ref,
-  LTO_type_ref,
-  LTO_const_decl_ref,
-  LTO_imported_decl_ref,
-  LTO_translation_unit_decl_ref,
-  LTO_global_decl_ref,
-  LTO_namelist_decl_ref,		/* Do not change.  */
 
   /* This tag must always be last.  */
   LTO_NUM_TAGS