On Fri, 12 Apr 2013, Richard Biener wrote:

> On Fri, 12 Apr 2013, Steven Bosscher wrote:
> 
> > On Thu, Apr 11, 2013 at 12:47 PM, Richard Biener wrote:
> > > That said - I'm positively sure I will hit the IRA / reload
> > > issue again when adding mandatory IL verification (though
> > > for that they can simply drop the properties).
> > >
> > > So, if we ignore that "GC boundary" is global we can add
> > > PROP_gc_safe, provided by default, removed by IRA and
> > > re-added by reload.
> > 
> > What about the various pieces of GC-unsafe "black box" objects like
> > edge->aux, basic_block->aux, loop->aux, etc.?
> > 
> > E.g. PR56921 looks like a "struct niter_desc" gets garbage collected
> > even though a loop still points to it via its aux field (NB I'm just
> > guessing, not verified).
> 
> I don't see how we were "safe" here before this patch.  Yes,
> appearantly we didn't collect between those passes - but that
> appears to be for no good reason as breaking the GC barrier
> would certainly be a good reason for a comment.
> 
> Which means that for the resolution of this thread we probably
> want to settle on TODO_no_ggc_collect which is quite explicit.
> 
> Oh, but please document _what_ is the data that is kept live
> cross-pass at the point you add TODO_no_ggc_collect.

FYI, the following is what I am currently bootstrapping and
regtesting.  It adds TODO_do_not_ggc_collect and reverts
the IRA/reload merge.

I'm going to commit it after bootstrap/testing on x86_64-unknown-linux-gnu
unless someone objects (soon).

Thanks,
Richard.

2013-04-12  Richard Biener  <rguent...@suse.de>

        * tree-pass.h (TODO_do_not_ggc_collect): New.
        * passes.c (execute_one_ipa_transform_pass): Honor
        TODO_do_not_ggc_collect.
        (execute_one_pass): Likewise.

        Revert
        2013-04-10  Richard Biener  <rguent...@suse.de>

        * passes.c (init_optimization_passes): Remove reload pass.
        * ira.c (do_reload): Merge into ...
        (ira): ... this.
        (rest_of_handle_reload): Remove.
        (pass_reload): Likewise.
        * config/i386/i386.c (ix86_option_override): Refer to ira instead
        of reload for vzeroupper pass placement.

        * g++.dg/pr55604.C: Use -fdump-rtl-ira.

Index: gcc/tree-pass.h
===================================================================
*** gcc/tree-pass.h.orig        2013-04-12 10:06:03.000000000 +0200
--- gcc/tree-pass.h     2013-04-12 10:06:05.278958138 +0200
*************** struct simple_ipa_opt_pass
*** 154,159 ****
--- 154,160 ----
    (PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh | PROP_gimple_lomp)
  
  /* To-do flags.  */
+ #define TODO_do_not_ggc_collect               (1 << 1)
  #define TODO_verify_ssa                       (1 << 2)
  #define TODO_verify_flow              (1 << 3)
  #define TODO_verify_stmts             (1 << 4)
*************** extern struct rtl_opt_pass pass_mode_swi
*** 445,450 ****
--- 446,452 ----
  extern struct rtl_opt_pass pass_sms;
  extern struct rtl_opt_pass pass_sched;
  extern struct rtl_opt_pass pass_ira;
+ extern struct rtl_opt_pass pass_reload;
  extern struct rtl_opt_pass pass_clean_state;
  extern struct rtl_opt_pass pass_branch_prob;
  extern struct rtl_opt_pass pass_value_profile_transformations;
Index: gcc/passes.c
===================================================================
*** gcc/passes.c.orig   2013-04-12 10:06:03.000000000 +0200
--- gcc/passes.c        2013-04-12 10:06:05.279958149 +0200
*************** init_optimization_passes (void)
*** 1620,1625 ****
--- 1620,1626 ----
        NEXT_PASS (pass_sms);
        NEXT_PASS (pass_sched);
        NEXT_PASS (pass_ira);
+       NEXT_PASS (pass_reload);
        NEXT_PASS (pass_postreload);
        {
          struct opt_pass **p = &pass_postreload.pass.sub;
*************** execute_one_ipa_transform_pass (struct c
*** 2186,2192 ****
    current_pass = NULL;
  
    /* Signal this is a suitable GC collection point.  */
!   ggc_collect ();
  }
  
  /* For the current function, execute all ipa transforms. */
--- 2187,2194 ----
    current_pass = NULL;
  
    /* Signal this is a suitable GC collection point.  */
!   if (!(todo_after & TODO_do_not_ggc_collect))
!     ggc_collect ();
  }
  
  /* For the current function, execute all ipa transforms. */
*************** execute_one_pass (struct opt_pass *pass)
*** 2365,2371 ****
    current_pass = NULL;
  
    /* Signal this is a suitable GC collection point.  */
!   ggc_collect ();
  
    return true;
  }
