This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Speedup gt_ggc_m_S


Currently it looks up the page table entry for the string twice, once
in the ggc_allocated_p test (for strings allocated by libcpp?) and
once for the final lookup.

The following simply turns ggc_allocated_p into a 
safe_lookup_page_table_entry.

Bootstrapped and tested on x86_64-unknown-linux-gnu, queued for GCC 8.

Richard.

2017-04-07  Richard Biener  <rguenther@suse.de>

	* ggc-page.c (ggc_allocated_p): Rename to ...
	(safe_lookup_page_table_entry): ... this and return the lookup
	result.
	(gt_ggc_m_S): Use safe_lookup_page_table_entry.

Index: gcc/ggc-page.c
===================================================================
--- gcc/ggc-page.c	(revision 246758)
+++ gcc/ggc-page.c	(working copy)
@@ -522,7 +522,6 @@ static bool in_gc = false;
 /* Initial guess as to how many page table entries we might need.  */
 #define INITIAL_PTE_COUNT 128
 
-static int ggc_allocated_p (const void *);
 static page_entry *lookup_page_table_entry (const void *);
 static void set_page_table_entry (void *, page_entry *);
 #ifdef USING_MMAP
@@ -587,10 +586,11 @@ push_by_depth (page_entry *p, unsigned l
 #define save_in_use_p(__p) \
   (save_in_use_p_i (__p->index_by_depth))
 
-/* Returns nonzero if P was allocated in GC'able memory.  */
+/* Traverse the page table and find the entry for a page.
+   If the object wasn't allocated in GC return NULL.  */
 
-static inline int
-ggc_allocated_p (const void *p)
+static inline page_entry *
+safe_lookup_page_table_entry (const void *p)
 {
   page_entry ***base;
   size_t L1, L2;
@@ -603,7 +603,7 @@ ggc_allocated_p (const void *p)
   while (1)
     {
       if (table == NULL)
-	return 0;
+	return NULL;
       if (table->high_bits == high_bits)
 	break;
       table = table->next;
@@ -614,8 +614,10 @@ ggc_allocated_p (const void *p)
   /* Extract the level 1 and 2 indices.  */
   L1 = LOOKUP_L1 (p);
   L2 = LOOKUP_L2 (p);
+  if (! base[L1])
+    return NULL;
 
-  return base[L1] && base[L1][L2];
+  return base[L1][L2];
 }
 
 /* Traverse the page table and find the entry for a page.
@@ -1455,12 +1457,14 @@ gt_ggc_m_S (const void *p)
   unsigned long mask;
   unsigned long offset;
 
-  if (!p || !ggc_allocated_p (p))
+  if (!p)
     return;
 
-  /* Look up the page on which the object is alloced.  .  */
-  entry = lookup_page_table_entry (p);
-  gcc_assert (entry);
+  /* Look up the page on which the object is alloced.  If it was not
+     GC allocated, gracefully bail out.  */
+  entry = safe_lookup_page_table_entry (p);
+  if (!entry)
+    return;
 
   /* Calculate the index of the object on the page; this is its bit
      position in the in_use_p bitmap.  Note that because a char* might


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]