diff mbox series

Remove sorting while register odr types

Message ID 20181122230620.ijw2pmizxgyjp242@kam.mff.cuni.cz
State New
Headers show
Series Remove sorting while register odr types | expand

Commit Message

Jan Hubicka Nov. 22, 2018, 11:06 p.m. UTC
Hi,
late in stage4 of GCC 8 Martin introduced code that sorts odr types so
they get registered independently on the hashing order since we was
getting different sets of warnings depending on the target in some of
testcases.  This should be solved now by recursing to subtypes while
register ODR types and also by breaking up the SCCs in majority of
cases.

Note that one SCC still can contain more than one type when they are
entangled via TYPE_CONTEXT, so the order of warings can be target
specific, but they should be the same.

This loop shows up as mesurable factor of WPA due to slow location
lokup for large translation units.  This patch removes it.

Bootstrapped/regtested x86_64-linux, will commit it shortly.

Honza

	* lto.c (cmp_type_location): Remove.
	(lto_read_decls): Do not allocate odr_types.
diff mbox series

Patch

Index: lto.c
===================================================================
--- lto.c	(revision 266382)
+++ lto.c	(working copy)
@@ -1712,36 +1712,6 @@  unify_scc (struct data_in *data_in, unsi
 }
 
 
-/* Compare types based on source file location.  */
-
-static int
-cmp_type_location (const void *p1_, const void *p2_)
-{
-  tree *p1 = (tree*)(const_cast<void *>(p1_));
-  tree *p2 = (tree*)(const_cast<void *>(p2_));
-  if (*p1 == *p2)
-    return 0;
-
-  tree tname1 = TYPE_NAME (*p1);
-  tree tname2 = TYPE_NAME (*p2);
-  expanded_location xloc1 = expand_location (DECL_SOURCE_LOCATION (tname1));
-  expanded_location xloc2 = expand_location (DECL_SOURCE_LOCATION (tname2));
-
-  const char *f1 = lbasename (xloc1.file);
-  const char *f2 = lbasename (xloc2.file);
-  int r = strcmp (f1, f2);
-  if (r == 0)
-    {
-      int l1 = xloc1.line;
-      int l2 = xloc2.line;
-      if (l1 != l2)
-	return l1 - l2;
-      return xloc1.column - xloc2.column;
-    }
-  else
-    return r;
-}
-
 /* Read all the symbols from buffer DATA, using descriptors in DECL_DATA.
    RESOLUTIONS is the set of symbols picked by the linker (read from the
    resolution file when the linker plugin is being used).  */
@@ -1758,7 +1728,6 @@  lto_read_decls (struct lto_file_decl_dat
   unsigned int i;
   const uint32_t *data_ptr, *data_end;
   uint32_t num_decl_states;
-  auto_vec<tree> odr_types;
 
   lto_input_block ib_main ((const char *) data + main_offset,
 			   header->main_size, decl_data->mode_table);
@@ -1828,7 +1797,7 @@  lto_read_decls (struct lto_file_decl_dat
 		  if (!TYPE_CANONICAL (t))
 		    gimple_register_canonical_type (t);
 		  if (TYPE_MAIN_VARIANT (t) == t && odr_type_p (t))
-		    odr_types.safe_push (t);
+		    register_odr_type (t);
 		}
 	      /* Link shared INTEGER_CSTs into TYPE_CACHED_VALUEs of its
 		 type which is also member of this SCC.  */
@@ -1890,15 +1859,6 @@  lto_read_decls (struct lto_file_decl_dat
       *slot = state;
     }
 
-  /* Sort types for the file before registering in ODR machinery.  */
-  if (lto_location_cache::current_cache)
-    lto_location_cache::current_cache->apply_location_cache ();
-  odr_types.qsort (cmp_type_location);
-
-  /* Register ODR types.  */
-  for (unsigned i = 0; i < odr_types.length (); i++)
-    register_odr_type (odr_types[i]);
-
   if (data_ptr != data_end)
     internal_error ("bytecode stream: garbage at the end of symbols section");