On 04/11/2014 08:07 AM, Jan Hubicka wrote:
Hi,
while looking into -ftime-report, I noticed that ggc can take up to 10% of WPA
memory
while it does almost nothing: it is run just after streaming that explicitly
frees memory that becomes unreachable. The first GGC run usually saves at
most 1% of memory and then it is never run again.
I believe this ought to also help in case we get into swap, since ltranses will
also ggc less.
Bootstrapped/regtested x86_64-linux, OK?
Hi!
I applied both patches you sent today and there are Firefox LTO -O3
results:
https://drive.google.com/file/d/0B0pisUJ80pO1ajRzLWFneTJpcE0/edit?usp=sharing
It shows that you saved a bit memory in WPA.
Martin
Honza
* lto.c (read_cgraph_and_symbols): Grow ggc memory after streaming.
* ggc.h (ggc_grow): New function.
* ggc-none.c (ggc_grow): New function.
* ggc-page.c (ggc_grow): Likewise.
Index: ggc.h
===================================================================
--- ggc.h (revision 209170)
+++ ggc.h (working copy)
@@ -225,6 +225,9 @@ extern const char *ggc_alloc_string_stat
function is called, not during allocations. */
extern void ggc_collect (void);
+/* Assume that all GGC memory is reachable and grow the limits for next collection. */
+extern void ggc_grow (void);
+
/* Register an additional root table. This can be useful for some
plugins. Does nothing if the passed pointer is NULL. */
extern void ggc_register_root_tab (const struct ggc_root_tab *);
Index: lto/lto.c
===================================================================
--- lto/lto.c (revision 209170)
+++ lto/lto.c (working copy)
@@ -2999,6 +3000,10 @@ read_cgraph_and_symbols (unsigned nfiles
gimple_canonical_types = NULL;
delete canonical_type_hash_cache;
canonical_type_hash_cache = NULL;
+
+ /* At this stage we know that majority of GGC memory is reachable.
+ Growing the limits prevents unnecesary invocation of GGC. */
+ ggc_grow ();
ggc_collect ();
/* Set the hooks so that all of the ipa passes can read in their data. */
Index: ggc-none.c
===================================================================
--- ggc-none.c (revision 209170)
+++ ggc-none.c (working copy)
@@ -63,3 +63,8 @@ ggc_free (void *p)
{
free (p);
}
+
+void
+ggc_grow (void)
+{
+}
Index: ggc-page.c
===================================================================
--- ggc-page.c (revision 209170)
+++ ggc-page.c (working copy)
@@ -2095,6 +2095,19 @@ ggc_collect (void)
fprintf (G.debug_file, "END COLLECTING\n");
}
+/* Assume that all GGC memory is reachable and grow the limits for next collection. */
+
+void
+ggc_grow (void)
+{
+#ifndef ENABLE_CHECKING
+ G.allocated_last_gc = MAX (G.allocated_last_gc,
+ G.allocated);
+#endif
+ if (!quiet_flag)
+ fprintf (stderr, " {GC start %luk} ", (unsigned long) G.allocated / 1024);
+}
+
/* Print allocation statistics. */
#define SCALE(x) ((unsigned long) ((x) < 1024*10 \
? (x) \