Re: Avoid unnecesary GGC runs during LTO

2014-04-17 Thread Richard Biener
On April 17, 2014 7:18:05 PM CEST, Jan Hubicka  wrote:
>> On April 17, 2014 6:03:13 PM CEST, Jan Hubicka 
>wrote:
>> >> > > +
>> >> > > +  /* At this stage we know that majority of GGC memory is
>> >reachable.  
>> >> > > + Growing the limits prevents unnecesary invocation of
>GGC. 
>> >*/
>> >> > > +  ggc_grow ();
>> >> > >ggc_collect ();
>> >> > 
>> >> > Isn't the collect here pointless?  I see not in ENABLE_CHECKING,
>> >but
>> >> > shouldn't this be abstracted away, thus call ggc_collect from
>> >ggc_grow?
>> >> > Or maybe rather even for ENABLE_CHECKING adjust
>G.allocated_last_gc
>> >> > and simply drop the ggc_collect above ().
>> >> 
>> >> I am fine with both.  I basically decided to keep the explicit
>> >ggc_collect() to
>> >> make it clear (from lto.c source code) that we are GGC safe at
>this
>> >point and
>> >> to have way to double check that we do not produce too much of
>> >garbage with
>> >> checking disabled. (so with -Q I will see how much it is collected
>at
>> >that place).
>> >> 
>> >> We can embed it into ggc_grow and document that w/o checking it is
>> >equivalent
>> >> to ggc_cooect.
>> >> > 
>> >> > Anyway, this is sth for stage1 at this point.
>> >> 
>> >> OK,
>> >> Honza
>> >
>> >Ping...
>> >the patches saves 33 GGC runs during libxul.so link, that is not
>that
>> >bad ;)
>> 
>> What is the updated patch you propose?
>
>I was trying to explain, why I kept explicit ggc_collect just after
>ggc_grow:
>
>I want to make it clear that we are ggc safe at that point. I also want
>to see
>the ggc run happening w/o checking to have -Q report how much of
>garbage we see
>at this stage so I can keep eye on it.
>
>I can hide ENABLE_CHECKING ggc_collect call in ggc_grow and update
>documentation if your preffer.

I'd prefer that.  OK with that change.

Thanks,
Richard.

>Honza
>> 
>> Richard
>> 
>> >Honza
>> >> > 
>> >> > Thanks,
>> >> > Richard.
>> >> > 
>> >> > >/* 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) \
>> >> > > 
>> >> > > 
>> >> > 
>> >> > -- 
>> >> > Richard Biener 
>> >> > SUSE / SUSE Labs
>> >> > SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
>> >> > GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer
>> 




Re: Avoid unnecesary GGC runs during LTO

2014-04-17 Thread Jan Hubicka
> On April 17, 2014 6:03:13 PM CEST, Jan Hubicka  wrote:
> >> > > +
> >> > > +  /* At this stage we know that majority of GGC memory is
> >reachable.  
> >> > > + Growing the limits prevents unnecesary invocation of GGC. 
> >*/
> >> > > +  ggc_grow ();
> >> > >ggc_collect ();
> >> > 
> >> > Isn't the collect here pointless?  I see not in ENABLE_CHECKING,
> >but
> >> > shouldn't this be abstracted away, thus call ggc_collect from
> >ggc_grow?
> >> > Or maybe rather even for ENABLE_CHECKING adjust G.allocated_last_gc
> >> > and simply drop the ggc_collect above ().
> >> 
> >> I am fine with both.  I basically decided to keep the explicit
> >ggc_collect() to
> >> make it clear (from lto.c source code) that we are GGC safe at this
> >point and
> >> to have way to double check that we do not produce too much of
> >garbage with
> >> checking disabled. (so with -Q I will see how much it is collected at
> >that place).
> >> 
> >> We can embed it into ggc_grow and document that w/o checking it is
> >equivalent
> >> to ggc_cooect.
> >> > 
> >> > Anyway, this is sth for stage1 at this point.
> >> 
> >> OK,
> >> Honza
> >
> >Ping...
> >the patches saves 33 GGC runs during libxul.so link, that is not that
> >bad ;)
> 
> What is the updated patch you propose?

I was trying to explain, why I kept explicit ggc_collect just after ggc_grow:

I want to make it clear that we are ggc safe at that point. I also want to see
the ggc run happening w/o checking to have -Q report how much of garbage we see
at this stage so I can keep eye on it.

I can hide ENABLE_CHECKING ggc_collect call in ggc_grow and update
documentation if your preffer.