--- 2367,2374 ----
    current_pass = NULL;
  
    /* Signal this is a suitable GC collection point.  */
!   if (!((todo_after | pass->todo_flags_finish) & TODO_do_not_ggc_collect))
!     ggc_collect ();
  
    return true;
  }
Index: gcc/ira.c
===================================================================
*** gcc/ira.c.orig      2013-04-12 10:06:03.000000000 +0200
--- gcc/ira.c   2013-04-12 10:06:27.824203322 +0200
*************** ira (FILE *f)
*** 4359,4366 ****
    int rebuild_p;
    bool saved_flag_caller_saves = flag_caller_saves;
    enum ira_region saved_flag_ira_region = flag_ira_region;
-   basic_block bb;
-   bool need_dce;
  
    ira_conflicts_p = optimize > 0;
  
--- 4359,4364 ----
*************** ira (FILE *f)
*** 4590,4595 ****
--- 4588,4600 ----
        flag_caller_saves = saved_flag_caller_saves;
        flag_ira_region = saved_flag_ira_region;
      }
+ }
+ 
+ static void
+ do_reload (void)
+ {
+   basic_block bb;
+   bool need_dce;
  
    if (flag_ira_verbose < 10)
      ira_dump_file = dump_file;
*************** ira (FILE *f)
*** 4629,4634 ****
--- 4634,4641 ----
  
    timevar_pop (TV_RELOAD);
  
+   timevar_push (TV_IRA);
+ 
    if (ira_conflicts_p && ! ira_use_lra_p)
      {
        ira_free (ira_spilled_reg_stack_slots);
*************** ira (FILE *f)
*** 4686,4691 ****
--- 4693,4700 ----
  
    if (need_dce && optimize)
      run_fast_dce ();
+ 
+   timevar_pop (TV_IRA);
  }
  
  /* Run the integrated register allocator.  */
*************** struct rtl_opt_pass pass_ira =
*** 4712,4717 ****
    0,                                    /* properties_provided */
    0,                                    /* properties_destroyed */
    0,                                    /* todo_flags_start */
!   0                                     /* todo_flags_finish */
   }
  };
--- 4721,4753 ----
    0,                                    /* properties_provided */
    0,                                    /* properties_destroyed */
    0,                                    /* todo_flags_start */
!   TODO_do_not_ggc_collect               /* todo_flags_finish */
!  }
! };
! 
! static unsigned int
! rest_of_handle_reload (void)
! {
!   do_reload ();
!   return 0;
! }
! 
! struct rtl_opt_pass pass_reload =
! {
!  {
!   RTL_PASS,
!   "reload",                             /* name */
!   OPTGROUP_NONE,                        /* optinfo_flags */
!   NULL,                                 /* gate */
!   rest_of_handle_reload,              /* execute */
!   NULL,                                 /* sub */
!   NULL,                                 /* next */
!   0,                                    /* static_pass_number */
!   TV_RELOAD,                          /* tv_id */
!   0,                                    /* properties_required */
!   0,                                    /* properties_provided */
!   0,                                    /* properties_destroyed */
!   0,                                    /* todo_flags_start */
!   0                                   /* todo_flags_finish */
   }
  };
Index: gcc/testsuite/g++.dg/pr55604.C
===================================================================
*** gcc/testsuite/g++.dg/pr55604.C.orig 2013-04-12 10:06:03.000000000 +0200
--- gcc/testsuite/g++.dg/pr55604.C      2013-04-12 10:06:05.281958171 +0200
***************
*** 1,5 ****
  /* { dg-do compile } */
! /* { dg-options "-O -fdump-rtl-ira" } */
  
  main ()
  {
--- 1,5 ----
  /* { dg-do compile } */
! /* { dg-options "-O -fdump-rtl-reload" } */
  
  main ()
  {
*************** main ()
*** 8,11 ****
    __builtin_printf ("%d %s\n", t, s);
  }
  
! /* { dg-final { cleanup-rtl-dump "ira" } } */
--- 8,11 ----
    __builtin_printf ("%d %s\n", t, s);
  }
  
! /* { dg-final { cleanup-rtl-dump "reload" } } */
Index: gcc/config/i386/i386.c
===================================================================
*** gcc/config/i386/i386.c.orig 2013-04-10 13:36:55.000000000 +0200
--- gcc/config/i386/i386.c      2013-04-12 10:11:53.780748099 +0200
*************** static void
*** 3930,3936 ****
  ix86_option_override (void)
  {
    static struct register_pass_info insert_vzeroupper_info
!     = { &pass_insert_vzeroupper.pass, "ira",
        1, PASS_POS_INSERT_AFTER
        };
  
--- 3930,3936 ----
  ix86_option_override (void)
  {
    static struct register_pass_info insert_vzeroupper_info
!     = { &pass_insert_vzeroupper.pass, "reload",
        1, PASS_POS_INSERT_AFTER
        };
  

Reply via email to