1 /* Top level of GCC compilers (cc1, cc1plus, etc.)
2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 /* This is the top level of cc1/c++.
23 It parses command args, opens files, invokes the various passes
24 in the proper order, and counts the time used by each.
25 Error messages and low-level interface to malloc also handled here. */
28 #undef FLOAT /* This is for hpux. They should change hpux. */
29 #undef FFS /* Some systems define this in param.h. */
31 #include "coretypes.h"
35 #ifdef HAVE_SYS_RESOURCE_H
36 # include <sys/resource.h>
39 #ifdef HAVE_SYS_TIMES_H
40 # include <sys/times.h>
49 #include "insn-attr.h"
50 #include "insn-config.h"
51 #include "insn-flags.h"
52 #include "hard-reg-set.h"
59 #include "basic-block.h"
65 #include "diagnostic.h"
68 #include "dwarf2asm.h"
69 #include "integrate.h"
73 #include "langhooks.h"
74 #include "cfglayout.h"
76 #include "hosthooks.h"
80 #include "value-prof.h"
81 #include "alloc-pool.h"
82 #include "tree-pass.h"
83 #include "tree-dump.h"
85 #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
86 #include "dwarf2out.h"
89 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
93 #ifdef SDB_DEBUGGING_INFO
97 #ifdef XCOFF_DEBUGGING_INFO
98 #include "xcoffout.h" /* Needed for external data
99 declarations for e.g. AIX 4.x. */
102 #ifndef HAVE_conditional_execution
103 #define HAVE_conditional_execution 0
106 /* Format to use to print dumpfile index value */
107 #ifndef DUMPFILE_FORMAT
108 #define DUMPFILE_FORMAT ".%02d."
111 static int initializing_dump
= 0;
113 /* Routine to open a dump file. Return true if the dump file is enabled. */
116 open_dump_file (enum tree_dump_index index
, tree decl
)
118 if (! dump_enabled_p (index
))
121 timevar_push (TV_DUMP
);
123 if (dump_file
!= NULL
|| dump_file_name
!= NULL
)
126 dump_file_name
= get_dump_file_name (index
);
127 initializing_dump
= !dump_initialized_p (index
);
128 dump_file
= dump_begin (index
, NULL
);
130 if (dump_file
== NULL
)
131 fatal_error ("can't open %s: %m", dump_file_name
);
134 fprintf (dump_file
, "\n;; Function %s%s\n\n",
135 lang_hooks
.decl_printable_name (decl
, 2),
136 cfun
->function_frequency
== FUNCTION_FREQUENCY_HOT
138 : cfun
->function_frequency
== FUNCTION_FREQUENCY_UNLIKELY_EXECUTED
139 ? " (unlikely executed)"
142 timevar_pop (TV_DUMP
);
146 /* Routine to close a dump file. */
149 close_dump_file (enum tree_dump_index index
,
150 void (*func
) (FILE *, rtx
),
156 timevar_push (TV_DUMP
);
158 && graph_dump_format
!= no_graph
)
160 /* If we've not initialized the files, do so now. */
161 if (initializing_dump
)
162 clean_graph_dump_file (dump_file_name
);
164 print_rtl_graph_with_bb (dump_file_name
, insns
);
168 func (dump_file
, insns
);
170 dump_end (index
, dump_file
);
171 free ((char *) dump_file_name
);
174 dump_file_name
= NULL
;
175 timevar_pop (TV_DUMP
);
178 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
181 This does nothing for local (non-static) variables, unless the
182 variable is a register variable with DECL_ASSEMBLER_NAME set. In
183 that case, or if the variable is not an automatic, it sets up the
184 RTL and outputs any assembler code (label definition, storage
185 allocation and initialization).
187 DECL is the declaration. TOP_LEVEL is nonzero
188 if this declaration is not within a function. */
191 rest_of_decl_compilation (tree decl
,
195 /* We deferred calling assemble_alias so that we could collect
196 other attributes such as visibility. Emit the alias now. */
199 alias
= lookup_attribute ("alias", DECL_ATTRIBUTES (decl
));
202 alias
= TREE_VALUE (TREE_VALUE (alias
));
203 alias
= get_identifier (TREE_STRING_POINTER (alias
));
204 assemble_alias (decl
, alias
);
208 /* Can't defer this, because it needs to happen before any
209 later function definitions are processed. */
210 if (DECL_REGISTER (decl
) && DECL_ASSEMBLER_NAME_SET_P (decl
))
211 make_decl_rtl (decl
);
213 /* Forward declarations for nested functions are not "external",
214 but we need to treat them as if they were. */
215 if (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)
216 || TREE_CODE (decl
) == FUNCTION_DECL
)
218 timevar_push (TV_VARCONST
);
220 /* Don't output anything when a tentative file-scope definition
221 is seen. But at end of compilation, do output code for them.
223 We do output all variables when unit-at-a-time is active and rely on
224 callgraph code to defer them except for forward declarations
225 (see gcc.c-torture/compile/920624-1.c) */
227 || !DECL_DEFER_OUTPUT (decl
)
228 || (flag_unit_at_a_time
&& DECL_INITIAL (decl
)))
229 && !DECL_EXTERNAL (decl
))
231 if (flag_unit_at_a_time
&& !cgraph_global_info_ready
232 && TREE_CODE (decl
) != FUNCTION_DECL
&& top_level
)
233 cgraph_varpool_finalize_decl (decl
);
235 assemble_variable (decl
, top_level
, at_end
, 0);
238 #ifdef ASM_FINISH_DECLARE_OBJECT
239 if (decl
== last_assemble_variable_decl
)
241 ASM_FINISH_DECLARE_OBJECT (asm_out_file
, decl
,
246 timevar_pop (TV_VARCONST
);
248 else if (TREE_CODE (decl
) == TYPE_DECL
)
250 timevar_push (TV_SYMOUT
);
251 debug_hooks
->type_decl (decl
, !top_level
);
252 timevar_pop (TV_SYMOUT
);
256 /* Called after finishing a record, union or enumeral type. */
259 rest_of_type_compilation (tree type
, int toplev
)
261 /* Avoid confusing the debug information machinery when there are
263 if (errorcount
!= 0 || sorrycount
!= 0)
266 timevar_push (TV_SYMOUT
);
267 debug_hooks
->type_decl (TYPE_STUB_DECL (type
), !toplev
);
268 timevar_pop (TV_SYMOUT
);
271 /* Turn the RTL into assembly. */
273 rest_of_handle_final (void)
275 timevar_push (TV_FINAL
);
280 /* Get the function's name, as described by its RTL. This may be
281 different from the DECL_NAME name used in the source file. */
283 x
= DECL_RTL (current_function_decl
);
287 if (GET_CODE (x
) != SYMBOL_REF
)
289 fnname
= XSTR (x
, 0);
291 assemble_start_function (current_function_decl
, fnname
);
292 final_start_function (get_insns (), asm_out_file
, optimize
);
293 final (get_insns (), asm_out_file
, optimize
, 0);
294 final_end_function ();
296 #ifdef TARGET_UNWIND_INFO
297 /* ??? The IA-64 ".handlerdata" directive must be issued before
298 the ".endp" directive that closes the procedure descriptor. */
299 output_function_exception_table ();
302 assemble_end_function (current_function_decl
, fnname
);
304 #ifndef TARGET_UNWIND_INFO
305 /* Otherwise, it feels unclean to switch sections in the middle. */
306 output_function_exception_table ();
309 user_defined_section_attribute
= false;
312 fflush (asm_out_file
);
314 /* Release all memory allocated by flow. */
315 free_basic_block_vars ();
318 /* Write DBX symbols if requested. */
320 /* Note that for those inline functions where we don't initially
321 know for certain that we will be generating an out-of-line copy,
322 the first invocation of this routine (rest_of_compilation) will
323 skip over this code by doing a `goto exit_rest_of_compilation;'.
324 Later on, wrapup_global_declarations will (indirectly) call
325 rest_of_compilation again for those inline functions that need
326 to have out-of-line copies generated. During that call, we
327 *will* be routed past here. */
329 timevar_push (TV_SYMOUT
);
330 (*debug_hooks
->function_decl
) (current_function_decl
);
331 timevar_pop (TV_SYMOUT
);
334 timevar_pop (TV_FINAL
);
338 /* Run delay slot optimization. */
340 rest_of_handle_delay_slots (void)
342 timevar_push (TV_DBR_SCHED
);
343 open_dump_file (DFI_dbr
, current_function_decl
);
345 dbr_schedule (get_insns (), dump_file
);
347 close_dump_file (DFI_dbr
, print_rtl
, get_insns ());
351 timevar_pop (TV_DBR_SCHED
);
356 /* Convert register usage from flat register file usage to a stack
359 rest_of_handle_stack_regs (void)
361 #if defined (HAVE_ATTR_length)
362 /* If flow2 creates new instructions which need splitting
363 and scheduling after reload is not done, they might not be
364 split until final which doesn't allow splitting
365 if HAVE_ATTR_length. */
366 #ifdef INSN_SCHEDULING
367 if (optimize
&& !flag_schedule_insns_after_reload
)
372 timevar_push (TV_SHORTEN_BRANCH
);
374 timevar_pop (TV_SHORTEN_BRANCH
);
378 timevar_push (TV_REG_STACK
);
379 open_dump_file (DFI_stack
, current_function_decl
);
381 if (reg_to_stack (dump_file
) && optimize
)
383 if (cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_POST_REGSTACK
384 | (flag_crossjumping
? CLEANUP_CROSSJUMP
: 0))
385 && (flag_reorder_blocks
|| flag_reorder_blocks_and_partition
))
387 reorder_basic_blocks (0);
388 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_POST_REGSTACK
);
392 close_dump_file (DFI_stack
, print_rtl_with_bb
, get_insns ());
395 timevar_pop (TV_REG_STACK
);
399 /* Track the variables, i.e. compute where the variable is stored at each position in function. */
401 rest_of_handle_variable_tracking (void)
403 timevar_push (TV_VAR_TRACKING
);
404 open_dump_file (DFI_vartrack
, current_function_decl
);
406 variable_tracking_main ();
408 close_dump_file (DFI_vartrack
, print_rtl_with_bb
, get_insns ());
409 timevar_pop (TV_VAR_TRACKING
);
412 /* Machine dependent reorg pass. */
414 rest_of_handle_machine_reorg (void)
416 timevar_push (TV_MACH_DEP
);
417 open_dump_file (DFI_mach
, current_function_decl
);
419 targetm
.machine_dependent_reorg ();
421 close_dump_file (DFI_mach
, print_rtl
, get_insns ());
424 timevar_pop (TV_MACH_DEP
);
428 /* Run new register allocator. Return TRUE if we must exit
429 rest_of_compilation upon return. */
431 rest_of_handle_new_regalloc (void)
435 timevar_push (TV_LOCAL_ALLOC
);
436 open_dump_file (DFI_lreg
, current_function_decl
);
438 delete_trivially_dead_insns (get_insns (), max_reg_num ());
441 timevar_pop (TV_LOCAL_ALLOC
);
442 close_dump_file (DFI_lreg
, NULL
, NULL
);
444 /* XXX clean up the whole mess to bring live info in shape again. */
445 timevar_push (TV_GLOBAL_ALLOC
);
446 open_dump_file (DFI_greg
, current_function_decl
);
448 build_insn_chain (get_insns ());
449 failure
= reload (get_insns (), 0);
451 timevar_pop (TV_GLOBAL_ALLOC
);
455 if (dump_enabled_p (DFI_greg
))
457 timevar_push (TV_DUMP
);
458 dump_global_regs (dump_file
);
459 timevar_pop (TV_DUMP
);
460 close_dump_file (DFI_greg
, print_rtl_with_bb
, get_insns ());
466 reload_completed
= 1;
471 /* Run old register allocator. Return TRUE if we must exit
472 rest_of_compilation upon return. */
474 rest_of_handle_old_regalloc (void)
479 timevar_push (TV_LOCAL_ALLOC
);
480 open_dump_file (DFI_lreg
, current_function_decl
);
482 /* Allocate the reg_renumber array. */
483 allocate_reg_info (max_regno
, FALSE
, TRUE
);
485 /* And the reg_equiv_memory_loc array. */
486 VARRAY_GROW (reg_equiv_memory_loc_varray
, max_regno
);
487 reg_equiv_memory_loc
= &VARRAY_RTX (reg_equiv_memory_loc_varray
, 0);
489 allocate_initial_values (reg_equiv_memory_loc
);
491 regclass (get_insns (), max_reg_num (), dump_file
);
492 rebuild_notes
= local_alloc ();
494 timevar_pop (TV_LOCAL_ALLOC
);
496 /* Local allocation may have turned an indirect jump into a direct
497 jump. If so, we must rebuild the JUMP_LABEL fields of jumping
501 timevar_push (TV_JUMP
);
503 rebuild_jump_labels (get_insns ());
504 purge_all_dead_edges (0);
505 delete_unreachable_blocks ();
507 timevar_pop (TV_JUMP
);
510 if (dump_enabled_p (DFI_lreg
))
512 timevar_push (TV_DUMP
);
513 dump_flow_info (dump_file
);
514 dump_local_alloc (dump_file
);
515 timevar_pop (TV_DUMP
);
518 close_dump_file (DFI_lreg
, print_rtl_with_bb
, get_insns ());
522 timevar_push (TV_GLOBAL_ALLOC
);
523 open_dump_file (DFI_greg
, current_function_decl
);
525 /* If optimizing, allocate remaining pseudo-regs. Do the reload
526 pass fixing up any insns that are invalid. */
529 failure
= global_alloc (dump_file
);
532 build_insn_chain (get_insns ());
533 failure
= reload (get_insns (), 0);
536 if (dump_enabled_p (DFI_greg
))
538 timevar_push (TV_DUMP
);
539 dump_global_regs (dump_file
);
540 timevar_pop (TV_DUMP
);
542 close_dump_file (DFI_greg
, print_rtl_with_bb
, get_insns ());
547 timevar_pop (TV_GLOBAL_ALLOC
);
552 /* Run the regrename and cprop passes. */
554 rest_of_handle_regrename (void)
556 timevar_push (TV_RENAME_REGISTERS
);
557 open_dump_file (DFI_rnreg
, current_function_decl
);
559 if (flag_rename_registers
)
560 regrename_optimize ();
561 if (flag_cprop_registers
)
562 copyprop_hardreg_forward ();
564 close_dump_file (DFI_rnreg
, print_rtl_with_bb
, get_insns ());
565 timevar_pop (TV_RENAME_REGISTERS
);
568 /* Reorder basic blocks. */
570 rest_of_handle_reorder_blocks (void)
573 unsigned int liveness_flags
;
575 open_dump_file (DFI_bbro
, current_function_decl
);
577 /* Last attempt to optimize CFG, as scheduling, peepholing and insn
578 splitting possibly introduced more crossjumping opportunities. */
579 liveness_flags
= (!HAVE_conditional_execution
? CLEANUP_UPDATE_LIFE
: 0);
580 changed
= cleanup_cfg (CLEANUP_EXPENSIVE
| liveness_flags
);
582 if (flag_sched2_use_traces
&& flag_schedule_insns_after_reload
)
583 tracer (liveness_flags
);
584 if (flag_reorder_blocks
|| flag_reorder_blocks_and_partition
)
585 reorder_basic_blocks (liveness_flags
);
586 if (flag_reorder_blocks
|| flag_reorder_blocks_and_partition
587 || (flag_sched2_use_traces
&& flag_schedule_insns_after_reload
))
588 changed
|= cleanup_cfg (CLEANUP_EXPENSIVE
| liveness_flags
);
590 /* On conditional execution targets we can not update the life cheaply, so
591 we deffer the updating to after both cleanups. This may lose some cases
592 but should not be terribly bad. */
593 if (changed
&& HAVE_conditional_execution
)
594 update_life_info (NULL
, UPDATE_LIFE_GLOBAL_RM_NOTES
,
596 close_dump_file (DFI_bbro
, print_rtl_with_bb
, get_insns ());
599 /* Partition hot and cold basic blocks. */
601 rest_of_handle_partition_blocks (void)
604 partition_hot_cold_basic_blocks ();
605 allocate_reg_life_data ();
606 update_life_info (NULL
, UPDATE_LIFE_GLOBAL_RM_NOTES
,
607 PROP_LOG_LINKS
| PROP_REG_INFO
| PROP_DEATH_NOTES
);
611 #ifdef INSN_SCHEDULING
612 /* Run instruction scheduler. */
613 /* Perform SMS module scheduling. */
615 rest_of_handle_sms (void)
617 timevar_push (TV_SMS
);
618 open_dump_file (DFI_sms
, current_function_decl
);
620 /* We want to be able to create new pseudos. */
622 sms_schedule (dump_file
);
623 close_dump_file (DFI_sms
, print_rtl
, get_insns ());
626 /* Update the life information, because we add pseudos. */
627 max_regno
= max_reg_num ();
628 allocate_reg_info (max_regno
, FALSE
, FALSE
);
629 update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES
,
631 | PROP_KILL_DEAD_CODE
632 | PROP_SCAN_DEAD_CODE
));
636 timevar_pop (TV_SMS
);
639 /* Run instruction scheduler. */
641 rest_of_handle_sched (void)
643 timevar_push (TV_SCHED
);
645 /* Print function header into sched dump now
646 because doing the sched analysis makes some of the dump. */
647 open_dump_file (DFI_sched
, current_function_decl
);
649 /* Do control and data sched analysis,
650 and write some of the results to dump file. */
652 schedule_insns (dump_file
);
654 close_dump_file (DFI_sched
, print_rtl_with_bb
, get_insns ());
657 timevar_pop (TV_SCHED
);
660 /* Run second scheduling pass after reload. */
662 rest_of_handle_sched2 (void)
664 timevar_push (TV_SCHED2
);
665 open_dump_file (DFI_sched2
, current_function_decl
);
667 /* Do control and data sched analysis again,
668 and write some more of the results to dump file. */
672 if (flag_sched2_use_superblocks
|| flag_sched2_use_traces
)
674 schedule_ebbs (dump_file
);
675 /* No liveness updating code yet, but it should be easy to do.
676 reg-stack recomputes the liveness when needed for now. */
677 count_or_remove_death_notes (NULL
, 1);
678 cleanup_cfg (CLEANUP_EXPENSIVE
);
681 schedule_insns (dump_file
);
683 close_dump_file (DFI_sched2
, print_rtl_with_bb
, get_insns ());
687 timevar_pop (TV_SCHED2
);
692 rest_of_handle_gcse2 (void)
694 timevar_push (TV_GCSE_AFTER_RELOAD
);
695 open_dump_file (DFI_gcse2
, current_function_decl
);
697 gcse_after_reload_main (get_insns ());
698 rebuild_jump_labels (get_insns ());
699 delete_trivially_dead_insns (get_insns (), max_reg_num ());
700 close_dump_file (DFI_gcse2
, print_rtl_with_bb
, get_insns ());
704 #ifdef ENABLE_CHECKING
708 timevar_pop (TV_GCSE_AFTER_RELOAD
);
711 /* Register allocation pre-pass, to reduce number of moves necessary
712 for two-address machines. */
714 rest_of_handle_regmove (void)
716 timevar_push (TV_REGMOVE
);
717 open_dump_file (DFI_regmove
, current_function_decl
);
719 regmove_optimize (get_insns (), max_reg_num (), dump_file
);
721 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_UPDATE_LIFE
);
722 close_dump_file (DFI_regmove
, print_rtl_with_bb
, get_insns ());
725 timevar_pop (TV_REGMOVE
);
730 rest_of_handle_tracer (void)
732 open_dump_file (DFI_tracer
, current_function_decl
);
734 dump_flow_info (dump_file
);
736 cleanup_cfg (CLEANUP_EXPENSIVE
);
737 reg_scan (get_insns (), max_reg_num (), 0);
738 close_dump_file (DFI_tracer
, print_rtl_with_bb
, get_insns ());
741 /* If-conversion and CFG cleanup. */
743 rest_of_handle_if_conversion (void)
745 timevar_push (TV_IFCVT
);
746 open_dump_file (DFI_ce1
, current_function_decl
);
748 if (flag_if_conversion
)
751 dump_flow_info (dump_file
);
752 cleanup_cfg (CLEANUP_EXPENSIVE
);
753 reg_scan (get_insns (), max_reg_num (), 0);
757 timevar_push (TV_JUMP
);
758 cleanup_cfg (CLEANUP_EXPENSIVE
);
759 reg_scan (get_insns (), max_reg_num (), 0);
760 timevar_pop (TV_JUMP
);
762 close_dump_file (DFI_ce1
, print_rtl_with_bb
, get_insns ());
763 timevar_pop (TV_IFCVT
);
766 /* Rerun if-conversion, as combine may have simplified things enough
767 to now meet sequence length restrictions. */
769 rest_of_handle_if_after_combine (void)
771 timevar_push (TV_IFCVT
);
772 open_dump_file (DFI_ce2
, current_function_decl
);
778 close_dump_file (DFI_ce2
, print_rtl_with_bb
, get_insns ());
779 timevar_pop (TV_IFCVT
);
783 rest_of_handle_if_after_reload (void)
785 timevar_push (TV_IFCVT2
);
786 open_dump_file (DFI_ce3
, current_function_decl
);
788 /* Last attempt to optimize CFG, as scheduling, peepholing and insn
789 splitting possibly introduced more crossjumping opportunities. */
790 cleanup_cfg (CLEANUP_EXPENSIVE
791 | CLEANUP_UPDATE_LIFE
792 | (flag_crossjumping
? CLEANUP_CROSSJUMP
: 0));
793 if (flag_if_conversion2
)
795 close_dump_file (DFI_ce3
, print_rtl_with_bb
, get_insns ());
796 timevar_pop (TV_IFCVT2
);
800 rest_of_handle_web (void)
802 open_dump_file (DFI_web
, current_function_decl
);
803 timevar_push (TV_WEB
);
805 delete_trivially_dead_insns (get_insns (), max_reg_num ());
806 cleanup_cfg (CLEANUP_EXPENSIVE
);
808 timevar_pop (TV_WEB
);
809 close_dump_file (DFI_web
, print_rtl_with_bb
, get_insns ());
810 reg_scan (get_insns (), max_reg_num (), 0);
813 /* Do branch profiling and static profile estimation passes. */
815 rest_of_handle_branch_prob (void)
819 timevar_push (TV_BRANCH_PROB
);
820 open_dump_file (DFI_bp
, current_function_decl
);
822 if (profile_arc_flag
|| flag_test_coverage
|| flag_branch_probabilities
)
825 /* Discover and record the loop depth at the head of each basic
826 block. The loop infrastructure does the real job for us. */
827 flow_loops_find (&loops
, LOOP_TREE
);
830 flow_loops_dump (&loops
, dump_file
, NULL
, 0);
832 /* Estimate using heuristics if no profiling info is available. */
833 if (flag_guess_branch_prob
)
834 estimate_probability (&loops
);
836 flow_loops_free (&loops
);
837 free_dominance_info (CDI_DOMINATORS
);
838 close_dump_file (DFI_bp
, print_rtl_with_bb
, get_insns ());
839 timevar_pop (TV_BRANCH_PROB
);
842 /* Do optimizations based on expression value profiles. */
844 rest_of_handle_value_profile_transformations (void)
846 open_dump_file (DFI_vpt
, current_function_decl
);
847 timevar_push (TV_VPT
);
849 if (value_profile_transformations ())
850 cleanup_cfg (CLEANUP_EXPENSIVE
);
852 timevar_pop (TV_VPT
);
853 close_dump_file (DFI_vpt
, print_rtl_with_bb
, get_insns ());
856 /* Do control and data flow analysis; write some of the results to the
859 rest_of_handle_cfg (void)
861 open_dump_file (DFI_cfg
, current_function_decl
);
863 dump_flow_info (dump_file
);
865 cleanup_cfg (CLEANUP_EXPENSIVE
866 | (flag_thread_jumps
? CLEANUP_THREADING
: 0));
868 /* It may make more sense to mark constant functions after dead code is
869 eliminated by life_analysis, but we need to do it early, as -fprofile-arcs
870 may insert code making function non-constant, but we still must consider
871 it as constant, otherwise -fbranch-probabilities will not read data back.
873 life_analysis rarely eliminates modification of external memory.
875 FIXME: now with tree based profiling we are in the trap described above
876 again. It seems to be easiest to disable the optimization for time
877 being before the problem is either solved by moving the transformation
878 to the IPA level (we need the CFG for this) or the very early optimization
879 passes are made to ignore the const/pure flags so code does not change. */
881 && (!flag_tree_based_profiling
882 || (!profile_arc_flag
&& !flag_branch_probabilities
)))
884 /* Alias analysis depends on this information and mark_constant_function
885 depends on alias analysis. */
886 reg_scan (get_insns (), max_reg_num (), 1);
887 mark_constant_function ();
890 close_dump_file (DFI_cfg
, print_rtl_with_bb
, get_insns ());
893 /* Perform jump bypassing and control flow optimizations. */
895 rest_of_handle_jump_bypass (void)
897 timevar_push (TV_BYPASS
);
898 open_dump_file (DFI_bypass
, current_function_decl
);
900 cleanup_cfg (CLEANUP_EXPENSIVE
);
901 reg_scan (get_insns (), max_reg_num (), 1);
903 if (bypass_jumps (dump_file
))
905 rebuild_jump_labels (get_insns ());
906 cleanup_cfg (CLEANUP_EXPENSIVE
);
907 delete_trivially_dead_insns (get_insns (), max_reg_num ());
910 close_dump_file (DFI_bypass
, print_rtl_with_bb
, get_insns ());
911 timevar_pop (TV_BYPASS
);
915 #ifdef ENABLE_CHECKING
920 /* Try combining insns through substitution. */
922 rest_of_handle_combine (void)
924 int rebuild_jump_labels_after_combine
= 0;
926 timevar_push (TV_COMBINE
);
927 open_dump_file (DFI_combine
, current_function_decl
);
929 rebuild_jump_labels_after_combine
930 = combine_instructions (get_insns (), max_reg_num ());
932 /* Combining insns may have turned an indirect jump into a
933 direct jump. Rebuild the JUMP_LABEL fields of jumping
935 if (rebuild_jump_labels_after_combine
)
937 timevar_push (TV_JUMP
);
938 rebuild_jump_labels (get_insns ());
939 timevar_pop (TV_JUMP
);
941 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_UPDATE_LIFE
);
944 close_dump_file (DFI_combine
, print_rtl_with_bb
, get_insns ());
945 timevar_pop (TV_COMBINE
);
950 /* Perform life analysis. */
952 rest_of_handle_life (void)
954 open_dump_file (DFI_life
, current_function_decl
);
957 #ifdef ENABLE_CHECKING
960 life_analysis (dump_file
, PROP_FINAL
);
962 cleanup_cfg ((optimize
? CLEANUP_EXPENSIVE
: 0) | CLEANUP_UPDATE_LIFE
964 | (flag_thread_jumps
? CLEANUP_THREADING
: 0));
968 setjmp_vars_warning (DECL_INITIAL (current_function_decl
));
969 setjmp_args_warning ();
974 if (!flag_new_regalloc
&& initialize_uninitialized_subregs ())
976 /* Insns were inserted, and possibly pseudos created, so
977 things might look a bit different. */
978 allocate_reg_life_data ();
979 update_life_info (NULL
, UPDATE_LIFE_GLOBAL_RM_NOTES
,
980 PROP_LOG_LINKS
| PROP_REG_INFO
| PROP_DEATH_NOTES
);
986 close_dump_file (DFI_life
, print_rtl_with_bb
, get_insns ());
991 /* Perform common subexpression elimination. Nonzero value from
992 `cse_main' means that jumps were simplified and some code may now
993 be unreachable, so do jump optimization again. */
995 rest_of_handle_cse (void)
999 open_dump_file (DFI_cse
, current_function_decl
);
1001 dump_flow_info (dump_file
);
1002 timevar_push (TV_CSE
);
1004 reg_scan (get_insns (), max_reg_num (), 1);
1006 tem
= cse_main (get_insns (), max_reg_num (), dump_file
);
1008 rebuild_jump_labels (get_insns ());
1009 if (purge_all_dead_edges (0))
1010 delete_unreachable_blocks ();
1012 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1014 /* If we are not running more CSE passes, then we are no longer
1015 expecting CSE to be run. But always rerun it in a cheap mode. */
1016 cse_not_expected
= !flag_rerun_cse_after_loop
&& !flag_gcse
;
1018 if (tem
|| optimize
> 1)
1019 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_PRE_LOOP
);
1021 timevar_pop (TV_CSE
);
1022 close_dump_file (DFI_cse
, print_rtl_with_bb
, get_insns ());
1027 /* Run second CSE pass after loop optimizations. */
1029 rest_of_handle_cse2 (void)
1033 timevar_push (TV_CSE2
);
1034 open_dump_file (DFI_cse2
, current_function_decl
);
1036 dump_flow_info (dump_file
);
1037 /* CFG is no longer maintained up-to-date. */
1038 tem
= cse_main (get_insns (), max_reg_num (), dump_file
);
1040 /* Run a pass to eliminate duplicated assignments to condition code
1041 registers. We have to run this after bypass_jumps, because it
1042 makes it harder for that pass to determine whether a jump can be
1044 cse_condition_code_reg ();
1046 purge_all_dead_edges (0);
1047 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1051 timevar_push (TV_JUMP
);
1052 rebuild_jump_labels (get_insns ());
1053 cleanup_cfg (CLEANUP_EXPENSIVE
);
1054 timevar_pop (TV_JUMP
);
1056 reg_scan (get_insns (), max_reg_num (), 0);
1057 close_dump_file (DFI_cse2
, print_rtl_with_bb
, get_insns ());
1058 timevar_pop (TV_CSE2
);
1063 /* Perform global cse. */
1065 rest_of_handle_gcse (void)
1067 int save_csb
, save_cfj
;
1070 timevar_push (TV_GCSE
);
1071 open_dump_file (DFI_gcse
, current_function_decl
);
1073 tem
= gcse_main (get_insns (), dump_file
);
1074 rebuild_jump_labels (get_insns ());
1075 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1077 save_csb
= flag_cse_skip_blocks
;
1078 save_cfj
= flag_cse_follow_jumps
;
1079 flag_cse_skip_blocks
= flag_cse_follow_jumps
= 0;
1081 /* If -fexpensive-optimizations, re-run CSE to clean up things done
1083 if (flag_expensive_optimizations
)
1085 timevar_push (TV_CSE
);
1086 reg_scan (get_insns (), max_reg_num (), 1);
1087 tem2
= cse_main (get_insns (), max_reg_num (), dump_file
);
1088 purge_all_dead_edges (0);
1089 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1090 timevar_pop (TV_CSE
);
1091 cse_not_expected
= !flag_rerun_cse_after_loop
;
1094 /* If gcse or cse altered any jumps, rerun jump optimizations to clean
1095 things up. Then possibly re-run CSE again. */
1099 timevar_push (TV_JUMP
);
1100 rebuild_jump_labels (get_insns ());
1101 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_PRE_LOOP
);
1102 timevar_pop (TV_JUMP
);
1104 if (flag_expensive_optimizations
)
1106 timevar_push (TV_CSE
);
1107 reg_scan (get_insns (), max_reg_num (), 1);
1108 tem2
= cse_main (get_insns (), max_reg_num (), dump_file
);
1109 purge_all_dead_edges (0);
1110 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1111 timevar_pop (TV_CSE
);
1115 close_dump_file (DFI_gcse
, print_rtl_with_bb
, get_insns ());
1116 timevar_pop (TV_GCSE
);
1119 flag_cse_skip_blocks
= save_csb
;
1120 flag_cse_follow_jumps
= save_cfj
;
1121 #ifdef ENABLE_CHECKING
1122 verify_flow_info ();
1126 /* Move constant computations out of loops. */
1128 rest_of_handle_loop_optimize (void)
1132 timevar_push (TV_LOOP
);
1133 delete_dead_jumptables ();
1134 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_PRE_LOOP
);
1135 open_dump_file (DFI_loop
, current_function_decl
);
1137 /* CFG is no longer maintained up-to-date. */
1138 free_bb_for_insn ();
1139 profile_status
= PROFILE_ABSENT
;
1141 do_prefetch
= flag_prefetch_loop_arrays
? LOOP_PREFETCH
: 0;
1143 if (flag_rerun_loop_opt
)
1145 cleanup_barriers ();
1147 /* We only want to perform unrolling once. */
1148 loop_optimize (get_insns (), dump_file
, 0);
1150 /* The first call to loop_optimize makes some instructions
1151 trivially dead. We delete those instructions now in the
1152 hope that doing so will make the heuristics in loop work
1153 better and possibly speed up compilation. */
1154 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1156 /* The regscan pass is currently necessary as the alias
1157 analysis code depends on this information. */
1158 reg_scan (get_insns (), max_reg_num (), 1);
1160 cleanup_barriers ();
1161 loop_optimize (get_insns (), dump_file
, do_prefetch
);
1163 /* Loop can create trivially dead instructions. */
1164 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1165 find_basic_blocks (get_insns (), max_reg_num (), dump_file
);
1166 close_dump_file (DFI_loop
, print_rtl
, get_insns ());
1167 timevar_pop (TV_LOOP
);
1172 /* Perform loop optimizations. It might be better to do them a bit
1173 sooner, but we want the profile feedback to work more
1176 rest_of_handle_loop2 (void)
1178 struct loops
*loops
;
1181 if (!flag_move_loop_invariants
1182 && !flag_unswitch_loops
1184 && !flag_unroll_loops
1185 && !flag_branch_on_count_reg
)
1188 timevar_push (TV_LOOP
);
1189 open_dump_file (DFI_loop2
, current_function_decl
);
1191 dump_flow_info (dump_file
);
1193 /* Initialize structures for layout changes. */
1194 cfg_layout_initialize (0);
1196 loops
= loop_optimizer_init (dump_file
);
1200 /* The optimizations: */
1201 if (flag_move_loop_invariants
)
1202 move_loop_invariants (loops
);
1204 if (flag_unswitch_loops
)
1205 unswitch_loops (loops
);
1207 if (flag_peel_loops
|| flag_unroll_loops
)
1208 unroll_and_peel_loops (loops
,
1209 (flag_peel_loops
? UAP_PEEL
: 0) |
1210 (flag_unroll_loops
? UAP_UNROLL
: 0) |
1211 (flag_unroll_all_loops
? UAP_UNROLL_ALL
: 0));
1213 #ifdef HAVE_doloop_end
1214 if (flag_branch_on_count_reg
&& HAVE_doloop_end
)
1215 doloop_optimize_loops (loops
);
1216 #endif /* HAVE_doloop_end */
1218 loop_optimizer_finalize (loops
, dump_file
);
1221 free_dominance_info (CDI_DOMINATORS
);
1223 /* Finalize layout changes. */
1225 if (bb
->next_bb
!= EXIT_BLOCK_PTR
)
1226 bb
->rbi
->next
= bb
->next_bb
;
1227 cfg_layout_finalize ();
1229 cleanup_cfg (CLEANUP_EXPENSIVE
);
1230 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1231 reg_scan (get_insns (), max_reg_num (), 0);
1233 dump_flow_info (dump_file
);
1234 close_dump_file (DFI_loop2
, print_rtl_with_bb
, get_insns ());
1235 timevar_pop (TV_LOOP
);
1240 rest_of_handle_branch_target_load_optimize (void)
1242 static int warned
= 0;
1244 /* Leave this a warning for now so that it is possible to experiment
1245 with running this pass twice. In 3.6, we should either make this
1246 an error, or use separate dump files. */
1247 if (flag_branch_target_load_optimize
1248 && flag_branch_target_load_optimize2
1251 warning ("branch target register load optimization is not intended "
1257 open_dump_file (DFI_branch_target_load
, current_function_decl
);
1258 branch_target_load_optimize (epilogue_completed
);
1259 close_dump_file (DFI_branch_target_load
, print_rtl_with_bb
, get_insns ());
1263 #ifdef OPTIMIZE_MODE_SWITCHING
1265 rest_of_handle_mode_switching (void)
1267 timevar_push (TV_MODE_SWITCH
);
1270 optimize_mode_switching (NULL
);
1273 timevar_pop (TV_MODE_SWITCH
);
1278 rest_of_handle_jump (void)
1282 timevar_push (TV_JUMP
);
1283 open_dump_file (DFI_sibling
, current_function_decl
);
1285 delete_unreachable_blocks ();
1286 #ifdef ENABLE_CHECKING
1287 verify_flow_info ();
1290 if (cfun
->tail_call_emit
)
1291 fixup_tail_calls ();
1293 close_dump_file (DFI_sibling
, print_rtl
, get_insns ());
1294 timevar_pop (TV_JUMP
);
1298 rest_of_handle_eh (void)
1300 insn_locators_initialize ();
1301 /* Complete generation of exception handling code. */
1304 timevar_push (TV_JUMP
);
1305 open_dump_file (DFI_eh
, current_function_decl
);
1307 cleanup_cfg (CLEANUP_PRE_LOOP
| CLEANUP_NO_INSN_DEL
);
1309 finish_eh_generation ();
1311 cleanup_cfg (CLEANUP_PRE_LOOP
| CLEANUP_NO_INSN_DEL
);
1313 close_dump_file (DFI_eh
, print_rtl
, get_insns ());
1314 timevar_pop (TV_JUMP
);
1319 rest_of_handle_stack_adjustments (void)
1321 life_analysis (dump_file
, PROP_POSTRELOAD
);
1322 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_UPDATE_LIFE
1323 | (flag_crossjumping
? CLEANUP_CROSSJUMP
: 0));
1325 /* This is kind of a heuristic. We need to run combine_stack_adjustments
1326 even for machines with possibly nonzero RETURN_POPS_ARGS
1327 and ACCUMULATE_OUTGOING_ARGS. We expect that only ports having
1328 push instructions will have popping returns. */
1329 #ifndef PUSH_ROUNDING
1330 if (!ACCUMULATE_OUTGOING_ARGS
)
1332 combine_stack_adjustments ();
1336 rest_of_handle_flow2 (void)
1338 timevar_push (TV_FLOW2
);
1339 open_dump_file (DFI_flow2
, current_function_decl
);
1341 /* Re-create the death notes which were deleted during reload. */
1342 #ifdef ENABLE_CHECKING
1343 verify_flow_info ();
1346 /* If optimizing, then go ahead and split insns now. */
1350 split_all_insns (0);
1352 if (flag_branch_target_load_optimize
)
1353 rest_of_handle_branch_target_load_optimize ();
1356 cleanup_cfg (CLEANUP_EXPENSIVE
);
1358 /* On some machines, the prologue and epilogue code, or parts thereof,
1359 can be represented as RTL. Doing so lets us schedule insns between
1360 it and the rest of the code and also allows delayed branch
1361 scheduling to operate in the epilogue. */
1362 thread_prologue_and_epilogue_insns (get_insns ());
1363 epilogue_completed
= 1;
1366 rest_of_handle_stack_adjustments ();
1368 flow2_completed
= 1;
1370 close_dump_file (DFI_flow2
, print_rtl_with_bb
, get_insns ());
1371 timevar_pop (TV_FLOW2
);
1378 rest_of_handle_jump2 (void)
1380 open_dump_file (DFI_jump
, current_function_decl
);
1382 /* Always do one jump optimization pass to ensure that JUMP_LABEL fields
1383 are initialized and to compute whether control can drop off the end
1386 timevar_push (TV_JUMP
);
1387 /* Turn NOTE_INSN_EXPECTED_VALUE into REG_BR_PROB. Do this
1388 before jump optimization switches branch directions. */
1389 if (flag_guess_branch_prob
)
1390 expected_value_to_br_prob ();
1392 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1393 reg_scan (get_insns (), max_reg_num (), 0);
1395 dump_flow_info (dump_file
);
1396 cleanup_cfg ((optimize
? CLEANUP_EXPENSIVE
: 0) | CLEANUP_PRE_LOOP
1397 | (flag_thread_jumps
? CLEANUP_THREADING
: 0));
1399 create_loop_notes ();
1401 purge_line_number_notes (get_insns ());
1404 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_PRE_LOOP
);
1406 /* Jump optimization, and the removal of NULL pointer checks, may
1407 have reduced the number of instructions substantially. CSE, and
1408 future passes, allocate arrays whose dimensions involve the
1409 maximum instruction UID, so if we can reduce the maximum UID
1410 we'll save big on memory. */
1411 renumber_insns (dump_file
);
1413 close_dump_file (DFI_jump
, print_rtl_with_bb
, get_insns ());
1414 timevar_pop (TV_JUMP
);
1419 #ifdef HAVE_peephole2
1421 rest_of_handle_peephole2 (void)
1423 timevar_push (TV_PEEPHOLE2
);
1424 open_dump_file (DFI_peephole2
, current_function_decl
);
1426 peephole2_optimize (dump_file
);
1428 close_dump_file (DFI_peephole2
, print_rtl_with_bb
, get_insns ());
1429 timevar_pop (TV_PEEPHOLE2
);
1434 rest_of_handle_postreload (void)
1436 timevar_push (TV_RELOAD_CSE_REGS
);
1437 open_dump_file (DFI_postreload
, current_function_decl
);
1439 /* Do a very simple CSE pass over just the hard registers. */
1440 reload_cse_regs (get_insns ());
1441 /* reload_cse_regs can eliminate potentially-trapping MEMs.
1442 Remove any EH edges associated with them. */
1443 if (flag_non_call_exceptions
)
1444 purge_all_dead_edges (0);
1446 close_dump_file (DFI_postreload
, print_rtl_with_bb
, get_insns ());
1447 timevar_pop (TV_RELOAD_CSE_REGS
);
1451 rest_of_handle_shorten_branches (void)
1453 /* Shorten branches. */
1454 timevar_push (TV_SHORTEN_BRANCH
);
1455 shorten_branches (get_insns ());
1456 timevar_pop (TV_SHORTEN_BRANCH
);
1460 rest_of_clean_state (void)
1463 coverage_end_function ();
1465 /* It is very important to decompose the RTL instruction chain here:
1466 debug information keeps pointing into CODE_LABEL insns inside the function
1467 body. If these remain pointing to the other insns, we end up preserving
1468 whole RTL chain and attached detailed debug info in memory. */
1469 for (insn
= get_insns (); insn
; insn
= next
)
1471 next
= NEXT_INSN (insn
);
1472 NEXT_INSN (insn
) = NULL
;
1473 PREV_INSN (insn
) = NULL
;
1476 /* In case the function was not output,
1477 don't leave any temporary anonymous types
1478 queued up for sdb output. */
1479 #ifdef SDB_DEBUGGING_INFO
1480 if (write_symbols
== SDB_DEBUG
)
1481 sdbout_types (NULL_TREE
);
1484 reload_completed
= 0;
1485 epilogue_completed
= 0;
1486 flow2_completed
= 0;
1489 timevar_push (TV_FINAL
);
1491 /* Clear out the insn_length contents now that they are no
1493 init_insn_lengths ();
1495 /* Show no temporary slots allocated. */
1498 free_basic_block_vars ();
1499 free_bb_for_insn ();
1501 timevar_pop (TV_FINAL
);
1503 if (targetm
.binds_local_p (current_function_decl
))
1505 int pref
= cfun
->preferred_stack_boundary
;
1506 if (cfun
->stack_alignment_needed
> cfun
->preferred_stack_boundary
)
1507 pref
= cfun
->stack_alignment_needed
;
1508 cgraph_rtl_info (current_function_decl
)->preferred_incoming_stack_boundary
1512 /* Make sure volatile mem refs aren't considered valid operands for
1513 arithmetic insns. We must call this here if this is a nested inline
1514 function, since the above code leaves us in the init_recog state
1515 (from final.c), and the function context push/pop code does not
1516 save/restore volatile_ok.
1518 ??? Maybe it isn't necessary for expand_start_function to call this
1519 anymore if we do it here? */
1521 init_recog_no_volatile ();
1523 /* We're done with this function. Free up memory if we can. */
1524 free_after_parsing (cfun
);
1525 free_after_compilation (cfun
);
1529 /* This function is called from the pass manager in tree-optimize.c
1530 after all tree passes have finished for a single function, and we
1531 have expanded the function body from trees to RTL.
1532 Once we are here, we have decided that we're supposed to output
1533 that function, i.e. that we should write assembler code for it.
1535 We run a series of low-level passes here on the function's RTL
1536 representation. Each pass is called via a rest_of_* function. */
1539 rest_of_compilation (void)
1541 /* If we're emitting a nested function, make sure its parent gets
1542 emitted as well. Doing otherwise confuses debug info. */
1545 for (parent
= DECL_CONTEXT (current_function_decl
);
1546 parent
!= NULL_TREE
;
1547 parent
= get_containing_scope (parent
))
1548 if (TREE_CODE (parent
) == FUNCTION_DECL
)
1549 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent
)) = 1;
1552 /* We are now committed to emitting code for this function. Do any
1553 preparation, such as emitting abstract debug info for the inline
1554 before it gets mangled by optimization. */
1555 if (cgraph_function_possibly_inlined_p (current_function_decl
))
1556 (*debug_hooks
->outlining_inline_function
) (current_function_decl
);
1558 /* Remove any notes we don't need. That will make iterating
1559 over the instruction sequence faster, and allow the garbage
1560 collector to reclaim the memory used by the notes. */
1561 remove_unnecessary_notes ();
1563 /* Initialize some variables used by the optimizers. */
1564 init_function_for_compilation ();
1566 TREE_ASM_WRITTEN (current_function_decl
) = 1;
1568 /* Early return if there were errors. We can run afoul of our
1569 consistency checks, and there's not really much point in fixing them. */
1570 if (rtl_dump_and_exit
|| flag_syntax_only
|| errorcount
|| sorrycount
)
1571 goto exit_rest_of_compilation
;
1573 rest_of_handle_jump ();
1575 rest_of_handle_eh ();
1577 /* Delay emitting hard_reg_initial_value sets until after EH landing pad
1578 generation, which might create new sets. */
1579 emit_initial_value_sets ();
1582 /* If we are doing position-independent code generation, now
1583 is the time to output special prologues and epilogues.
1584 We do not want to do this earlier, because it just clutters
1585 up inline functions with meaningless insns. */
1590 /* Copy any shared structure that should not be shared. */
1593 #ifdef SETJMP_VIA_SAVE_AREA
1594 /* This must be performed before virtual register instantiation.
1595 Please be aware that everything in the compiler that can look
1596 at the RTL up to this point must understand that REG_SAVE_AREA
1597 is just like a use of the REG contained inside. */
1598 if (current_function_calls_alloca
)
1599 optimize_save_area_alloca ();
1602 /* Instantiate all virtual registers. */
1603 instantiate_virtual_regs ();
1605 rest_of_handle_jump2 ();
1608 rest_of_handle_cse ();
1613 rest_of_handle_gcse ();
1615 if (flag_loop_optimize
)
1616 rest_of_handle_loop_optimize ();
1619 rest_of_handle_jump_bypass ();
1622 timevar_push (TV_FLOW
);
1623 rest_of_handle_cfg ();
1625 if (!flag_tree_based_profiling
1626 && (optimize
> 0 || profile_arc_flag
1627 || flag_test_coverage
|| flag_branch_probabilities
))
1629 rtl_register_profile_hooks ();
1630 rtl_register_value_prof_hooks ();
1631 rest_of_handle_branch_prob ();
1633 if (flag_branch_probabilities
1634 && flag_profile_values
1635 && (flag_value_profile_transformations
1636 || flag_speculative_prefetching
))
1637 rest_of_handle_value_profile_transformations ();
1639 /* Remove the death notes created for vpt. */
1640 if (flag_profile_values
)
1641 count_or_remove_death_notes (NULL
, 1);
1645 rest_of_handle_if_conversion ();
1647 if (optimize
> 0 && flag_tracer
)
1648 rest_of_handle_tracer ();
1651 && flag_loop_optimize2
)
1652 rest_of_handle_loop2 ();
1654 if (optimize
> 0 && flag_web
)
1655 rest_of_handle_web ();
1657 if (optimize
> 0 && flag_rerun_cse_after_loop
)
1658 rest_of_handle_cse2 ();
1660 cse_not_expected
= 1;
1662 rest_of_handle_life ();
1663 timevar_pop (TV_FLOW
);
1666 rest_of_handle_combine ();
1668 if (optimize
> 0 && flag_if_conversion
)
1669 rest_of_handle_if_after_combine ();
1671 /* The optimization to partition hot/cold basic blocks into separate
1672 sections of the .o file does not work well with linkonce or with
1673 user defined section attributes. Don't call it if either case
1676 if (flag_reorder_blocks_and_partition
1677 && !DECL_ONE_ONLY (current_function_decl
)
1678 && !user_defined_section_attribute
)
1679 rest_of_handle_partition_blocks ();
1681 if (optimize
> 0 && (flag_regmove
|| flag_expensive_optimizations
))
1682 rest_of_handle_regmove ();
1684 /* Do unconditional splitting before register allocation to allow machine
1685 description to add extra information not needed previously. */
1686 split_all_insns (1);
1688 #ifdef OPTIMIZE_MODE_SWITCHING
1689 rest_of_handle_mode_switching ();
1692 /* Any of the several passes since flow1 will have munged register
1693 lifetime data a bit. We need it to be up to date for scheduling
1694 (see handling of reg_known_equiv in init_alias_analysis). */
1695 recompute_reg_usage (get_insns (), !optimize_size
);
1697 #ifdef INSN_SCHEDULING
1698 if (optimize
> 0 && flag_modulo_sched
)
1699 rest_of_handle_sms ();
1701 if (flag_schedule_insns
)
1702 rest_of_handle_sched ();
1705 /* Determine if the current function is a leaf before running reload
1706 since this can impact optimizations done by the prologue and
1707 epilogue thus changing register elimination offsets. */
1708 current_function_is_leaf
= leaf_function_p ();
1710 if (flag_new_regalloc
)
1712 if (rest_of_handle_new_regalloc ())
1713 goto exit_rest_of_compilation
;
1717 if (rest_of_handle_old_regalloc ())
1718 goto exit_rest_of_compilation
;
1722 rest_of_handle_postreload ();
1724 if (optimize
> 0 && flag_gcse_after_reload
)
1725 rest_of_handle_gcse2 ();
1727 rest_of_handle_flow2 ();
1729 #ifdef HAVE_peephole2
1730 if (optimize
> 0 && flag_peephole2
)
1731 rest_of_handle_peephole2 ();
1735 rest_of_handle_if_after_reload ();
1739 if (flag_rename_registers
|| flag_cprop_registers
)
1740 rest_of_handle_regrename ();
1742 rest_of_handle_reorder_blocks ();
1745 if (flag_branch_target_load_optimize2
)
1746 rest_of_handle_branch_target_load_optimize ();
1748 #ifdef LEAF_REGISTERS
1749 current_function_uses_only_leaf_regs
1750 = optimize
> 0 && only_leaf_regs_used () && leaf_function_p ();
1753 #ifdef INSN_SCHEDULING
1754 if (optimize
> 0 && flag_schedule_insns_after_reload
)
1755 rest_of_handle_sched2 ();
1759 rest_of_handle_stack_regs ();
1762 compute_alignments ();
1764 if (flag_var_tracking
)
1765 rest_of_handle_variable_tracking ();
1767 /* CFG is no longer maintained up-to-date. */
1768 free_bb_for_insn ();
1770 if (targetm
.machine_dependent_reorg
!= 0)
1771 rest_of_handle_machine_reorg ();
1773 purge_line_number_notes (get_insns ());
1774 cleanup_barriers ();
1777 if (flag_delayed_branch
)
1778 rest_of_handle_delay_slots ();
1781 #if defined (HAVE_ATTR_length) && !defined (STACK_REGS)
1782 timevar_push (TV_SHORTEN_BRANCH
);
1783 split_all_insns_noflow ();
1784 timevar_pop (TV_SHORTEN_BRANCH
);
1787 convert_to_eh_region_ranges ();
1789 rest_of_handle_shorten_branches ();
1791 set_nothrow_function_flags ();
1793 rest_of_handle_final ();
1795 exit_rest_of_compilation
:
1797 rest_of_clean_state ();
1801 finish_optimization_passes (void)
1803 enum tree_dump_index i
;
1804 struct dump_file_info
*dfi
;
1807 timevar_push (TV_DUMP
);
1808 if (profile_arc_flag
|| flag_test_coverage
|| flag_branch_probabilities
)
1810 open_dump_file (DFI_bp
, NULL
);
1812 close_dump_file (DFI_bp
, NULL
, NULL_RTX
);
1815 if (optimize
> 0 && open_dump_file (DFI_combine
, NULL
))
1817 dump_combine_total_stats (dump_file
);
1818 close_dump_file (DFI_combine
, NULL
, NULL_RTX
);
1821 /* Do whatever is necessary to finish printing the graphs. */
1822 if (graph_dump_format
!= no_graph
)
1823 for (i
= DFI_MIN
; (dfi
= get_dump_file_info (i
)) != NULL
; ++i
)
1824 if (dump_initialized_p (i
)
1825 && (dfi
->flags
& TDF_RTL
) != 0
1826 && (name
= get_dump_file_name (i
)) != NULL
)
1828 finish_graph_dump_file (name
);
1832 timevar_pop (TV_DUMP
);
1835 struct tree_opt_pass pass_rest_of_compilation
=
1839 rest_of_compilation
, /* execute */
1842 0, /* static_pass_number */
1843 TV_REST_OF_COMPILATION
, /* tv_id */
1844 PROP_rtl
, /* properties_required */
1845 0, /* properties_provided */
1846 PROP_rtl
, /* properties_destroyed */
1847 0, /* todo_flags_start */
1848 TODO_ggc_collect
, /* todo_flags_finish */