Honza
> 
> Richard
> 
> >Honza
> >> > 
> >> > Thanks,
> >> > Richard.
> >> > 
> >> > >/* 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) \
> >> > > 
> >> > > 
> >> > 
> >> > -- 
> >> > Richard Biener 
> >> > SUSE / SUSE Labs
> >> > SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
> >> > GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer
> 


Re: Avoid unnecesary GGC runs during LTO

2014-04-17 Thread Richard Biener
On April 17, 2014 6:03:13 PM CEST, Jan Hubicka  wrote:
>> > > +
>> > > +  /* At this stage we know that majority of GGC memory is
>reachable.  
>> > > + Growing the limits prevents unnecesary invocation of GGC. 
>*/
>> > > +  ggc_grow ();
>> > >ggc_collect ();
>> > 
>> > Isn't the collect here pointless?  I see not in ENABLE_CHECKING,
>but
>> > shouldn't this be abstracted away, thus call ggc_collect from
>ggc_grow?
>> > Or maybe rather even for ENABLE_CHECKING adjust G.allocated_last_gc
>> > and simply drop the ggc_collect above ().
>> 
>> I am fine with both.  I basically decided to keep the explicit
>ggc_collect() to
>> make it clear (from lto.c source code) that we are GGC safe at this
>point and
>> to have way to double check that we do not produce too much of
>garbage with
>> checking disabled. (so with -Q I will see how much it is collected at
>that place).
>> 
>> We can embed it into ggc_grow and document that w/o checking it is
>equivalent
>> to ggc_cooect.
>> > 
>> > Anyway, this is sth for stage1 at this point.
>> 
>> OK,
>> Honza
>
>Ping...
>the patches saves 33 GGC runs during libxul.so link, that is not that
>bad ;)

What is the updated patch you propose?

Richard

>Honza
>> > 
>> > Thanks,
>> > Richard.
>> > 
>> > >/* 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) \
>> > > 
>> > > 
>> > 
>> > -- 
>> > Richard Biener 
>> > SUSE / SUSE Labs
>> > SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
>> > GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer




Re: Avoid unnecesary GGC runs during LTO

2014-04-17 Thread Jan Hubicka
> > > +
> > > +  /* At this stage we know that majority of GGC memory is reachable.  
> > > + Growing the limits prevents unnecesary invocation of GGC.  */
> > > +  ggc_grow ();
> > >ggc_collect ();
> > 
> > Isn't the collect here pointless?  I see not in ENABLE_CHECKING, but
> > shouldn't this be abstracted away, thus call ggc_collect from ggc_grow?
> > Or maybe rather even for ENABLE_CHECKING adjust G.allocated_last_gc
> > and simply drop the ggc_collect above ().
> 
> I am fine with both.  I basically decided to keep the explicit ggc_collect() 
> to
> make it clear (from lto.c source code) that we are GGC safe at this point and
> to have way to double check that we do not produce too much of garbage with
> checking disabled. (so with -Q I will see how much it is collected at that 
> place).
> 
> We can embed it into ggc_grow and document that w/o checking it is equivalent
> to ggc_cooect.
> > 
> > Anyway, this is sth for stage1 at this point.
> 
> OK,
> Honza

Ping...
the patches saves 33 GGC runs during libxul.so link, that is not that bad ;)

Honza
> > 
> > Thanks,
> > Richard.
> > 
> > >/* 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) \
> > > 
> > > 
> > 
> > -- 
> > Richard Biener 
> > SUSE / SUSE Labs
> > SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
> > GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer


Re: Avoid unnecesary GGC runs during LTO

2014-04-11 Thread Jan Hubicka
> > +
> > +  /* At this stage we know that majority of GGC memory is reachable.  
> > + Growing the limits prevents unnecesary invocation of GGC.  */
> > +  ggc_grow ();
> >ggc_collect ();
> 
> Isn't the collect here pointless?  I see not in ENABLE_CHECKING, but
> shouldn't this be abstracted away, thus call ggc_collect from ggc_grow?
> Or maybe rather even for ENABLE_CHECKING adjust G.allocated_last_gc
> and simply drop the ggc_collect above ().

I am fine with both.  I basically decided to keep the explicit ggc_collect() to
make it clear (from lto.c source code) that we are GGC safe at this point and
to have way to double check that we do not produce too much of garbage with
checking disabled. (so with -Q I will see how much it is collected at that 
place).

We can embed it into ggc_grow and document that w/o checking it is equivalent
to ggc_cooect.
> 
> Anyway, this is sth for stage1 at this point.

OK,
Honza
> 
> Thanks,
> Richard.
> 
> >/* 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) \
> > 
> > 
> 
> -- 
> Richard Biener 
> SUSE / SUSE Labs
> SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
> GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer


Re: Avoid unnecesary GGC runs during LTO

2014-04-11 Thread Martin Liška

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) \




Re: Avoid unnecesary GGC runs during LTO

2014-04-11 Thread Richard Biener
On Fri, 11 Apr 2014, 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?
> 
> 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 ();

Isn't the collect here pointless?  I see not in ENABLE_CHECKING, but
shouldn't this be abstracted away, thus call ggc_collect from ggc_grow?
Or maybe rather even for ENABLE_CHECKING adjust G.allocated_last_gc
and simply drop the ggc_collect above ().

Anyway, this is sth for stage1 at this point.

Thanks,
Richard.

>/* 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) \
> 
> 

-- 
Richard Biener 
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer