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"
66 #include "diagnostic.h"
69 #include "dwarf2asm.h"
70 #include "integrate.h"
74 #include "langhooks.h"
75 #include "cfglayout.h"
77 #include "hosthooks.h"
81 #include "value-prof.h"
82 #include "alloc-pool.h"
83 #include "tree-pass.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 /* Describes a dump file. */
113 struct dump_file_info
115 /* The unique extension to apply, e.g. ".jump". */
116 const char *const extension
;
118 /* The -d<c> character that enables this dump file. */
119 char const debug_switch
;
121 /* True if there is a corresponding graph dump file. */
122 char const graph_dump_p
;
124 /* True if the user selected this dump. */
127 /* True if the files have been initialized (ie truncated). */
131 /* Enumerate the extant dump files. */
168 DFI_branch_target_load
,
177 /* Describes all the dump files. Should be kept in order of the
178 pass and in sync with dump_file_index above.
180 Remaining -d letters:
186 static struct dump_file_info dump_file_tbl
[DFI_MAX
] =
188 { "cgraph", 'U', 0, 0, 0 },
189 { "rtl", 'r', 0, 0, 0 },
190 { "sibling", 'i', 0, 0, 0 },
191 { "eh", 'h', 0, 0, 0 },
192 { "jump", 'j', 0, 0, 0 },
193 { "null", 'u', 0, 0, 0 },
194 { "cse", 's', 0, 0, 0 },
195 { "gcse", 'G', 1, 0, 0 },
196 { "loop", 'L', 1, 0, 0 },
197 { "bypass", 'G', 1, 0, 0 }, /* Yes, duplicate enable switch. */
198 { "cfg", 'f', 1, 0, 0 },
199 { "bp", 'b', 1, 0, 0 },
200 { "vpt", 'V', 1, 0, 0 },
201 { "ce1", 'C', 1, 0, 0 },
202 { "tracer", 'T', 1, 0, 0 },
203 { "loop2", 'L', 1, 0, 0 },
204 { "web", 'Z', 0, 0, 0 },
205 { "cse2", 't', 1, 0, 0 },
206 { "life", 'f', 1, 0, 0 }, /* Yes, duplicate enable switch. */
207 { "combine", 'c', 1, 0, 0 },
208 { "ce2", 'C', 1, 0, 0 },
209 { "regmove", 'N', 1, 0, 0 },
210 { "sms", 'm', 0, 0, 0 },
211 { "sched", 'S', 1, 0, 0 },
212 { "lreg", 'l', 1, 0, 0 },
213 { "greg", 'g', 1, 0, 0 },
214 { "postreload", 'o', 1, 0, 0 },
215 { "gcse2", 'J', 0, 0, 0 },
216 { "flow2", 'w', 1, 0, 0 },
217 { "peephole2", 'z', 1, 0, 0 },
218 { "ce3", 'E', 1, 0, 0 },
219 { "rnreg", 'n', 1, 0, 0 },
220 { "bbro", 'B', 1, 0, 0 },
221 { "btl", 'd', 1, 0, 0 }, /* Yes, duplicate enable switch. */
222 { "sched2", 'R', 1, 0, 0 },
223 { "stack", 'k', 1, 0, 0 },
224 { "vartrack", 'V', 1, 0, 0 }, /* Yes, duplicate enable switch. */
225 { "mach", 'M', 1, 0, 0 },
226 { "dbr", 'd', 0, 0, 0 },
229 /* Routine to open a dump file. Return true if the dump file is enabled. */
232 open_dump_file (enum dump_file_index index
, tree decl
)
235 const char *open_arg
;
238 if (! dump_file_tbl
[index
].enabled
)
241 timevar_push (TV_DUMP
);
242 if (dump_file
!= NULL
)
245 sprintf (seq
, DUMPFILE_FORMAT
, index
);
247 if (! dump_file_tbl
[index
].initialized
)
249 /* If we've not initialized the files, do so now. */
250 if (graph_dump_format
!= no_graph
251 && dump_file_tbl
[index
].graph_dump_p
)
253 dump_name
= concat (seq
, dump_file_tbl
[index
].extension
, NULL
);
254 clean_graph_dump_file (dump_base_name
, dump_name
);
257 dump_file_tbl
[index
].initialized
= 1;
263 dump_name
= concat (dump_base_name
, seq
,
264 dump_file_tbl
[index
].extension
, NULL
);
266 dump_file
= fopen (dump_name
, open_arg
);
267 if (dump_file
== NULL
)
268 fatal_error ("can't open %s: %m", dump_name
);
273 fprintf (dump_file
, "\n;; Function %s%s\n\n",
274 lang_hooks
.decl_printable_name (decl
, 2),
275 cfun
->function_frequency
== FUNCTION_FREQUENCY_HOT
277 : cfun
->function_frequency
== FUNCTION_FREQUENCY_UNLIKELY_EXECUTED
278 ? " (unlikely executed)"
281 timevar_pop (TV_DUMP
);
285 /* Routine to close a dump file. */
288 close_dump_file (enum dump_file_index index
,
289 void (*func
) (FILE *, rtx
),
295 timevar_push (TV_DUMP
);
297 && graph_dump_format
!= no_graph
298 && dump_file_tbl
[index
].graph_dump_p
)
303 sprintf (seq
, DUMPFILE_FORMAT
, index
);
304 suffix
= concat (seq
, dump_file_tbl
[index
].extension
, NULL
);
305 print_rtl_graph_with_bb (dump_base_name
, suffix
, insns
);
310 func (dump_file
, insns
);
316 timevar_pop (TV_DUMP
);
319 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
322 This does nothing for local (non-static) variables, unless the
323 variable is a register variable with DECL_ASSEMBLER_NAME set. In
324 that case, or if the variable is not an automatic, it sets up the
325 RTL and outputs any assembler code (label definition, storage
326 allocation and initialization).
328 DECL is the declaration. TOP_LEVEL is nonzero
329 if this declaration is not within a function. */
332 rest_of_decl_compilation (tree decl
,
336 /* We deferred calling assemble_alias so that we could collect
337 other attributes such as visibility. Emit the alias now. */
340 alias
= lookup_attribute ("alias", DECL_ATTRIBUTES (decl
));
343 alias
= TREE_VALUE (TREE_VALUE (alias
));
344 alias
= get_identifier (TREE_STRING_POINTER (alias
));
345 assemble_alias (decl
, alias
);
349 /* Can't defer this, because it needs to happen before any
350 later function definitions are processed. */
351 if (DECL_REGISTER (decl
) && DECL_ASSEMBLER_NAME_SET_P (decl
))
352 make_decl_rtl (decl
);
354 /* Forward declarations for nested functions are not "external",
355 but we need to treat them as if they were. */
356 if (TREE_STATIC (decl
) || DECL_EXTERNAL (decl
)
357 || TREE_CODE (decl
) == FUNCTION_DECL
)
359 timevar_push (TV_VARCONST
);
361 /* Don't output anything when a tentative file-scope definition
362 is seen. But at end of compilation, do output code for them.
364 We do output all variables when unit-at-a-time is active and rely on
365 callgraph code to defer them except for forward declarations
366 (see gcc.c-torture/compile/920624-1.c) */
368 || !DECL_DEFER_OUTPUT (decl
)
369 || (flag_unit_at_a_time
&& DECL_INITIAL (decl
)))
370 && !DECL_EXTERNAL (decl
))
372 if (flag_unit_at_a_time
&& !cgraph_global_info_ready
373 && TREE_CODE (decl
) != FUNCTION_DECL
&& top_level
374 /* If we defer processing of decls that have had their
375 DECL_RTL set above (say, in make_decl_rtl),
376 check_global_declarations() will clear it before
377 assemble_variable has a chance to act on it. This
378 would remove all traces of the register name in a
379 global register variable, for example. */
380 && !DECL_RTL_SET_P (decl
))
381 cgraph_varpool_finalize_decl (decl
);
383 assemble_variable (decl
, top_level
, at_end
, 0);
386 #ifdef ASM_FINISH_DECLARE_OBJECT
387 if (decl
== last_assemble_variable_decl
)
389 ASM_FINISH_DECLARE_OBJECT (asm_out_file
, decl
,
394 timevar_pop (TV_VARCONST
);
396 else if (TREE_CODE (decl
) == TYPE_DECL
)
398 timevar_push (TV_SYMOUT
);
399 debug_hooks
->type_decl (decl
, !top_level
);
400 timevar_pop (TV_SYMOUT
);
404 /* Called after finishing a record, union or enumeral type. */
407 rest_of_type_compilation (tree type
, int toplev
)
409 /* Avoid confusing the debug information machinery when there are
411 if (errorcount
!= 0 || sorrycount
!= 0)
414 timevar_push (TV_SYMOUT
);
415 debug_hooks
->type_decl (TYPE_STUB_DECL (type
), !toplev
);
416 timevar_pop (TV_SYMOUT
);
419 /* Turn the RTL into assembly. */
421 rest_of_handle_final (void)
423 timevar_push (TV_FINAL
);
428 /* Get the function's name, as described by its RTL. This may be
429 different from the DECL_NAME name used in the source file. */
431 x
= DECL_RTL (current_function_decl
);
435 if (GET_CODE (x
) != SYMBOL_REF
)
437 fnname
= XSTR (x
, 0);
439 assemble_start_function (current_function_decl
, fnname
);
440 final_start_function (get_insns (), asm_out_file
, optimize
);
441 final (get_insns (), asm_out_file
, optimize
, 0);
442 final_end_function ();
444 #ifdef TARGET_UNWIND_INFO
445 /* ??? The IA-64 ".handlerdata" directive must be issued before
446 the ".endp" directive that closes the procedure descriptor. */
447 output_function_exception_table ();
450 assemble_end_function (current_function_decl
, fnname
);
452 #ifndef TARGET_UNWIND_INFO
453 /* Otherwise, it feels unclean to switch sections in the middle. */
454 output_function_exception_table ();
458 fflush (asm_out_file
);
460 /* Release all memory allocated by flow. */
461 free_basic_block_vars ();
463 /* Release all memory held by regsets now. */
464 regset_release_memory ();
467 /* Write DBX symbols if requested. */
469 /* Note that for those inline functions where we don't initially
470 know for certain that we will be generating an out-of-line copy,
471 the first invocation of this routine (rest_of_compilation) will
472 skip over this code by doing a `goto exit_rest_of_compilation;'.
473 Later on, wrapup_global_declarations will (indirectly) call
474 rest_of_compilation again for those inline functions that need
475 to have out-of-line copies generated. During that call, we
476 *will* be routed past here. */
478 timevar_push (TV_SYMOUT
);
479 (*debug_hooks
->function_decl
) (current_function_decl
);
480 timevar_pop (TV_SYMOUT
);
483 timevar_pop (TV_FINAL
);
487 /* Run delay slot optimization. */
489 rest_of_handle_delay_slots (void)
491 timevar_push (TV_DBR_SCHED
);
492 open_dump_file (DFI_dbr
, current_function_decl
);
494 dbr_schedule (get_insns (), dump_file
);
496 close_dump_file (DFI_dbr
, print_rtl
, get_insns ());
500 timevar_pop (TV_DBR_SCHED
);
505 /* Convert register usage from flat register file usage to a stack
508 rest_of_handle_stack_regs (void)
510 #if defined (HAVE_ATTR_length)
511 /* If flow2 creates new instructions which need splitting
512 and scheduling after reload is not done, they might not be
513 split until final which doesn't allow splitting
514 if HAVE_ATTR_length. */
515 #ifdef INSN_SCHEDULING
516 if (optimize
&& !flag_schedule_insns_after_reload
)
521 timevar_push (TV_SHORTEN_BRANCH
);
523 timevar_pop (TV_SHORTEN_BRANCH
);
527 timevar_push (TV_REG_STACK
);
528 open_dump_file (DFI_stack
, current_function_decl
);
530 if (reg_to_stack (dump_file
) && optimize
)
532 if (cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_POST_REGSTACK
533 | (flag_crossjumping
? CLEANUP_CROSSJUMP
: 0))
534 && (flag_reorder_blocks
|| flag_reorder_blocks_and_partition
))
536 reorder_basic_blocks (0);
537 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_POST_REGSTACK
);
541 close_dump_file (DFI_stack
, print_rtl_with_bb
, get_insns ());
544 timevar_pop (TV_REG_STACK
);
548 /* Track the variables, ie. compute where the variable is stored at each position in function. */
550 rest_of_handle_variable_tracking (void)
552 timevar_push (TV_VAR_TRACKING
);
553 open_dump_file (DFI_vartrack
, current_function_decl
);
555 variable_tracking_main ();
557 close_dump_file (DFI_vartrack
, print_rtl_with_bb
, get_insns ());
558 timevar_pop (TV_VAR_TRACKING
);
561 /* Machine dependent reorg pass. */
563 rest_of_handle_machine_reorg (void)
565 timevar_push (TV_MACH_DEP
);
566 open_dump_file (DFI_mach
, current_function_decl
);
568 targetm
.machine_dependent_reorg ();
570 close_dump_file (DFI_mach
, print_rtl
, get_insns ());
573 timevar_pop (TV_MACH_DEP
);
577 /* Run new register allocator. Return TRUE if we must exit
578 rest_of_compilation upon return. */
580 rest_of_handle_new_regalloc (void)
584 timevar_push (TV_LOCAL_ALLOC
);
585 open_dump_file (DFI_lreg
, current_function_decl
);
587 delete_trivially_dead_insns (get_insns (), max_reg_num ());
590 timevar_pop (TV_LOCAL_ALLOC
);
591 close_dump_file (DFI_lreg
, NULL
, NULL
);
593 /* XXX clean up the whole mess to bring live info in shape again. */
594 timevar_push (TV_GLOBAL_ALLOC
);
595 open_dump_file (DFI_greg
, current_function_decl
);
597 build_insn_chain (get_insns ());
598 failure
= reload (get_insns (), 0);
600 timevar_pop (TV_GLOBAL_ALLOC
);
604 if (dump_file_tbl
[DFI_greg
].enabled
)
606 timevar_push (TV_DUMP
);
607 dump_global_regs (dump_file
);
608 timevar_pop (TV_DUMP
);
609 close_dump_file (DFI_greg
, print_rtl_with_bb
, get_insns ());
615 reload_completed
= 1;
620 /* Run old register allocator. Return TRUE if we must exit
621 rest_of_compilation upon return. */
623 rest_of_handle_old_regalloc (void)
628 timevar_push (TV_LOCAL_ALLOC
);
629 open_dump_file (DFI_lreg
, current_function_decl
);
631 /* Allocate the reg_renumber array. */
632 allocate_reg_info (max_regno
, FALSE
, TRUE
);
634 /* And the reg_equiv_memory_loc array. */
635 VARRAY_GROW (reg_equiv_memory_loc_varray
, max_regno
);
636 reg_equiv_memory_loc
= &VARRAY_RTX (reg_equiv_memory_loc_varray
, 0);
638 allocate_initial_values (reg_equiv_memory_loc
);
640 regclass (get_insns (), max_reg_num (), dump_file
);
641 rebuild_notes
= local_alloc ();
643 timevar_pop (TV_LOCAL_ALLOC
);
645 /* Local allocation may have turned an indirect jump into a direct
646 jump. If so, we must rebuild the JUMP_LABEL fields of jumping
650 timevar_push (TV_JUMP
);
652 rebuild_jump_labels (get_insns ());
653 purge_all_dead_edges (0);
655 timevar_pop (TV_JUMP
);
658 if (dump_file_tbl
[DFI_lreg
].enabled
)
660 timevar_push (TV_DUMP
);
661 dump_flow_info (dump_file
);
662 dump_local_alloc (dump_file
);
663 timevar_pop (TV_DUMP
);
666 close_dump_file (DFI_lreg
, print_rtl_with_bb
, get_insns ());
670 timevar_push (TV_GLOBAL_ALLOC
);
671 open_dump_file (DFI_greg
, current_function_decl
);
673 /* If optimizing, allocate remaining pseudo-regs. Do the reload
674 pass fixing up any insns that are invalid. */
677 failure
= global_alloc (dump_file
);
680 build_insn_chain (get_insns ());
681 failure
= reload (get_insns (), 0);
684 if (dump_file_tbl
[DFI_greg
].enabled
)
686 timevar_push (TV_DUMP
);
687 dump_global_regs (dump_file
);
688 timevar_pop (TV_DUMP
);
690 close_dump_file (DFI_greg
, print_rtl_with_bb
, get_insns ());
695 timevar_pop (TV_GLOBAL_ALLOC
);
700 /* Run the regrename and cprop passes. */
702 rest_of_handle_regrename (void)
704 timevar_push (TV_RENAME_REGISTERS
);
705 open_dump_file (DFI_rnreg
, current_function_decl
);
707 if (flag_rename_registers
)
708 regrename_optimize ();
709 if (flag_cprop_registers
)
710 copyprop_hardreg_forward ();
712 close_dump_file (DFI_rnreg
, print_rtl_with_bb
, get_insns ());
713 timevar_pop (TV_RENAME_REGISTERS
);
716 /* Reorder basic blocks. */
718 rest_of_handle_reorder_blocks (void)
721 unsigned int liveness_flags
;
723 open_dump_file (DFI_bbro
, current_function_decl
);
725 /* Last attempt to optimize CFG, as scheduling, peepholing and insn
726 splitting possibly introduced more crossjumping opportunities. */
727 liveness_flags
= (!HAVE_conditional_execution
? CLEANUP_UPDATE_LIFE
: 0);
728 changed
= cleanup_cfg (CLEANUP_EXPENSIVE
| liveness_flags
);
730 if (flag_sched2_use_traces
&& flag_schedule_insns_after_reload
)
731 tracer (liveness_flags
);
732 if (flag_reorder_blocks
|| flag_reorder_blocks_and_partition
)
733 reorder_basic_blocks (liveness_flags
);
734 if (flag_reorder_blocks
|| flag_reorder_blocks_and_partition
735 || (flag_sched2_use_traces
&& flag_schedule_insns_after_reload
))
736 changed
|= cleanup_cfg (CLEANUP_EXPENSIVE
| liveness_flags
);
738 /* On conditional execution targets we can not update the life cheaply, so
739 we deffer the updating to after both cleanups. This may lose some cases
740 but should not be terribly bad. */
741 if (changed
&& HAVE_conditional_execution
)
742 update_life_info (NULL
, UPDATE_LIFE_GLOBAL_RM_NOTES
,
744 close_dump_file (DFI_bbro
, print_rtl_with_bb
, get_insns ());
747 /* Partition hot and cold basic blocks. */
749 rest_of_handle_partition_blocks (void)
752 partition_hot_cold_basic_blocks ();
753 allocate_reg_life_data ();
754 update_life_info (NULL
, UPDATE_LIFE_GLOBAL_RM_NOTES
,
755 PROP_LOG_LINKS
| PROP_REG_INFO
| PROP_DEATH_NOTES
);
759 #ifdef INSN_SCHEDULING
760 /* Run instruction scheduler. */
761 /* Perform SMS module scheduling. */
763 rest_of_handle_sms (void)
765 timevar_push (TV_SMS
);
766 open_dump_file (DFI_sms
, current_function_decl
);
768 /* We want to be able to create new pseudos. */
770 sms_schedule (dump_file
);
771 close_dump_file (DFI_sms
, print_rtl
, get_insns ());
774 /* Update the life information, because we add pseudos. */
775 max_regno
= max_reg_num ();
776 allocate_reg_info (max_regno
, FALSE
, FALSE
);
777 update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES
,
779 | PROP_KILL_DEAD_CODE
780 | PROP_SCAN_DEAD_CODE
));
784 timevar_pop (TV_SMS
);
787 /* Run instruction scheduler. */
789 rest_of_handle_sched (void)
791 timevar_push (TV_SCHED
);
793 /* Print function header into sched dump now
794 because doing the sched analysis makes some of the dump. */
795 open_dump_file (DFI_sched
, current_function_decl
);
797 /* Do control and data sched analysis,
798 and write some of the results to dump file. */
800 schedule_insns (dump_file
);
802 close_dump_file (DFI_sched
, print_rtl_with_bb
, get_insns ());
805 timevar_pop (TV_SCHED
);
808 /* Run second scheduling pass after reload. */
810 rest_of_handle_sched2 (void)
812 timevar_push (TV_SCHED2
);
813 open_dump_file (DFI_sched2
, current_function_decl
);
815 /* Do control and data sched analysis again,
816 and write some more of the results to dump file. */
820 if (flag_sched2_use_superblocks
|| flag_sched2_use_traces
)
822 schedule_ebbs (dump_file
);
823 /* No liveness updating code yet, but it should be easy to do.
824 reg-stack recomputes the liveness when needed for now. */
825 count_or_remove_death_notes (NULL
, 1);
826 cleanup_cfg (CLEANUP_EXPENSIVE
);
829 schedule_insns (dump_file
);
831 close_dump_file (DFI_sched2
, print_rtl_with_bb
, get_insns ());
835 timevar_pop (TV_SCHED2
);
840 rest_of_handle_gcse2 (void)
842 timevar_push (TV_RELOAD_CSE_REGS
);
843 open_dump_file (DFI_gcse2
, current_function_decl
);
845 gcse_after_reload_main (get_insns (), dump_file
);
846 rebuild_jump_labels (get_insns ());
847 delete_trivially_dead_insns (get_insns (), max_reg_num ());
848 close_dump_file (DFI_gcse2
, print_rtl_with_bb
, get_insns ());
852 #ifdef ENABLE_CHECKING
856 timevar_pop (TV_RELOAD_CSE_REGS
);
859 /* Register allocation pre-pass, to reduce number of moves necessary
860 for two-address machines. */
862 rest_of_handle_regmove (void)
864 timevar_push (TV_REGMOVE
);
865 open_dump_file (DFI_regmove
, current_function_decl
);
867 regmove_optimize (get_insns (), max_reg_num (), dump_file
);
869 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_UPDATE_LIFE
);
870 close_dump_file (DFI_regmove
, print_rtl_with_bb
, get_insns ());
873 timevar_pop (TV_REGMOVE
);
878 rest_of_handle_tracer (void)
880 open_dump_file (DFI_tracer
, current_function_decl
);
882 dump_flow_info (dump_file
);
884 cleanup_cfg (CLEANUP_EXPENSIVE
);
885 reg_scan (get_insns (), max_reg_num (), 0);
886 close_dump_file (DFI_tracer
, print_rtl_with_bb
, get_insns ());
889 /* If-conversion and CFG cleanup. */
891 rest_of_handle_if_conversion (void)
893 timevar_push (TV_IFCVT
);
894 open_dump_file (DFI_ce1
, current_function_decl
);
896 if (flag_if_conversion
)
899 dump_flow_info (dump_file
);
900 cleanup_cfg (CLEANUP_EXPENSIVE
);
901 reg_scan (get_insns (), max_reg_num (), 0);
905 timevar_push (TV_JUMP
);
906 cleanup_cfg (CLEANUP_EXPENSIVE
);
907 reg_scan (get_insns (), max_reg_num (), 0);
908 timevar_pop (TV_JUMP
);
910 close_dump_file (DFI_ce1
, print_rtl_with_bb
, get_insns ());
911 timevar_pop (TV_IFCVT
);
914 /* Rerun if-conversion, as combine may have simplified things enough
915 to now meet sequence length restrictions. */
917 rest_of_handle_if_after_combine (void)
919 timevar_push (TV_IFCVT
);
920 open_dump_file (DFI_ce2
, current_function_decl
);
926 close_dump_file (DFI_ce2
, print_rtl_with_bb
, get_insns ());
927 timevar_pop (TV_IFCVT
);
931 rest_of_handle_if_after_reload (void)
933 timevar_push (TV_IFCVT2
);
934 open_dump_file (DFI_ce3
, current_function_decl
);
936 /* Last attempt to optimize CFG, as scheduling, peepholing and insn
937 splitting possibly introduced more crossjumping opportunities. */
938 cleanup_cfg (CLEANUP_EXPENSIVE
939 | CLEANUP_UPDATE_LIFE
940 | (flag_crossjumping
? CLEANUP_CROSSJUMP
: 0));
941 if (flag_if_conversion2
)
943 close_dump_file (DFI_ce3
, print_rtl_with_bb
, get_insns ());
944 timevar_pop (TV_IFCVT2
);
948 rest_of_handle_web (void)
950 open_dump_file (DFI_web
, current_function_decl
);
951 timevar_push (TV_WEB
);
953 delete_trivially_dead_insns (get_insns (), max_reg_num ());
954 cleanup_cfg (CLEANUP_EXPENSIVE
);
956 timevar_pop (TV_WEB
);
957 close_dump_file (DFI_web
, print_rtl_with_bb
, get_insns ());
958 reg_scan (get_insns (), max_reg_num (), 0);
961 /* Do branch profiling and static profile estimation passes. */
963 rest_of_handle_branch_prob (void)
967 timevar_push (TV_BRANCH_PROB
);
968 open_dump_file (DFI_bp
, current_function_decl
);
970 if (profile_arc_flag
|| flag_test_coverage
|| flag_branch_probabilities
)
973 /* Discover and record the loop depth at the head of each basic
974 block. The loop infrastructure does the real job for us. */
975 flow_loops_find (&loops
, LOOP_TREE
);
978 flow_loops_dump (&loops
, dump_file
, NULL
, 0);
980 /* Estimate using heuristics if no profiling info is available. */
981 if (flag_guess_branch_prob
)
982 estimate_probability (&loops
);
984 flow_loops_free (&loops
);
985 free_dominance_info (CDI_DOMINATORS
);
986 close_dump_file (DFI_bp
, print_rtl_with_bb
, get_insns ());
987 timevar_pop (TV_BRANCH_PROB
);
990 /* Do optimizations based on expression value profiles. */
992 rest_of_handle_value_profile_transformations (void)
994 open_dump_file (DFI_vpt
, current_function_decl
);
995 timevar_push (TV_VPT
);
997 if (value_profile_transformations ())
998 cleanup_cfg (CLEANUP_EXPENSIVE
);
1000 timevar_pop (TV_VPT
);
1001 close_dump_file (DFI_vpt
, print_rtl_with_bb
, get_insns ());
1004 /* Do control and data flow analysis; write some of the results to the
1007 rest_of_handle_cfg (void)
1009 open_dump_file (DFI_cfg
, current_function_decl
);
1011 dump_flow_info (dump_file
);
1013 cleanup_cfg (CLEANUP_EXPENSIVE
1014 | (flag_thread_jumps
? CLEANUP_THREADING
: 0));
1016 /* It may make more sense to mark constant functions after dead code is
1017 eliminated by life_analysis, but we need to do it early, as -fprofile-arcs
1018 may insert code making function non-constant, but we still must consider
1019 it as constant, otherwise -fbranch-probabilities will not read data back.
1021 life_analysis rarely eliminates modification of external memory.
1025 /* Alias analysis depends on this information and mark_constant_function
1026 depends on alias analysis. */
1027 reg_scan (get_insns (), max_reg_num (), 1);
1028 mark_constant_function ();
1031 close_dump_file (DFI_cfg
, print_rtl_with_bb
, get_insns ());
1034 /* Perform jump bypassing and control flow optimizations. */
1036 rest_of_handle_jump_bypass (void)
1038 timevar_push (TV_BYPASS
);
1039 open_dump_file (DFI_bypass
, current_function_decl
);
1041 cleanup_cfg (CLEANUP_EXPENSIVE
);
1042 reg_scan (get_insns (), max_reg_num (), 1);
1044 if (bypass_jumps (dump_file
))
1046 rebuild_jump_labels (get_insns ());
1047 cleanup_cfg (CLEANUP_EXPENSIVE
);
1048 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1051 close_dump_file (DFI_bypass
, print_rtl_with_bb
, get_insns ());
1052 timevar_pop (TV_BYPASS
);
1056 #ifdef ENABLE_CHECKING
1057 verify_flow_info ();
1061 /* Try combining insns through substitution. */
1063 rest_of_handle_combine (void)
1065 int rebuild_jump_labels_after_combine
= 0;
1067 timevar_push (TV_COMBINE
);
1068 open_dump_file (DFI_combine
, current_function_decl
);
1070 rebuild_jump_labels_after_combine
1071 = combine_instructions (get_insns (), max_reg_num ());
1073 /* Combining insns may have turned an indirect jump into a
1074 direct jump. Rebuild the JUMP_LABEL fields of jumping
1076 if (rebuild_jump_labels_after_combine
)
1078 timevar_push (TV_JUMP
);
1079 rebuild_jump_labels (get_insns ());
1080 timevar_pop (TV_JUMP
);
1082 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_UPDATE_LIFE
);
1085 close_dump_file (DFI_combine
, print_rtl_with_bb
, get_insns ());
1086 timevar_pop (TV_COMBINE
);
1091 /* Perform life analysis. */
1093 rest_of_handle_life (void)
1095 open_dump_file (DFI_life
, current_function_decl
);
1098 #ifdef ENABLE_CHECKING
1099 verify_flow_info ();
1101 life_analysis (dump_file
, PROP_FINAL
);
1103 cleanup_cfg ((optimize
? CLEANUP_EXPENSIVE
: 0) | CLEANUP_UPDATE_LIFE
1105 | (flag_thread_jumps
? CLEANUP_THREADING
: 0));
1109 setjmp_vars_warning (DECL_INITIAL (current_function_decl
));
1110 setjmp_args_warning ();
1115 if (!flag_new_regalloc
&& initialize_uninitialized_subregs ())
1117 /* Insns were inserted, and possibly pseudos created, so
1118 things might look a bit different. */
1119 allocate_reg_life_data ();
1120 update_life_info (NULL
, UPDATE_LIFE_GLOBAL_RM_NOTES
,
1121 PROP_LOG_LINKS
| PROP_REG_INFO
| PROP_DEATH_NOTES
);
1127 close_dump_file (DFI_life
, print_rtl_with_bb
, get_insns ());
1132 /* Perform common subexpression elimination. Nonzero value from
1133 `cse_main' means that jumps were simplified and some code may now
1134 be unreachable, so do jump optimization again. */
1136 rest_of_handle_cse (void)
1140 open_dump_file (DFI_cse
, current_function_decl
);
1142 dump_flow_info (dump_file
);
1143 timevar_push (TV_CSE
);
1145 reg_scan (get_insns (), max_reg_num (), 1);
1147 tem
= cse_main (get_insns (), max_reg_num (), 0, dump_file
);
1149 rebuild_jump_labels (get_insns ());
1150 if (purge_all_dead_edges (0))
1151 delete_unreachable_blocks ();
1153 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1155 /* If we are not running more CSE passes, then we are no longer
1156 expecting CSE to be run. But always rerun it in a cheap mode. */
1157 cse_not_expected
= !flag_rerun_cse_after_loop
&& !flag_gcse
;
1159 if (tem
|| optimize
> 1)
1160 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_PRE_LOOP
);
1162 timevar_pop (TV_CSE
);
1163 close_dump_file (DFI_cse
, print_rtl_with_bb
, get_insns ());
1168 /* Run second CSE pass after loop optimizations. */
1170 rest_of_handle_cse2 (void)
1174 timevar_push (TV_CSE2
);
1175 open_dump_file (DFI_cse2
, current_function_decl
);
1177 dump_flow_info (dump_file
);
1178 /* CFG is no longer maintained up-to-date. */
1179 tem
= cse_main (get_insns (), max_reg_num (), 1, dump_file
);
1181 /* Run a pass to eliminate duplicated assignments to condition code
1182 registers. We have to run this after bypass_jumps, because it
1183 makes it harder for that pass to determine whether a jump can be
1185 cse_condition_code_reg ();
1187 purge_all_dead_edges (0);
1188 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1192 timevar_push (TV_JUMP
);
1193 rebuild_jump_labels (get_insns ());
1194 cleanup_cfg (CLEANUP_EXPENSIVE
);
1195 timevar_pop (TV_JUMP
);
1197 reg_scan (get_insns (), max_reg_num (), 0);
1198 close_dump_file (DFI_cse2
, print_rtl_with_bb
, get_insns ());
1199 timevar_pop (TV_CSE2
);
1204 /* Perform global cse. */
1206 rest_of_handle_gcse (void)
1208 int save_csb
, save_cfj
;
1211 timevar_push (TV_GCSE
);
1212 open_dump_file (DFI_gcse
, current_function_decl
);
1214 tem
= gcse_main (get_insns (), dump_file
);
1215 rebuild_jump_labels (get_insns ());
1216 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1218 save_csb
= flag_cse_skip_blocks
;
1219 save_cfj
= flag_cse_follow_jumps
;
1220 flag_cse_skip_blocks
= flag_cse_follow_jumps
= 0;
1222 /* If -fexpensive-optimizations, re-run CSE to clean up things done
1224 if (flag_expensive_optimizations
)
1226 timevar_push (TV_CSE
);
1227 reg_scan (get_insns (), max_reg_num (), 1);
1228 tem2
= cse_main (get_insns (), max_reg_num (), 0, dump_file
);
1229 purge_all_dead_edges (0);
1230 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1231 timevar_pop (TV_CSE
);
1232 cse_not_expected
= !flag_rerun_cse_after_loop
;
1235 /* If gcse or cse altered any jumps, rerun jump optimizations to clean
1236 things up. Then possibly re-run CSE again. */
1240 timevar_push (TV_JUMP
);
1241 rebuild_jump_labels (get_insns ());
1242 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_PRE_LOOP
);
1243 timevar_pop (TV_JUMP
);
1245 if (flag_expensive_optimizations
)
1247 timevar_push (TV_CSE
);
1248 reg_scan (get_insns (), max_reg_num (), 1);
1249 tem2
= cse_main (get_insns (), max_reg_num (), 0, dump_file
);
1250 purge_all_dead_edges (0);
1251 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1252 timevar_pop (TV_CSE
);
1256 close_dump_file (DFI_gcse
, print_rtl_with_bb
, get_insns ());
1257 timevar_pop (TV_GCSE
);
1260 flag_cse_skip_blocks
= save_csb
;
1261 flag_cse_follow_jumps
= save_cfj
;
1262 #ifdef ENABLE_CHECKING
1263 verify_flow_info ();
1267 /* Move constant computations out of loops. */
1269 rest_of_handle_loop_optimize (void)
1271 int do_unroll
, do_prefetch
;
1273 timevar_push (TV_LOOP
);
1274 delete_dead_jumptables ();
1275 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_PRE_LOOP
);
1276 open_dump_file (DFI_loop
, current_function_decl
);
1278 /* CFG is no longer maintained up-to-date. */
1279 free_bb_for_insn ();
1281 if (flag_unroll_loops
)
1282 do_unroll
= LOOP_AUTO_UNROLL
; /* Having two unrollers is useless. */
1284 do_unroll
= flag_old_unroll_loops
? LOOP_UNROLL
: LOOP_AUTO_UNROLL
;
1285 do_prefetch
= flag_prefetch_loop_arrays
? LOOP_PREFETCH
: 0;
1287 if (flag_rerun_loop_opt
)
1289 cleanup_barriers ();
1291 /* We only want to perform unrolling once. */
1292 loop_optimize (get_insns (), dump_file
, do_unroll
);
1295 /* The first call to loop_optimize makes some instructions
1296 trivially dead. We delete those instructions now in the
1297 hope that doing so will make the heuristics in loop work
1298 better and possibly speed up compilation. */
1299 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1301 /* The regscan pass is currently necessary as the alias
1302 analysis code depends on this information. */
1303 reg_scan (get_insns (), max_reg_num (), 1);
1305 cleanup_barriers ();
1306 loop_optimize (get_insns (), dump_file
, do_unroll
| do_prefetch
);
1308 /* Loop can create trivially dead instructions. */
1309 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1310 find_basic_blocks (get_insns (), max_reg_num (), dump_file
);
1311 close_dump_file (DFI_loop
, print_rtl
, get_insns ());
1312 timevar_pop (TV_LOOP
);
1317 /* Perform loop optimizations. It might be better to do them a bit
1318 sooner, but we want the profile feedback to work more
1321 rest_of_handle_loop2 (void)
1323 struct loops
*loops
;
1326 if (!flag_move_loop_invariants
1327 && !flag_unswitch_loops
1329 && !flag_unroll_loops
1330 && !flag_branch_on_count_reg
)
1333 timevar_push (TV_LOOP
);
1334 open_dump_file (DFI_loop2
, current_function_decl
);
1336 dump_flow_info (dump_file
);
1338 /* Initialize structures for layout changes. */
1339 cfg_layout_initialize (0);
1341 loops
= loop_optimizer_init (dump_file
);
1345 /* The optimizations: */
1346 if (flag_move_loop_invariants
)
1347 move_loop_invariants (loops
);
1349 if (flag_unswitch_loops
)
1350 unswitch_loops (loops
);
1352 if (flag_peel_loops
|| flag_unroll_loops
)
1353 unroll_and_peel_loops (loops
,
1354 (flag_peel_loops
? UAP_PEEL
: 0) |
1355 (flag_unroll_loops
? UAP_UNROLL
: 0) |
1356 (flag_unroll_all_loops
? UAP_UNROLL_ALL
: 0));
1358 #ifdef HAVE_doloop_end
1359 if (flag_branch_on_count_reg
&& HAVE_doloop_end
)
1360 doloop_optimize_loops (loops
);
1361 #endif /* HAVE_doloop_end */
1363 loop_optimizer_finalize (loops
, dump_file
);
1366 free_dominance_info (CDI_DOMINATORS
);
1368 /* Finalize layout changes. */
1370 if (bb
->next_bb
!= EXIT_BLOCK_PTR
)
1371 bb
->rbi
->next
= bb
->next_bb
;
1372 cfg_layout_finalize ();
1374 cleanup_cfg (CLEANUP_EXPENSIVE
);
1375 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1376 reg_scan (get_insns (), max_reg_num (), 0);
1378 dump_flow_info (dump_file
);
1379 close_dump_file (DFI_loop2
, print_rtl_with_bb
, get_insns ());
1380 timevar_pop (TV_LOOP
);
1385 rest_of_handle_branch_target_load_optimize (void)
1387 static int warned
= 0;
1389 /* Leave this a warning for now so that it is possible to experiment
1390 with running this pass twice. In 3.6, we should either make this
1391 an error, or use separate dump files. */
1392 if (flag_branch_target_load_optimize
1393 && flag_branch_target_load_optimize2
1396 warning ("branch target register load optimization is not intended "
1402 open_dump_file (DFI_branch_target_load
, current_function_decl
);
1403 branch_target_load_optimize (epilogue_completed
);
1404 close_dump_file (DFI_branch_target_load
, print_rtl_with_bb
, get_insns ());
1408 #ifdef OPTIMIZE_MODE_SWITCHING
1410 rest_of_handle_mode_switching (void)
1412 timevar_push (TV_MODE_SWITCH
);
1415 optimize_mode_switching (NULL
);
1418 timevar_pop (TV_MODE_SWITCH
);
1423 rest_of_handle_jump (void)
1427 timevar_push (TV_JUMP
);
1428 open_dump_file (DFI_sibling
, current_function_decl
);
1430 /* ??? We may get caled either via tree_rest_of_compilation when the CFG
1431 is already built or directly (for instance from coverage code).
1432 The direct callers shall be updated. */
1433 if (!basic_block_info
)
1436 rebuild_jump_labels (get_insns ());
1437 find_exception_handler_labels ();
1438 find_basic_blocks (get_insns (), max_reg_num (), dump_file
);
1441 /* ??? We may get called either via tree_rest_of_compilation when the CFG
1442 is already built or directly (for instance from coverage code).
1443 The direct callers shall be updated. */
1444 if (!basic_block_info
)
1447 rebuild_jump_labels (get_insns ());
1448 find_exception_handler_labels ();
1449 find_basic_blocks (get_insns (), max_reg_num (), dump_file
);
1451 delete_unreachable_blocks ();
1452 #ifdef ENABLE_CHECKING
1453 verify_flow_info ();
1455 timevar_pop (TV_JUMP
);
1459 rest_of_handle_eh (void)
1461 insn_locators_initialize ();
1462 /* Complete generation of exception handling code. */
1465 timevar_push (TV_JUMP
);
1466 open_dump_file (DFI_eh
, current_function_decl
);
1468 cleanup_cfg (CLEANUP_PRE_LOOP
| CLEANUP_NO_INSN_DEL
);
1470 finish_eh_generation ();
1472 cleanup_cfg (CLEANUP_PRE_LOOP
| CLEANUP_NO_INSN_DEL
);
1474 close_dump_file (DFI_eh
, print_rtl
, get_insns ());
1475 timevar_pop (TV_JUMP
);
1481 rest_of_handle_prologue_epilogue (void)
1483 if (optimize
&& !flow2_completed
)
1484 cleanup_cfg (CLEANUP_EXPENSIVE
);
1486 /* On some machines, the prologue and epilogue code, or parts thereof,
1487 can be represented as RTL. Doing so lets us schedule insns between
1488 it and the rest of the code and also allows delayed branch
1489 scheduling to operate in the epilogue. */
1490 thread_prologue_and_epilogue_insns (get_insns ());
1491 epilogue_completed
= 1;
1493 if (optimize
&& flow2_completed
)
1494 life_analysis (dump_file
, PROP_POSTRELOAD
);
1498 rest_of_handle_stack_adjustments (void)
1500 life_analysis (dump_file
, PROP_POSTRELOAD
);
1501 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_UPDATE_LIFE
1502 | (flag_crossjumping
? CLEANUP_CROSSJUMP
: 0));
1504 /* This is kind of a heuristic. We need to run combine_stack_adjustments
1505 even for machines with possibly nonzero RETURN_POPS_ARGS
1506 and ACCUMULATE_OUTGOING_ARGS. We expect that only ports having
1507 push instructions will have popping returns. */
1508 #ifndef PUSH_ROUNDING
1509 if (!ACCUMULATE_OUTGOING_ARGS
)
1511 combine_stack_adjustments ();
1515 rest_of_handle_flow2 (void)
1517 timevar_push (TV_FLOW2
);
1518 open_dump_file (DFI_flow2
, current_function_decl
);
1520 /* Re-create the death notes which were deleted during reload. */
1521 #ifdef ENABLE_CHECKING
1522 verify_flow_info ();
1525 /* If optimizing, then go ahead and split insns now. */
1529 split_all_insns (0);
1531 if (flag_branch_target_load_optimize
)
1532 rest_of_handle_branch_target_load_optimize ();
1534 if (!targetm
.late_rtl_prologue_epilogue
)
1535 rest_of_handle_prologue_epilogue ();
1538 rest_of_handle_stack_adjustments ();
1540 flow2_completed
= 1;
1542 close_dump_file (DFI_flow2
, print_rtl_with_bb
, get_insns ());
1543 timevar_pop (TV_FLOW2
);
1550 rest_of_handle_jump2 (void)
1552 open_dump_file (DFI_jump
, current_function_decl
);
1554 /* Always do one jump optimization pass to ensure that JUMP_LABEL fields
1555 are initialized and to compute whether control can drop off the end
1558 timevar_push (TV_JUMP
);
1559 /* Turn NOTE_INSN_EXPECTED_VALUE into REG_BR_PROB. Do this
1560 before jump optimization switches branch directions. */
1561 if (flag_guess_branch_prob
)
1562 expected_value_to_br_prob ();
1564 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1565 reg_scan (get_insns (), max_reg_num (), 0);
1567 dump_flow_info (dump_file
);
1568 cleanup_cfg ((optimize
? CLEANUP_EXPENSIVE
: 0) | CLEANUP_PRE_LOOP
1569 | (flag_thread_jumps
? CLEANUP_THREADING
: 0));
1571 create_loop_notes ();
1573 purge_line_number_notes (get_insns ());
1576 cleanup_cfg (CLEANUP_EXPENSIVE
| CLEANUP_PRE_LOOP
);
1578 /* Jump optimization, and the removal of NULL pointer checks, may
1579 have reduced the number of instructions substantially. CSE, and
1580 future passes, allocate arrays whose dimensions involve the
1581 maximum instruction UID, so if we can reduce the maximum UID
1582 we'll save big on memory. */
1583 renumber_insns (dump_file
);
1585 close_dump_file (DFI_jump
, print_rtl_with_bb
, get_insns ());
1586 timevar_pop (TV_JUMP
);
1591 #ifdef HAVE_peephole2
1593 rest_of_handle_peephole2 (void)
1595 timevar_push (TV_PEEPHOLE2
);
1596 open_dump_file (DFI_peephole2
, current_function_decl
);
1598 peephole2_optimize (dump_file
);
1600 close_dump_file (DFI_peephole2
, print_rtl_with_bb
, get_insns ());
1601 timevar_pop (TV_PEEPHOLE2
);
1606 rest_of_handle_postreload (void)
1608 timevar_push (TV_RELOAD_CSE_REGS
);
1609 open_dump_file (DFI_postreload
, current_function_decl
);
1611 /* Do a very simple CSE pass over just the hard registers. */
1612 reload_cse_regs (get_insns ());
1613 /* reload_cse_regs can eliminate potentially-trapping MEMs.
1614 Remove any EH edges associated with them. */
1615 if (flag_non_call_exceptions
)
1616 purge_all_dead_edges (0);
1618 close_dump_file (DFI_postreload
, print_rtl_with_bb
, get_insns ());
1619 timevar_pop (TV_RELOAD_CSE_REGS
);
1623 rest_of_handle_shorten_branches (void)
1625 /* Shorten branches. */
1626 timevar_push (TV_SHORTEN_BRANCH
);
1627 shorten_branches (get_insns ());
1628 timevar_pop (TV_SHORTEN_BRANCH
);
1632 rest_of_clean_state (void)
1634 coverage_end_function ();
1636 /* In case the function was not output,
1637 don't leave any temporary anonymous types
1638 queued up for sdb output. */
1639 #ifdef SDB_DEBUGGING_INFO
1640 if (write_symbols
== SDB_DEBUG
)
1641 sdbout_types (NULL_TREE
);
1644 reload_completed
= 0;
1645 epilogue_completed
= 0;
1646 flow2_completed
= 0;
1649 timevar_push (TV_FINAL
);
1651 /* Clear out the insn_length contents now that they are no
1653 init_insn_lengths ();
1655 /* Show no temporary slots allocated. */
1658 free_basic_block_vars ();
1659 free_bb_for_insn ();
1661 timevar_pop (TV_FINAL
);
1663 if (targetm
.binds_local_p (current_function_decl
))
1665 int pref
= cfun
->preferred_stack_boundary
;
1666 if (cfun
->recursive_call_emit
1667 && cfun
->stack_alignment_needed
> cfun
->preferred_stack_boundary
)
1668 pref
= cfun
->stack_alignment_needed
;
1669 cgraph_rtl_info (current_function_decl
)->preferred_incoming_stack_boundary
1673 /* Make sure volatile mem refs aren't considered valid operands for
1674 arithmetic insns. We must call this here if this is a nested inline
1675 function, since the above code leaves us in the init_recog state
1676 (from final.c), and the function context push/pop code does not
1677 save/restore volatile_ok.
1679 ??? Maybe it isn't necessary for expand_start_function to call this
1680 anymore if we do it here? */
1682 init_recog_no_volatile ();
1684 /* We're done with this function. Free up memory if we can. */
1685 free_after_parsing (cfun
);
1689 /* This function is called from the pass manager in tree-optimize.c
1690 after all tree passes have finished for a single function, and we
1691 have expanded the function body from trees to RTL.
1692 Once we are here, we have decided that we're supposed to output
1693 that function, ie. that we should write assembler code for it.
1695 We run a series of low-level passes here on the function's RTL
1696 representation. Each pass is called via a rest_of_* function. */
1699 rest_of_compilation (void)
1701 /* There's no need to defer outputting this function any more; we
1702 know we want to output it. */
1703 DECL_DEFER_OUTPUT (current_function_decl
) = 0;
1705 /* Now that we're done expanding trees to RTL, we shouldn't have any
1706 more CONCATs anywhere. */
1707 generating_concat_p
= 0;
1709 /* When processing delayed functions, prepare_function_start () won't
1710 have been run to re-initialize it. */
1711 cse_not_expected
= ! optimize
;
1713 finalize_block_changes ();
1715 /* Dump the rtl code if we are dumping rtl. */
1716 if (open_dump_file (DFI_rtl
, current_function_decl
))
1717 close_dump_file (DFI_rtl
, print_rtl
, get_insns ());
1719 /* Convert from NOTE_INSN_EH_REGION style notes, and do other
1720 sorts of eh initialization. Delay this until after the
1721 initial rtl dump so that we can see the original nesting. */
1722 convert_from_eh_region_ranges ();
1724 /* If we're emitting a nested function, make sure its parent gets
1725 emitted as well. Doing otherwise confuses debug info. */
1728 for (parent
= DECL_CONTEXT (current_function_decl
);
1729 parent
!= NULL_TREE
;
1730 parent
= get_containing_scope (parent
))
1731 if (TREE_CODE (parent
) == FUNCTION_DECL
)
1732 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent
)) = 1;
1735 /* We are now committed to emitting code for this function. Do any
1736 preparation, such as emitting abstract debug info for the inline
1737 before it gets mangled by optimization. */
1738 if (cgraph_function_possibly_inlined_p (current_function_decl
))
1739 (*debug_hooks
->outlining_inline_function
) (current_function_decl
);
1741 /* Remove any notes we don't need. That will make iterating
1742 over the instruction sequence faster, and allow the garbage
1743 collector to reclaim the memory used by the notes. */
1744 remove_unnecessary_notes ();
1746 /* Initialize some variables used by the optimizers. */
1747 init_function_for_compilation ();
1749 TREE_ASM_WRITTEN (current_function_decl
) = 1;
1751 /* Early return if there were errors. We can run afoul of our
1752 consistency checks, and there's not really much point in fixing them. */
1753 if (rtl_dump_and_exit
|| flag_syntax_only
|| errorcount
|| sorrycount
)
1754 goto exit_rest_of_compilation
;
1756 rest_of_handle_jump ();
1758 if (cfun
->tail_call_emit
)
1759 fixup_tail_calls ();
1761 rest_of_handle_eh ();
1763 /* Delay emitting hard_reg_initial_value sets until after EH landing pad
1764 generation, which might create new sets. */
1765 emit_initial_value_sets ();
1768 /* If we are doing position-independent code generation, now
1769 is the time to output special prologues and epilogues.
1770 We do not want to do this earlier, because it just clutters
1771 up inline functions with meaningless insns. */
1776 /* Copy any shared structure that should not be shared. */
1779 #ifdef SETJMP_VIA_SAVE_AREA
1780 /* This must be performed before virtual register instantiation.
1781 Please be aware that everything in the compiler that can look
1782 at the RTL up to this point must understand that REG_SAVE_AREA
1783 is just like a use of the REG contained inside. */
1784 if (current_function_calls_alloca
)
1785 optimize_save_area_alloca ();
1788 /* Instantiate all virtual registers. */
1789 instantiate_virtual_regs ();
1791 rest_of_handle_jump2 ();
1794 rest_of_handle_cse ();
1799 rest_of_handle_gcse ();
1801 if (flag_loop_optimize
)
1802 rest_of_handle_loop_optimize ();
1805 rest_of_handle_jump_bypass ();
1808 timevar_push (TV_FLOW
);
1809 rest_of_handle_cfg ();
1811 if (!flag_tree_based_profiling
1812 && (optimize
> 0 || profile_arc_flag
1813 || flag_test_coverage
|| flag_branch_probabilities
))
1815 rtl_register_profile_hooks ();
1816 rtl_register_value_prof_hooks ();
1817 rest_of_handle_branch_prob ();
1819 if (flag_branch_probabilities
1820 && flag_profile_values
1821 && flag_value_profile_transformations
)
1822 rest_of_handle_value_profile_transformations ();
1824 /* Remove the death notes created for vpt. */
1825 if (flag_profile_values
)
1826 count_or_remove_death_notes (NULL
, 1);
1830 rest_of_handle_if_conversion ();
1832 if (optimize
> 0 && flag_tracer
)
1833 rest_of_handle_tracer ();
1836 && flag_loop_optimize2
)
1837 rest_of_handle_loop2 ();
1839 if (optimize
> 0 && flag_web
)
1840 rest_of_handle_web ();
1842 if (optimize
> 0 && flag_rerun_cse_after_loop
)
1843 rest_of_handle_cse2 ();
1845 cse_not_expected
= 1;
1847 rest_of_handle_life ();
1848 timevar_pop (TV_FLOW
);
1851 rest_of_handle_combine ();
1853 if (optimize
> 0 && flag_if_conversion
)
1854 rest_of_handle_if_after_combine ();
1856 /* The optimization to partition hot/cold basic blocks into separate
1857 sections of the .o file does not work well with exception handling.
1858 Don't call it if there are exceptions. */
1860 if (optimize
> 0 && flag_reorder_blocks_and_partition
&& !flag_exceptions
)
1861 rest_of_handle_partition_blocks ();
1863 if (optimize
> 0 && (flag_regmove
|| flag_expensive_optimizations
))
1864 rest_of_handle_regmove ();
1866 /* Do unconditional splitting before register allocation to allow machine
1867 description to add extra information not needed previously. */
1868 split_all_insns (1);
1870 #ifdef OPTIMIZE_MODE_SWITCHING
1871 rest_of_handle_mode_switching ();
1874 /* Any of the several passes since flow1 will have munged register
1875 lifetime data a bit. We need it to be up to date for scheduling
1876 (see handling of reg_known_equiv in init_alias_analysis). */
1877 recompute_reg_usage (get_insns (), !optimize_size
);
1879 #ifdef INSN_SCHEDULING
1880 if (optimize
> 0 && flag_modulo_sched
)
1881 rest_of_handle_sms ();
1883 if (flag_schedule_insns
)
1884 rest_of_handle_sched ();
1887 /* Determine if the current function is a leaf before running reload
1888 since this can impact optimizations done by the prologue and
1889 epilogue thus changing register elimination offsets. */
1890 current_function_is_leaf
= leaf_function_p ();
1892 if (flag_new_regalloc
)
1894 if (rest_of_handle_new_regalloc ())
1895 goto exit_rest_of_compilation
;
1899 if (rest_of_handle_old_regalloc ())
1900 goto exit_rest_of_compilation
;
1904 rest_of_handle_postreload ();
1906 if (optimize
> 0 && flag_gcse_after_reload
)
1907 rest_of_handle_gcse2 ();
1909 rest_of_handle_flow2 ();
1911 #ifdef HAVE_peephole2
1912 if (optimize
> 0 && flag_peephole2
)
1913 rest_of_handle_peephole2 ();
1917 rest_of_handle_if_after_reload ();
1921 if (flag_rename_registers
|| flag_cprop_registers
)
1922 rest_of_handle_regrename ();
1924 rest_of_handle_reorder_blocks ();
1927 if (flag_branch_target_load_optimize2
)
1928 rest_of_handle_branch_target_load_optimize ();
1930 #ifdef LEAF_REGISTERS
1931 current_function_uses_only_leaf_regs
1932 = optimize
> 0 && only_leaf_regs_used () && leaf_function_p ();
1935 if (targetm
.late_rtl_prologue_epilogue
)
1936 rest_of_handle_prologue_epilogue ();
1938 #ifdef INSN_SCHEDULING
1939 if (optimize
> 0 && flag_schedule_insns_after_reload
)
1940 rest_of_handle_sched2 ();
1944 rest_of_handle_stack_regs ();
1947 compute_alignments ();
1949 if (flag_var_tracking
)
1950 rest_of_handle_variable_tracking ();
1952 /* CFG is no longer maintained up-to-date. */
1953 free_bb_for_insn ();
1955 if (targetm
.machine_dependent_reorg
!= 0)
1956 rest_of_handle_machine_reorg ();
1958 purge_line_number_notes (get_insns ());
1959 cleanup_barriers ();
1962 if (flag_delayed_branch
)
1963 rest_of_handle_delay_slots ();
1966 #if defined (HAVE_ATTR_length) && !defined (STACK_REGS)
1967 timevar_push (TV_SHORTEN_BRANCH
);
1968 split_all_insns_noflow ();
1969 timevar_pop (TV_SHORTEN_BRANCH
);
1972 convert_to_eh_region_ranges ();
1974 rest_of_handle_shorten_branches ();
1976 set_nothrow_function_flags ();
1978 rest_of_handle_final ();
1980 exit_rest_of_compilation
:
1982 rest_of_clean_state ();
1986 init_optimization_passes (void)
1988 open_dump_file (DFI_cgraph
, NULL
);
1989 cgraph_dump_file
= dump_file
;
1994 finish_optimization_passes (void)
1996 timevar_push (TV_DUMP
);
1997 if (profile_arc_flag
|| flag_test_coverage
|| flag_branch_probabilities
)
1999 open_dump_file (DFI_bp
, NULL
);
2001 close_dump_file (DFI_bp
, NULL
, NULL_RTX
);
2004 if (optimize
> 0 && open_dump_file (DFI_combine
, NULL
))
2006 dump_combine_total_stats (dump_file
);
2007 close_dump_file (DFI_combine
, NULL
, NULL_RTX
);
2010 dump_file
= cgraph_dump_file
;
2011 cgraph_dump_file
= NULL
;
2012 close_dump_file (DFI_cgraph
, NULL
, NULL_RTX
);
2014 /* Do whatever is necessary to finish printing the graphs. */
2015 if (graph_dump_format
!= no_graph
)
2019 for (i
= 0; i
< (int) DFI_MAX
; ++i
)
2020 if (dump_file_tbl
[i
].initialized
&& dump_file_tbl
[i
].graph_dump_p
)
2025 sprintf (seq
, DUMPFILE_FORMAT
, i
);
2026 suffix
= concat (seq
, dump_file_tbl
[i
].extension
, NULL
);
2027 finish_graph_dump_file (dump_base_name
, suffix
);
2032 timevar_pop (TV_DUMP
);
2036 enable_rtl_dump_file (int letter
)
2038 bool matched
= false;
2043 for (i
= 0; i
< (int) DFI_MAX
; ++i
)
2044 dump_file_tbl
[i
].enabled
= 1;
2049 for (i
= 0; i
< (int) DFI_MAX
; ++i
)
2050 if (letter
== dump_file_tbl
[i
].debug_switch
)
2052 dump_file_tbl
[i
].enabled
= 1;
2060 struct tree_opt_pass pass_rest_of_compilation
=
2062 "rest of compilation", /* name */
2064 rest_of_compilation
, /* execute */
2067 0, /* static_pass_number */
2068 TV_REST_OF_COMPILATION
, /* tv_id */
2069 PROP_rtl
, /* properties_required */
2070 0, /* properties_provided */
2071 PROP_rtl
, /* properties_destroyed */
2072 0, /* todo_flags_start */
2073 TODO_ggc_collect
/* todo_flags_finish */