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 };