diff options
author | Daniel Berlin <dberlin@gcc.gnu.org> | 2007-06-11 18:02:15 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@gcc.gnu.org> | 2007-06-11 18:02:15 +0000 |
commit | 6fb5fa3cbc0d78cf9f4ff7cac5e1d8af1e65c5bb (patch) | |
tree | fdb9e9f8a0700a2713dc690fed1a2cf20dae8392 /gcc/passes.c | |
parent | a91d32a4a65d54cccf639a1541417e39cb7b7deb (diff) | |
download | gcc-6fb5fa3cbc0d78cf9f4ff7cac5e1d8af1e65c5bb.zip gcc-6fb5fa3cbc0d78cf9f4ff7cac5e1d8af1e65c5bb.tar.gz gcc-6fb5fa3cbc0d78cf9f4ff7cac5e1d8af1e65c5bb.tar.bz2 |
Merge dataflow branch into mainline
From-SVN: r125624
Diffstat (limited to 'gcc/passes.c')
-rw-r--r-- | gcc/passes.c | 66 |
1 files changed, 61 insertions, 5 deletions
diff --git a/gcc/passes.c b/gcc/passes.c index f50b7a5..7c2754d 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -83,6 +83,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA #include "tree-flow.h" #include "tree-pass.h" #include "tree-dump.h" +#include "df.h" #include "predict.h" #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO) @@ -102,6 +103,33 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA declarations for e.g. AIX 4.x. */ #endif +/* This is used for debugging. It allows the current pass to printed + from anywhere in compilation. */ +struct tree_opt_pass *current_pass; + +/* Call from anywhere to find out what pass this is. Useful for + printing out debugging information deep inside an service + routine. */ +void +print_current_pass (FILE *file) +{ + if (current_pass) + fprintf (file, "current pass = %s (%d)\n", + current_pass->name, current_pass->static_pass_number); + else + fprintf (file, "no current pass.\n"); +} + + +/* Call from the debugger to get the current pass name. */ +void +debug_pass (void) +{ + print_current_pass (stderr); +} + + + /* Global variables used to communicate with passes. */ int dump_flags; bool in_gimple_form; @@ -418,6 +446,7 @@ next_pass_1 (struct tree_opt_pass **list, struct tree_opt_pass *pass) } + /* Construct the pass tree. The sequencing of passes is driven by the cgraph routines: @@ -668,6 +697,7 @@ init_optimization_passes (void) NEXT_PASS (pass_into_cfg_layout_mode); NEXT_PASS (pass_jump2); NEXT_PASS (pass_lower_subreg); + NEXT_PASS (pass_df_initialize_opt); NEXT_PASS (pass_cse); NEXT_PASS (pass_rtl_fwprop); NEXT_PASS (pass_gcse); @@ -690,39 +720,57 @@ init_optimization_passes (void) NEXT_PASS (pass_web); NEXT_PASS (pass_jump_bypass); NEXT_PASS (pass_cse2); + NEXT_PASS (pass_rtl_dse1); NEXT_PASS (pass_rtl_fwprop_addr); + NEXT_PASS (pass_regclass_init); + NEXT_PASS (pass_inc_dec); + NEXT_PASS (pass_initialize_regs); + NEXT_PASS (pass_no_new_pseudos); NEXT_PASS (pass_outof_cfg_layout_mode); - NEXT_PASS (pass_life); + NEXT_PASS (pass_ud_rtl_dce); NEXT_PASS (pass_combine); NEXT_PASS (pass_if_after_combine); NEXT_PASS (pass_partition_blocks); NEXT_PASS (pass_regmove); NEXT_PASS (pass_split_all_insns); NEXT_PASS (pass_lower_subreg2); + NEXT_PASS (pass_df_initialize_no_opt); + NEXT_PASS (pass_stack_ptr_mod); NEXT_PASS (pass_mode_switching); NEXT_PASS (pass_see); - NEXT_PASS (pass_recompute_reg_usage); NEXT_PASS (pass_sms); NEXT_PASS (pass_sched); + NEXT_PASS (pass_subregs_of_mode_init); NEXT_PASS (pass_local_alloc); NEXT_PASS (pass_global_alloc); + NEXT_PASS (pass_subregs_of_mode_finish); NEXT_PASS (pass_postreload); { struct tree_opt_pass **p = &pass_postreload.sub; NEXT_PASS (pass_postreload_cse); NEXT_PASS (pass_gcse2); - NEXT_PASS (pass_flow2); + NEXT_PASS (pass_split_after_reload); + NEXT_PASS (pass_branch_target_load_optimize1); + NEXT_PASS (pass_thread_prologue_and_epilogue); + NEXT_PASS (pass_rtl_dse2); NEXT_PASS (pass_rtl_seqabstr); NEXT_PASS (pass_stack_adjustments); NEXT_PASS (pass_peephole2); NEXT_PASS (pass_if_after_reload); NEXT_PASS (pass_regrename); + NEXT_PASS (pass_cprop_hardreg); + NEXT_PASS (pass_fast_rtl_dce); NEXT_PASS (pass_reorder_blocks); - NEXT_PASS (pass_branch_target_load_optimize); + NEXT_PASS (pass_branch_target_load_optimize2); NEXT_PASS (pass_leaf_regs); + NEXT_PASS (pass_split_before_sched2); NEXT_PASS (pass_sched2); - NEXT_PASS (pass_split_before_regstack); NEXT_PASS (pass_stack_regs); + { + struct tree_opt_pass **p = &pass_stack_regs.sub; + NEXT_PASS (pass_split_before_regstack); + NEXT_PASS (pass_stack_regs_run); + } NEXT_PASS (pass_compute_alignments); NEXT_PASS (pass_duplicate_computed_gotos); NEXT_PASS (pass_variable_tracking); @@ -730,6 +778,7 @@ init_optimization_passes (void) NEXT_PASS (pass_machine_reorg); NEXT_PASS (pass_cleanup_barriers); NEXT_PASS (pass_delay_slots); + NEXT_PASS (pass_df_finish); NEXT_PASS (pass_split_for_shorten_branches); NEXT_PASS (pass_convert_to_eh_region_ranges); NEXT_PASS (pass_shorten_branches); @@ -964,6 +1013,11 @@ execute_todo (unsigned int flags) { ggc_collect (); } + + /* Now that the dumping has been done, we can get rid of the optional + df problems. */ + if (flags & TODO_df_finish) + df_finish_pass (); } /* Verify invariants that should hold between passes. This is a place @@ -1013,6 +1067,7 @@ execute_one_pass (struct tree_opt_pass *pass) bool initializing_dump; unsigned int todo_after = 0; + current_pass = pass; /* See if we're supposed to run this pass. */ if (pass->gate && !pass->gate ()) return false; @@ -1106,6 +1161,7 @@ execute_one_pass (struct tree_opt_pass *pass) dump_file = NULL; } + current_pass = NULL; /* Reset in_gimple_form to not break non-unit-at-a-time mode. */ in_gimple_form = false; |