Mercurial > hg > CbC > CbC_gcc
diff gcc/passes.c @ 67:f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
author | nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 22 Mar 2011 17:18:12 +0900 |
parents | b7f97abdc517 |
children | 1b10fe6932e1 04ced10e8804 |
line wrap: on
line diff
--- a/gcc/passes.c Tue May 25 18:58:51 2010 +0900 +++ b/gcc/passes.c Tue Mar 22 17:18:12 2011 +0900 @@ -28,16 +28,6 @@ #include "system.h" #include "coretypes.h" #include "tm.h" -#include <signal.h> - -#ifdef HAVE_SYS_RESOURCE_H -# include <sys/resource.h> -#endif - -#ifdef HAVE_SYS_TIMES_H -# include <sys/times.h> -#endif - #include "line-map.h" #include "input.h" #include "tree.h" @@ -60,7 +50,7 @@ #include "graph.h" #include "regs.h" #include "timevar.h" -#include "diagnostic.h" +#include "diagnostic-core.h" #include "params.h" #include "reload.h" #include "dwarf2asm.h" @@ -121,7 +111,7 @@ /* Call from the debugger to get the current pass name. */ -void +DEBUG_FUNCTION void debug_pass (void) { print_current_pass (stderr); @@ -154,6 +144,7 @@ { /* We deferred calling assemble_alias so that we could collect other attributes such as visibility. Emit the alias now. */ + if (!in_lto_p) { tree alias; alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl)); @@ -194,8 +185,6 @@ ; else if (TREE_CODE (decl) != FUNCTION_DECL) varpool_finalize_decl (decl); - else - assemble_variable (decl, top_level, at_end, 0); } #ifdef ASM_FINISH_DECLARE_OBJECT @@ -211,7 +200,7 @@ else if (TREE_CODE (decl) == TYPE_DECL /* Like in rest_of_type_compilation, avoid confusing the debug information machinery when there are errors. */ - && !(sorrycount || errorcount)) + && !seen_error ()) { timevar_push (TV_SYMOUT); debug_hooks->type_decl (decl, !top_level); @@ -221,7 +210,8 @@ /* Let cgraph know about the existence of variables. */ if (in_lto_p && !at_end) ; - else if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl)) + else if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl) + && TREE_STATIC (decl)) varpool_node (decl); } @@ -232,7 +222,7 @@ { /* Avoid confusing the debug information machinery when there are errors. */ - if (errorcount != 0 || sorrycount != 0) + if (seen_error ()) return; timevar_push (TV_SYMOUT); @@ -287,7 +277,7 @@ { /* Early return if there were errors. We can run afoul of our consistency checks, and there's not really much point in fixing them. */ - return !(rtl_dump_and_exit || flag_syntax_only || errorcount || sorrycount); + return !(rtl_dump_and_exit || flag_syntax_only || seen_error ()); } struct gimple_opt_pass pass_rest_of_compilation = @@ -325,7 +315,7 @@ NULL, /* sub */ NULL, /* next */ 0, /* static_pass_number */ - TV_NONE, /* tv_id */ + TV_POSTRELOAD, /* tv_id */ PROP_rtl, /* properties_required */ 0, /* properties_provided */ 0, /* properties_destroyed */ @@ -599,7 +589,7 @@ pass = new_pass; break; default: - error ("Invalid pass positioning operation"); + error ("invalid pass positioning operation"); return false; } @@ -737,41 +727,27 @@ NEXT_PASS (pass_refactor_eh); NEXT_PASS (pass_lower_eh); NEXT_PASS (pass_build_cfg); - NEXT_PASS (pass_lower_vector); NEXT_PASS (pass_warn_function_return); NEXT_PASS (pass_build_cgraph_edges); - NEXT_PASS (pass_inline_parameters); *p = NULL; /* Interprocedural optimization passes. */ p = &all_small_ipa_passes; NEXT_PASS (pass_ipa_free_lang_data); NEXT_PASS (pass_ipa_function_and_variable_visibility); - NEXT_PASS (pass_ipa_early_inline); - { - struct opt_pass **p = &pass_ipa_early_inline.pass.sub; - NEXT_PASS (pass_early_inline); - NEXT_PASS (pass_inline_parameters); - NEXT_PASS (pass_rebuild_cgraph_edges); - } NEXT_PASS (pass_early_local_passes); { struct opt_pass **p = &pass_early_local_passes.pass.sub; NEXT_PASS (pass_fixup_cfg); - NEXT_PASS (pass_tree_profile); - NEXT_PASS (pass_cleanup_cfg); NEXT_PASS (pass_init_datastructures); NEXT_PASS (pass_expand_omp); NEXT_PASS (pass_referenced_vars); NEXT_PASS (pass_build_ssa); + NEXT_PASS (pass_lower_vector); NEXT_PASS (pass_early_warn_uninitialized); - /* Note that it is not strictly necessary to schedule an early - inline pass here. However, some test cases (e.g., - g++.dg/other/p334435.C g++.dg/other/i386-1.C) expect extern - inline functions to be inlined even at -O0. This does not - happen during the first early inline pass. */ NEXT_PASS (pass_rebuild_cgraph_edges); + NEXT_PASS (pass_inline_parameters); NEXT_PASS (pass_early_inline); NEXT_PASS (pass_all_early_optimizations); { @@ -795,22 +771,33 @@ NEXT_PASS (pass_cleanup_eh); NEXT_PASS (pass_profile); NEXT_PASS (pass_local_pure_const); + /* Split functions creates parts that are not run through + early optimizations again. It is thus good idea to do this + late. */ + NEXT_PASS (pass_split_functions); } NEXT_PASS (pass_release_ssa_names); NEXT_PASS (pass_rebuild_cgraph_edges); NEXT_PASS (pass_inline_parameters); } + NEXT_PASS (pass_ipa_tree_profile); + { + struct opt_pass **p = &pass_ipa_tree_profile.pass.sub; + NEXT_PASS (pass_feedback_split_functions); + } NEXT_PASS (pass_ipa_increase_alignment); NEXT_PASS (pass_ipa_matrix_reorg); + NEXT_PASS (pass_ipa_lower_emutls); *p = NULL; p = &all_regular_ipa_passes; NEXT_PASS (pass_ipa_whole_program_visibility); NEXT_PASS (pass_ipa_profile); NEXT_PASS (pass_ipa_cp); + NEXT_PASS (pass_ipa_cdtor_merge); NEXT_PASS (pass_ipa_inline); + NEXT_PASS (pass_ipa_pure_const); NEXT_PASS (pass_ipa_reference); - NEXT_PASS (pass_ipa_pure_const); NEXT_PASS (pass_ipa_type_escape); NEXT_PASS (pass_ipa_pta); NEXT_PASS (pass_ipa_struct_reorg); @@ -832,7 +819,6 @@ /* Initial scalar cleanups before alias computation. They ensure memory accesses are not indirect wherever possible. */ NEXT_PASS (pass_strip_predict_hints); - NEXT_PASS (pass_update_address_taken); NEXT_PASS (pass_rename_ssa_copies); NEXT_PASS (pass_complete_unrolli); NEXT_PASS (pass_ccp); @@ -896,13 +882,14 @@ NEXT_PASS (pass_record_bounds); NEXT_PASS (pass_check_data_deps); NEXT_PASS (pass_loop_distribution); - NEXT_PASS (pass_linear_transform); - NEXT_PASS (pass_graphite_transforms); + NEXT_PASS (pass_copy_prop); + NEXT_PASS (pass_graphite); { - struct opt_pass **p = &pass_graphite_transforms.pass.sub; + struct opt_pass **p = &pass_graphite.pass.sub; + NEXT_PASS (pass_graphite_transforms); + NEXT_PASS (pass_lim); NEXT_PASS (pass_copy_prop); NEXT_PASS (pass_dce_loop); - NEXT_PASS (pass_lim); } NEXT_PASS (pass_iv_canon); NEXT_PASS (pass_if_conversion); @@ -1029,6 +1016,7 @@ NEXT_PASS (pass_gcse2); NEXT_PASS (pass_split_after_reload); NEXT_PASS (pass_implicit_zee); + NEXT_PASS (pass_compare_elim_after_reload); NEXT_PASS (pass_branch_target_load_optimize1); NEXT_PASS (pass_thread_prologue_and_epilogue); NEXT_PASS (pass_rtl_dse2); @@ -1120,7 +1108,7 @@ keep the array visible to garbage collector to avoid reading collected out nodes. */ static int nnodes; -static GTY ((length ("nnodes"))) struct cgraph_node **order; +static GTY ((length ("nnodes"))) cgraph_node_ptr *order; /* If we are in IPA mode (i.e., current_function_decl is NULL), call function CALLBACK for every function in the call graph. Otherwise, @@ -1136,7 +1124,7 @@ else { gcc_assert (!order); - order = GGC_NEWVEC (struct cgraph_node *, cgraph_n_nodes); + order = ggc_alloc_vec_cgraph_node_ptr (cgraph_n_nodes); nnodes = cgraph_postorder (order); for (i = nnodes - 1; i >= 0; i--) order[i]->process = 1; @@ -1171,14 +1159,10 @@ execute_function_todo (void *data) { unsigned int flags = (size_t)data; - if (cfun->curr_properties & PROP_ssa) - flags |= TODO_verify_ssa; flags &= ~cfun->last_verified; if (!flags) return; - statistics_fini_pass (); - /* Always cleanup the CFG before trying to update SSA. */ if (flags & TODO_cleanup_cfg) { @@ -1204,15 +1188,13 @@ cfun->last_verified &= ~TODO_verify_ssa; } - if (flags & TODO_update_address_taken) - execute_update_addresses_taken (true); - if (flags & TODO_rebuild_alias) { - if (!(flags & TODO_update_address_taken)) - execute_update_addresses_taken (true); + execute_update_addresses_taken (); compute_may_aliases (); } + else if (optimize && (flags & TODO_update_address_taken)) + execute_update_addresses_taken (); if (flags & TODO_remove_unused_locals) remove_unused_locals (); @@ -1243,22 +1225,14 @@ } if (flags & TODO_rebuild_frequencies) - { - if (profile_status == PROFILE_GUESSED) - { - loop_optimizer_init (0); - add_noreturn_fake_exit_edges (); - mark_irreducible_loops (); - connect_infinite_loops_to_exit (); - estimate_bb_frequencies (); - remove_fake_exit_edges (); - loop_optimizer_finalize (); - } - else if (profile_status == PROFILE_READ) - counts_to_freqs (); - else - gcc_unreachable (); - } + rebuild_frequencies (); + + if (flags & TODO_rebuild_cgraph_edges) + rebuild_cgraph_edges (); + + /* If we've seen errors do not bother running any verifiers. */ + if (seen_error ()) + return; #if defined ENABLE_CHECKING if (flags & TODO_verify_ssa @@ -1287,9 +1261,13 @@ gcc_assert (flags & TODO_update_ssa_any); #endif + timevar_push (TV_TODO); + /* Inform the pass whether it is the first time it is run. */ first_pass_instance = (flags & TODO_mark_first_instance) != 0; + statistics_fini_pass (); + do_per_function (execute_function_todo, (void *)(size_t) flags); /* Always remove functions just as before inlining: IPA passes might be @@ -1318,6 +1296,8 @@ df problems. */ if (flags & TODO_df_finish) df_finish_pass ((flags & TODO_df_verify) != 0); + + timevar_pop (TV_TODO); } /* Verify invariants that should hold between passes. This is a place @@ -1326,9 +1306,7 @@ static void verify_interpass_invariants (void) { -#ifdef ENABLE_CHECKING - gcc_assert (!fold_deferring_overflow_warnings_p ()); -#endif + gcc_checking_assert (!fold_deferring_overflow_warnings_p ()); } /* Clear the last verified flag. */ @@ -1495,20 +1473,11 @@ void execute_all_ipa_transforms (void) { - enum cgraph_state old_state = cgraph_state; struct cgraph_node *node; if (!cfun) return; node = cgraph_node (current_function_decl); - /* Statement verification skip verification of nothorw when - state is IPA_SSA because we do not modify function bodies - after setting the flag on function. Instead we leave it - to fixup_cfg to do such a transformation. We need to temporarily - change the cgraph state so statement verifier before - transform do not fire. */ - cgraph_state = CGRAPH_STATE_IPA_SSA; - if (node->ipa_transforms_to_apply) { unsigned int i; @@ -1522,7 +1491,6 @@ VEC_free (ipa_opt_pass, heap, node->ipa_transforms_to_apply); node->ipa_transforms_to_apply = NULL; } - cgraph_state = old_state; } /* Execute PASS. */ @@ -1670,8 +1638,12 @@ if (pass->tv_id) timevar_push (pass->tv_id); + pass_init_dump_file (pass); + ipa_pass->write_summary (set,vset); + pass_fini_dump_file (pass); + /* If a timevar is present, start it. */ if (pass->tv_id) timevar_pop (pass->tv_id); @@ -1716,7 +1688,7 @@ struct varpool_node *vnode; int i, order_pos; - if (!flag_generate_lto || errorcount || sorrycount) + if (!flag_generate_lto || seen_error ()) return; set = cgraph_node_set_new (); @@ -1784,8 +1756,12 @@ if (pass->tv_id) timevar_push (pass->tv_id); + pass_init_dump_file (pass); + ipa_pass->write_optimization_summary (set, vset); + pass_fini_dump_file (pass); + /* If a timevar is present, start it. */ if (pass->tv_id) timevar_pop (pass->tv_id); @@ -1805,9 +1781,26 @@ ipa_write_optimization_summaries (cgraph_node_set set, varpool_node_set vset) { struct lto_out_decl_state *state = lto_new_out_decl_state (); + cgraph_node_set_iterator csi; compute_ltrans_boundary (state, set, vset); lto_push_out_decl_state (state); + for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi)) + { + struct cgraph_node *node = csi_node (csi); + /* When streaming out references to statements as part of some IPA + pass summary, the statements need to have uids assigned. + + For functions newly born at WPA stage we need to initialize + the uids here. */ + if (node->analyzed + && gimple_has_body_p (node->decl)) + { + push_cfun (DECL_STRUCT_FUNCTION (node->decl)); + renumber_gimple_stmt_uids (); + pop_cfun (); + } + } gcc_assert (flag_wpa); ipa_write_optimization_summaries_1 (all_regular_ipa_passes, set, vset, state); @@ -1840,8 +1833,12 @@ if (pass->tv_id) timevar_push (pass->tv_id); + pass_init_dump_file (pass); + ipa_pass->read_summary (); + pass_fini_dump_file (pass); + /* Stop timevar. */ if (pass->tv_id) timevar_pop (pass->tv_id); @@ -1886,8 +1883,12 @@ if (pass->tv_id) timevar_push (pass->tv_id); + pass_init_dump_file (pass); + ipa_pass->read_optimization_summary (); + pass_fini_dump_file (pass); + /* Stop timevar. */ if (pass->tv_id) timevar_pop (pass->tv_id); @@ -1988,7 +1989,7 @@ extern void debug_properties (unsigned int); extern void dump_properties (FILE *, unsigned int); -void +DEBUG_FUNCTION void dump_properties (FILE *dump, unsigned int props) { fprintf (dump, "Properties:\n"); @@ -2012,9 +2013,11 @@ fprintf (dump, "PROP_gimple_lomp\n"); if (props & PROP_gimple_lcx) fprintf (dump, "PROP_gimple_lcx\n"); + if (props & PROP_cfglayout) + fprintf (dump, "PROP_cfglayout\n"); } -void +DEBUG_FUNCTION void debug_properties (unsigned int props) { dump_properties (stderr, props);