PR optimization/15242
[official-gcc.git] / gcc / passes.c
blob723656f4cd85d7e17db8b0648bf60769cf6127c7
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, 2005 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
10 version.
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
15 for more details.
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
20 02111-1307, USA. */
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. */
27 #include "config.h"
28 #undef FLOAT /* This is for hpux. They should change hpux. */
29 #undef FFS /* Some systems define this in param.h. */
30 #include "system.h"
31 #include "coretypes.h"
32 #include "tm.h"
33 #include <signal.h>
35 #ifdef HAVE_SYS_RESOURCE_H
36 # include <sys/resource.h>
37 #endif
39 #ifdef HAVE_SYS_TIMES_H
40 # include <sys/times.h>
41 #endif
43 #include "line-map.h"
44 #include "input.h"
45 #include "tree.h"
46 #include "rtl.h"
47 #include "tm_p.h"
48 #include "flags.h"
49 #include "insn-attr.h"
50 #include "insn-config.h"
51 #include "insn-flags.h"
52 #include "hard-reg-set.h"
53 #include "recog.h"
54 #include "output.h"
55 #include "except.h"
56 #include "function.h"
57 #include "toplev.h"
58 #include "expr.h"
59 #include "basic-block.h"
60 #include "intl.h"
61 #include "ggc.h"
62 #include "graph.h"
63 #include "regs.h"
64 #include "timevar.h"
65 #include "diagnostic.h"
66 #include "params.h"
67 #include "reload.h"
68 #include "dwarf2asm.h"
69 #include "integrate.h"
70 #include "real.h"
71 #include "debug.h"
72 #include "target.h"
73 #include "langhooks.h"
74 #include "cfglayout.h"
75 #include "cfgloop.h"
76 #include "hosthooks.h"
77 #include "cgraph.h"
78 #include "opts.h"
79 #include "coverage.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"
87 #endif
89 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
90 #include "dbxout.h"
91 #endif
93 #ifdef SDB_DEBUGGING_INFO
94 #include "sdbout.h"
95 #endif
97 #ifdef XCOFF_DEBUGGING_INFO
98 #include "xcoffout.h" /* Needed for external data
99 declarations for e.g. AIX 4.x. */
100 #endif
102 #ifndef HAVE_conditional_execution
103 #define HAVE_conditional_execution 0
104 #endif
106 /* Format to use to print dumpfile index value */
107 #ifndef DUMPFILE_FORMAT
108 #define DUMPFILE_FORMAT ".%02d."
109 #endif
111 static int initializing_dump = 0;
113 /* Routine to open a dump file. Return true if the dump file is enabled. */
115 static int
116 open_dump_file (enum tree_dump_index index, tree decl)
118 if (! dump_enabled_p (index))
119 return 0;
121 timevar_push (TV_DUMP);
123 if (dump_file != NULL || dump_file_name != NULL)
124 abort ();
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);
133 if (decl)
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
137 ? " (hot)"
138 : cfun->function_frequency == FUNCTION_FREQUENCY_UNLIKELY_EXECUTED
139 ? " (unlikely executed)"
140 : "");
142 timevar_pop (TV_DUMP);
143 return 1;
146 /* Routine to close a dump file. */
148 static void
149 close_dump_file (enum tree_dump_index index,
150 void (*func) (FILE *, rtx),
151 rtx insns)
153 if (! dump_file)
154 return;
156 timevar_push (TV_DUMP);
157 if (insns
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);
167 if (func && insns)
168 func (dump_file, insns);
170 dump_end (index, dump_file);
171 free ((char *) dump_file_name);
173 dump_file = NULL;
174 dump_file_name = NULL;
175 timevar_pop (TV_DUMP);
178 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
179 and TYPE_DECL nodes.
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. */
190 void
191 rest_of_decl_compilation (tree decl,
192 int top_level,
193 int at_end)
195 /* We deferred calling assemble_alias so that we could collect
196 other attributes such as visibility. Emit the alias now. */
198 tree alias;
199 alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl));
200 if (alias)
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) */
226 if ((at_end
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);
234 else
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,
242 top_level, at_end);
244 #endif
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. */
258 void
259 rest_of_type_compilation (tree type, int toplev)
261 /* Avoid confusing the debug information machinery when there are
262 errors. */
263 if (errorcount != 0 || sorrycount != 0)
264 return;
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. */
272 static void
273 rest_of_handle_final (void)
275 timevar_push (TV_FINAL);
277 rtx x;
278 const char *fnname;
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);
284 if (!MEM_P (x))
285 abort ();
286 x = XEXP (x, 0);
287 if (GET_CODE (x) != SYMBOL_REF)
288 abort ();
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 ();
300 #endif
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 ();
307 #endif
309 user_defined_section_attribute = false;
311 if (! quiet_flag)
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);
333 ggc_collect ();
334 timevar_pop (TV_FINAL);
337 #ifdef DELAY_SLOTS
338 /* Run delay slot optimization. */
339 static void
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 ());
349 ggc_collect ();
351 timevar_pop (TV_DBR_SCHED);
353 #endif
355 #ifdef STACK_REGS
356 /* Convert register usage from flat register file usage to a stack
357 register file. */
358 static void
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)
368 #else
369 if (optimize)
370 #endif
372 timevar_push (TV_SHORTEN_BRANCH);
373 split_all_insns (1);
374 timevar_pop (TV_SHORTEN_BRANCH);
376 #endif
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 ());
394 ggc_collect ();
395 timevar_pop (TV_REG_STACK);
397 #endif
399 /* Track the variables, i.e. compute where the variable is stored at each position in function. */
400 static void
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. */
413 static void
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 ());
423 ggc_collect ();
424 timevar_pop (TV_MACH_DEP);
428 /* Run old register allocator. Return TRUE if we must exit
429 rest_of_compilation upon return. */
430 static bool
431 rest_of_handle_old_regalloc (void)
433 int failure;
434 int rebuild_notes;
436 timevar_push (TV_LOCAL_ALLOC);
437 open_dump_file (DFI_lreg, current_function_decl);
439 /* Allocate the reg_renumber array. */
440 allocate_reg_info (max_regno, FALSE, TRUE);
442 /* And the reg_equiv_memory_loc array. */
443 VARRAY_GROW (reg_equiv_memory_loc_varray, max_regno);
444 reg_equiv_memory_loc = &VARRAY_RTX (reg_equiv_memory_loc_varray, 0);
446 allocate_initial_values (reg_equiv_memory_loc);
448 regclass (get_insns (), max_reg_num (), dump_file);
449 rebuild_notes = local_alloc ();
451 timevar_pop (TV_LOCAL_ALLOC);
453 /* Local allocation may have turned an indirect jump into a direct
454 jump. If so, we must rebuild the JUMP_LABEL fields of jumping
455 instructions. */
456 if (rebuild_notes)
458 timevar_push (TV_JUMP);
460 rebuild_jump_labels (get_insns ());
461 purge_all_dead_edges (0);
462 delete_unreachable_blocks ();
464 timevar_pop (TV_JUMP);
467 if (dump_enabled_p (DFI_lreg))
469 timevar_push (TV_DUMP);
470 dump_flow_info (dump_file);
471 dump_local_alloc (dump_file);
472 timevar_pop (TV_DUMP);
475 close_dump_file (DFI_lreg, print_rtl_with_bb, get_insns ());
477 ggc_collect ();
479 timevar_push (TV_GLOBAL_ALLOC);
480 open_dump_file (DFI_greg, current_function_decl);
482 /* If optimizing, allocate remaining pseudo-regs. Do the reload
483 pass fixing up any insns that are invalid. */
485 if (optimize)
486 failure = global_alloc (dump_file);
487 else
489 build_insn_chain (get_insns ());
490 failure = reload (get_insns (), 0);
493 if (dump_enabled_p (DFI_greg))
495 timevar_push (TV_DUMP);
496 dump_global_regs (dump_file);
497 timevar_pop (TV_DUMP);
499 close_dump_file (DFI_greg, print_rtl_with_bb, get_insns ());
502 ggc_collect ();
504 timevar_pop (TV_GLOBAL_ALLOC);
506 return failure;
509 /* Run the regrename and cprop passes. */
510 static void
511 rest_of_handle_regrename (void)
513 timevar_push (TV_RENAME_REGISTERS);
514 open_dump_file (DFI_rnreg, current_function_decl);
516 if (flag_rename_registers)
517 regrename_optimize ();
518 if (flag_cprop_registers)
519 copyprop_hardreg_forward ();
521 close_dump_file (DFI_rnreg, print_rtl_with_bb, get_insns ());
522 timevar_pop (TV_RENAME_REGISTERS);
525 /* Reorder basic blocks. */
526 static void
527 rest_of_handle_reorder_blocks (void)
529 bool changed;
530 unsigned int liveness_flags;
532 open_dump_file (DFI_bbro, current_function_decl);
534 /* Last attempt to optimize CFG, as scheduling, peepholing and insn
535 splitting possibly introduced more crossjumping opportunities. */
536 liveness_flags = (!HAVE_conditional_execution ? CLEANUP_UPDATE_LIFE : 0);
537 changed = cleanup_cfg (CLEANUP_EXPENSIVE | liveness_flags);
539 if (flag_sched2_use_traces && flag_schedule_insns_after_reload)
540 tracer (liveness_flags);
541 if (flag_reorder_blocks || flag_reorder_blocks_and_partition)
542 reorder_basic_blocks (liveness_flags);
543 if (flag_reorder_blocks || flag_reorder_blocks_and_partition
544 || (flag_sched2_use_traces && flag_schedule_insns_after_reload))
545 changed |= cleanup_cfg (CLEANUP_EXPENSIVE | liveness_flags);
547 /* On conditional execution targets we can not update the life cheaply, so
548 we deffer the updating to after both cleanups. This may lose some cases
549 but should not be terribly bad. */
550 if (changed && HAVE_conditional_execution)
551 update_life_info (NULL, UPDATE_LIFE_GLOBAL_RM_NOTES,
552 PROP_DEATH_NOTES);
553 close_dump_file (DFI_bbro, print_rtl_with_bb, get_insns ());
556 /* Partition hot and cold basic blocks. */
557 static void
558 rest_of_handle_partition_blocks (void)
560 no_new_pseudos = 0;
561 partition_hot_cold_basic_blocks ();
562 allocate_reg_life_data ();
563 update_life_info (NULL, UPDATE_LIFE_GLOBAL_RM_NOTES,
564 PROP_LOG_LINKS | PROP_REG_INFO | PROP_DEATH_NOTES);
565 no_new_pseudos = 1;
568 #ifdef INSN_SCHEDULING
569 /* Run instruction scheduler. */
570 /* Perform SMS module scheduling. */
571 static void
572 rest_of_handle_sms (void)
574 timevar_push (TV_SMS);
575 open_dump_file (DFI_sms, current_function_decl);
577 /* We want to be able to create new pseudos. */
578 no_new_pseudos = 0;
579 sms_schedule (dump_file);
580 close_dump_file (DFI_sms, print_rtl, get_insns ());
583 /* Update the life information, because we add pseudos. */
584 max_regno = max_reg_num ();
585 allocate_reg_info (max_regno, FALSE, FALSE);
586 update_life_info_in_dirty_blocks (UPDATE_LIFE_GLOBAL_RM_NOTES,
587 (PROP_DEATH_NOTES
588 | PROP_KILL_DEAD_CODE
589 | PROP_SCAN_DEAD_CODE));
590 no_new_pseudos = 1;
592 ggc_collect ();
593 timevar_pop (TV_SMS);
596 /* Run instruction scheduler. */
597 static void
598 rest_of_handle_sched (void)
600 timevar_push (TV_SCHED);
602 /* Print function header into sched dump now
603 because doing the sched analysis makes some of the dump. */
604 open_dump_file (DFI_sched, current_function_decl);
606 /* Do control and data sched analysis,
607 and write some of the results to dump file. */
609 schedule_insns (dump_file);
611 close_dump_file (DFI_sched, print_rtl_with_bb, get_insns ());
613 ggc_collect ();
614 timevar_pop (TV_SCHED);
617 /* Run second scheduling pass after reload. */
618 static void
619 rest_of_handle_sched2 (void)
621 timevar_push (TV_SCHED2);
622 open_dump_file (DFI_sched2, current_function_decl);
624 /* Do control and data sched analysis again,
625 and write some more of the results to dump file. */
627 split_all_insns (1);
629 if (flag_sched2_use_superblocks || flag_sched2_use_traces)
631 schedule_ebbs (dump_file);
632 /* No liveness updating code yet, but it should be easy to do.
633 reg-stack recomputes the liveness when needed for now. */
634 count_or_remove_death_notes (NULL, 1);
635 cleanup_cfg (CLEANUP_EXPENSIVE);
637 else
638 schedule_insns (dump_file);
640 close_dump_file (DFI_sched2, print_rtl_with_bb, get_insns ());
642 ggc_collect ();
644 timevar_pop (TV_SCHED2);
646 #endif
648 static void
649 rest_of_handle_gcse2 (void)
651 timevar_push (TV_GCSE_AFTER_RELOAD);
652 open_dump_file (DFI_gcse2, current_function_decl);
654 gcse_after_reload_main (get_insns ());
655 rebuild_jump_labels (get_insns ());
656 delete_trivially_dead_insns (get_insns (), max_reg_num ());
657 close_dump_file (DFI_gcse2, print_rtl_with_bb, get_insns ());
659 ggc_collect ();
661 #ifdef ENABLE_CHECKING
662 verify_flow_info ();
663 #endif
665 timevar_pop (TV_GCSE_AFTER_RELOAD);
668 /* Register allocation pre-pass, to reduce number of moves necessary
669 for two-address machines. */
670 static void
671 rest_of_handle_regmove (void)
673 timevar_push (TV_REGMOVE);
674 open_dump_file (DFI_regmove, current_function_decl);
676 regmove_optimize (get_insns (), max_reg_num (), dump_file);
678 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE);
679 close_dump_file (DFI_regmove, print_rtl_with_bb, get_insns ());
681 ggc_collect ();
682 timevar_pop (TV_REGMOVE);
685 /* Run tracer. */
686 static void
687 rest_of_handle_tracer (void)
689 open_dump_file (DFI_tracer, current_function_decl);
690 if (dump_file)
691 dump_flow_info (dump_file);
692 tracer (0);
693 cleanup_cfg (CLEANUP_EXPENSIVE);
694 reg_scan (get_insns (), max_reg_num ());
695 close_dump_file (DFI_tracer, print_rtl_with_bb, get_insns ());
698 /* If-conversion and CFG cleanup. */
699 static void
700 rest_of_handle_if_conversion (void)
702 timevar_push (TV_IFCVT);
703 open_dump_file (DFI_ce1, current_function_decl);
705 if (flag_if_conversion)
707 if (dump_file)
708 dump_flow_info (dump_file);
709 cleanup_cfg (CLEANUP_EXPENSIVE);
710 reg_scan (get_insns (), max_reg_num ());
711 if_convert (0);
714 timevar_push (TV_JUMP);
715 cleanup_cfg (CLEANUP_EXPENSIVE);
716 reg_scan (get_insns (), max_reg_num ());
717 timevar_pop (TV_JUMP);
719 close_dump_file (DFI_ce1, print_rtl_with_bb, get_insns ());
720 timevar_pop (TV_IFCVT);
723 /* Rerun if-conversion, as combine may have simplified things enough
724 to now meet sequence length restrictions. */
725 static void
726 rest_of_handle_if_after_combine (void)
728 timevar_push (TV_IFCVT);
729 open_dump_file (DFI_ce2, current_function_decl);
731 no_new_pseudos = 0;
732 if_convert (1);
733 no_new_pseudos = 1;
735 close_dump_file (DFI_ce2, print_rtl_with_bb, get_insns ());
736 timevar_pop (TV_IFCVT);
739 static void
740 rest_of_handle_if_after_reload (void)
742 timevar_push (TV_IFCVT2);
743 open_dump_file (DFI_ce3, current_function_decl);
745 /* Last attempt to optimize CFG, as scheduling, peepholing and insn
746 splitting possibly introduced more crossjumping opportunities. */
747 cleanup_cfg (CLEANUP_EXPENSIVE
748 | CLEANUP_UPDATE_LIFE
749 | (flag_crossjumping ? CLEANUP_CROSSJUMP : 0));
750 if (flag_if_conversion2)
751 if_convert (1);
752 close_dump_file (DFI_ce3, print_rtl_with_bb, get_insns ());
753 timevar_pop (TV_IFCVT2);
756 static void
757 rest_of_handle_web (void)
759 open_dump_file (DFI_web, current_function_decl);
760 timevar_push (TV_WEB);
761 web_main ();
762 delete_trivially_dead_insns (get_insns (), max_reg_num ());
763 cleanup_cfg (CLEANUP_EXPENSIVE);
765 timevar_pop (TV_WEB);
766 close_dump_file (DFI_web, print_rtl_with_bb, get_insns ());
767 reg_scan (get_insns (), max_reg_num ());
770 /* Do branch profiling and static profile estimation passes. */
771 static void
772 rest_of_handle_branch_prob (void)
774 struct loops loops;
776 timevar_push (TV_BRANCH_PROB);
777 open_dump_file (DFI_bp, current_function_decl);
779 if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
780 branch_prob ();
782 /* Discover and record the loop depth at the head of each basic
783 block. The loop infrastructure does the real job for us. */
784 flow_loops_find (&loops, LOOP_TREE);
786 if (dump_file)
787 flow_loops_dump (&loops, dump_file, NULL, 0);
789 /* Estimate using heuristics if no profiling info is available. */
790 if (flag_guess_branch_prob)
791 estimate_probability (&loops);
793 flow_loops_free (&loops);
794 free_dominance_info (CDI_DOMINATORS);
795 close_dump_file (DFI_bp, print_rtl_with_bb, get_insns ());
796 timevar_pop (TV_BRANCH_PROB);
799 /* Do optimizations based on expression value profiles. */
800 static void
801 rest_of_handle_value_profile_transformations (void)
803 open_dump_file (DFI_vpt, current_function_decl);
804 timevar_push (TV_VPT);
806 if (value_profile_transformations ())
807 cleanup_cfg (CLEANUP_EXPENSIVE);
809 timevar_pop (TV_VPT);
810 close_dump_file (DFI_vpt, print_rtl_with_bb, get_insns ());
813 /* Do control and data flow analysis; write some of the results to the
814 dump file. */
815 static void
816 rest_of_handle_cfg (void)
818 open_dump_file (DFI_cfg, current_function_decl);
819 if (dump_file)
820 dump_flow_info (dump_file);
821 if (optimize)
822 cleanup_cfg (CLEANUP_EXPENSIVE
823 | (flag_thread_jumps ? CLEANUP_THREADING : 0));
825 /* It may make more sense to mark constant functions after dead code is
826 eliminated by life_analysis, but we need to do it early, as -fprofile-arcs
827 may insert code making function non-constant, but we still must consider
828 it as constant, otherwise -fbranch-probabilities will not read data back.
830 life_analysis rarely eliminates modification of external memory.
832 FIXME: now with tree based profiling we are in the trap described above
833 again. It seems to be easiest to disable the optimization for time
834 being before the problem is either solved by moving the transformation
835 to the IPA level (we need the CFG for this) or the very early optimization
836 passes are made to ignore the const/pure flags so code does not change. */
837 if (optimize
838 && (!flag_tree_based_profiling
839 || (!profile_arc_flag && !flag_branch_probabilities)))
841 /* Alias analysis depends on this information and mark_constant_function
842 depends on alias analysis. */
843 reg_scan (get_insns (), max_reg_num ());
844 mark_constant_function ();
847 close_dump_file (DFI_cfg, print_rtl_with_bb, get_insns ());
850 /* Perform jump bypassing and control flow optimizations. */
851 static void
852 rest_of_handle_jump_bypass (void)
854 timevar_push (TV_BYPASS);
855 open_dump_file (DFI_bypass, current_function_decl);
857 cleanup_cfg (CLEANUP_EXPENSIVE);
858 reg_scan (get_insns (), max_reg_num ());
860 if (bypass_jumps (dump_file))
862 rebuild_jump_labels (get_insns ());
863 cleanup_cfg (CLEANUP_EXPENSIVE);
864 delete_trivially_dead_insns (get_insns (), max_reg_num ());
867 close_dump_file (DFI_bypass, print_rtl_with_bb, get_insns ());
868 timevar_pop (TV_BYPASS);
870 ggc_collect ();
872 #ifdef ENABLE_CHECKING
873 verify_flow_info ();
874 #endif
877 /* Try combining insns through substitution. */
878 static void
879 rest_of_handle_combine (void)
881 int rebuild_jump_labels_after_combine = 0;
883 timevar_push (TV_COMBINE);
884 open_dump_file (DFI_combine, current_function_decl);
886 rebuild_jump_labels_after_combine
887 = combine_instructions (get_insns (), max_reg_num ());
889 /* Combining insns may have turned an indirect jump into a
890 direct jump. Rebuild the JUMP_LABEL fields of jumping
891 instructions. */
892 if (rebuild_jump_labels_after_combine)
894 timevar_push (TV_JUMP);
895 rebuild_jump_labels (get_insns ());
896 timevar_pop (TV_JUMP);
898 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE);
901 close_dump_file (DFI_combine, print_rtl_with_bb, get_insns ());
902 timevar_pop (TV_COMBINE);
904 ggc_collect ();
907 /* Perform life analysis. */
908 static void
909 rest_of_handle_life (void)
911 open_dump_file (DFI_life, current_function_decl);
912 regclass_init ();
914 #ifdef ENABLE_CHECKING
915 verify_flow_info ();
916 #endif
917 life_analysis (dump_file, PROP_FINAL);
918 if (optimize)
919 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE | CLEANUP_LOG_LINKS
920 | (flag_thread_jumps ? CLEANUP_THREADING : 0));
922 if (extra_warnings)
924 setjmp_vars_warning (DECL_INITIAL (current_function_decl));
925 setjmp_args_warning ();
928 if (optimize)
930 if (initialize_uninitialized_subregs ())
932 /* Insns were inserted, and possibly pseudos created, so
933 things might look a bit different. */
934 allocate_reg_life_data ();
935 update_life_info (NULL, UPDATE_LIFE_GLOBAL_RM_NOTES,
936 PROP_LOG_LINKS | PROP_REG_INFO | PROP_DEATH_NOTES);
940 no_new_pseudos = 1;
942 close_dump_file (DFI_life, print_rtl_with_bb, get_insns ());
944 ggc_collect ();
947 /* Perform common subexpression elimination. Nonzero value from
948 `cse_main' means that jumps were simplified and some code may now
949 be unreachable, so do jump optimization again. */
950 static void
951 rest_of_handle_cse (void)
953 int tem;
955 open_dump_file (DFI_cse, current_function_decl);
956 if (dump_file)
957 dump_flow_info (dump_file);
958 timevar_push (TV_CSE);
960 reg_scan (get_insns (), max_reg_num ());
962 tem = cse_main (get_insns (), max_reg_num (), dump_file);
963 if (tem)
964 rebuild_jump_labels (get_insns ());
965 if (purge_all_dead_edges (0))
966 delete_unreachable_blocks ();
968 delete_trivially_dead_insns (get_insns (), max_reg_num ());
970 /* If we are not running more CSE passes, then we are no longer
971 expecting CSE to be run. But always rerun it in a cheap mode. */
972 cse_not_expected = !flag_rerun_cse_after_loop && !flag_gcse;
974 if (tem || optimize > 1)
975 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
977 timevar_pop (TV_CSE);
978 close_dump_file (DFI_cse, print_rtl_with_bb, get_insns ());
980 ggc_collect ();
983 /* Run second CSE pass after loop optimizations. */
984 static void
985 rest_of_handle_cse2 (void)
987 int tem;
989 timevar_push (TV_CSE2);
990 open_dump_file (DFI_cse2, current_function_decl);
991 if (dump_file)
992 dump_flow_info (dump_file);
993 /* CFG is no longer maintained up-to-date. */
994 tem = cse_main (get_insns (), max_reg_num (), dump_file);
996 /* Run a pass to eliminate duplicated assignments to condition code
997 registers. We have to run this after bypass_jumps, because it
998 makes it harder for that pass to determine whether a jump can be
999 bypassed safely. */
1000 cse_condition_code_reg ();
1002 purge_all_dead_edges (0);
1003 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1005 if (tem)
1007 timevar_push (TV_JUMP);
1008 rebuild_jump_labels (get_insns ());
1009 cleanup_cfg (CLEANUP_EXPENSIVE);
1010 timevar_pop (TV_JUMP);
1012 reg_scan (get_insns (), max_reg_num ());
1013 close_dump_file (DFI_cse2, print_rtl_with_bb, get_insns ());
1014 timevar_pop (TV_CSE2);
1016 ggc_collect ();
1019 /* Perform global cse. */
1020 static void
1021 rest_of_handle_gcse (void)
1023 int save_csb, save_cfj;
1024 int tem2 = 0, tem;
1026 timevar_push (TV_GCSE);
1027 open_dump_file (DFI_gcse, current_function_decl);
1029 tem = gcse_main (get_insns (), dump_file);
1030 rebuild_jump_labels (get_insns ());
1031 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1033 save_csb = flag_cse_skip_blocks;
1034 save_cfj = flag_cse_follow_jumps;
1035 flag_cse_skip_blocks = flag_cse_follow_jumps = 0;
1037 /* If -fexpensive-optimizations, re-run CSE to clean up things done
1038 by gcse. */
1039 if (flag_expensive_optimizations)
1041 timevar_push (TV_CSE);
1042 reg_scan (get_insns (), max_reg_num ());
1043 tem2 = cse_main (get_insns (), max_reg_num (), dump_file);
1044 purge_all_dead_edges (0);
1045 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1046 timevar_pop (TV_CSE);
1047 cse_not_expected = !flag_rerun_cse_after_loop;
1050 /* If gcse or cse altered any jumps, rerun jump optimizations to clean
1051 things up. Then possibly re-run CSE again. */
1052 while (tem || tem2)
1054 tem = tem2 = 0;
1055 timevar_push (TV_JUMP);
1056 rebuild_jump_labels (get_insns ());
1057 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
1058 timevar_pop (TV_JUMP);
1060 if (flag_expensive_optimizations)
1062 timevar_push (TV_CSE);
1063 reg_scan (get_insns (), max_reg_num ());
1064 tem2 = cse_main (get_insns (), max_reg_num (), dump_file);
1065 purge_all_dead_edges (0);
1066 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1067 timevar_pop (TV_CSE);
1071 close_dump_file (DFI_gcse, print_rtl_with_bb, get_insns ());
1072 timevar_pop (TV_GCSE);
1074 ggc_collect ();
1075 flag_cse_skip_blocks = save_csb;
1076 flag_cse_follow_jumps = save_cfj;
1077 #ifdef ENABLE_CHECKING
1078 verify_flow_info ();
1079 #endif
1082 /* Move constant computations out of loops. */
1083 static void
1084 rest_of_handle_loop_optimize (void)
1086 int do_prefetch;
1088 timevar_push (TV_LOOP);
1089 delete_dead_jumptables ();
1090 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
1091 open_dump_file (DFI_loop, current_function_decl);
1093 /* CFG is no longer maintained up-to-date. */
1094 free_bb_for_insn ();
1095 profile_status = PROFILE_ABSENT;
1097 do_prefetch = flag_prefetch_loop_arrays ? LOOP_PREFETCH : 0;
1099 if (flag_rerun_loop_opt)
1101 cleanup_barriers ();
1103 /* We only want to perform unrolling once. */
1104 loop_optimize (get_insns (), dump_file, 0);
1106 /* The first call to loop_optimize makes some instructions
1107 trivially dead. We delete those instructions now in the
1108 hope that doing so will make the heuristics in loop work
1109 better and possibly speed up compilation. */
1110 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1112 /* The regscan pass is currently necessary as the alias
1113 analysis code depends on this information. */
1114 reg_scan (get_insns (), max_reg_num ());
1116 cleanup_barriers ();
1117 loop_optimize (get_insns (), dump_file, do_prefetch);
1119 /* Loop can create trivially dead instructions. */
1120 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1121 find_basic_blocks (get_insns (), max_reg_num (), dump_file);
1122 close_dump_file (DFI_loop, print_rtl, get_insns ());
1123 timevar_pop (TV_LOOP);
1125 ggc_collect ();
1128 /* Perform loop optimizations. It might be better to do them a bit
1129 sooner, but we want the profile feedback to work more
1130 efficiently. */
1131 static void
1132 rest_of_handle_loop2 (void)
1134 struct loops *loops;
1135 basic_block bb;
1137 if (!flag_move_loop_invariants
1138 && !flag_unswitch_loops
1139 && !flag_peel_loops
1140 && !flag_unroll_loops
1141 && !flag_branch_on_count_reg)
1142 return;
1144 timevar_push (TV_LOOP);
1145 open_dump_file (DFI_loop2, current_function_decl);
1146 if (dump_file)
1147 dump_flow_info (dump_file);
1149 /* Initialize structures for layout changes. */
1150 cfg_layout_initialize (0);
1152 loops = loop_optimizer_init (dump_file);
1154 if (loops)
1156 /* The optimizations: */
1157 if (flag_move_loop_invariants)
1158 move_loop_invariants (loops);
1160 if (flag_unswitch_loops)
1161 unswitch_loops (loops);
1163 if (flag_peel_loops || flag_unroll_loops)
1164 unroll_and_peel_loops (loops,
1165 (flag_peel_loops ? UAP_PEEL : 0) |
1166 (flag_unroll_loops ? UAP_UNROLL : 0) |
1167 (flag_unroll_all_loops ? UAP_UNROLL_ALL : 0));
1169 #ifdef HAVE_doloop_end
1170 if (flag_branch_on_count_reg && HAVE_doloop_end)
1171 doloop_optimize_loops (loops);
1172 #endif /* HAVE_doloop_end */
1174 loop_optimizer_finalize (loops, dump_file);
1177 free_dominance_info (CDI_DOMINATORS);
1179 /* Finalize layout changes. */
1180 FOR_EACH_BB (bb)
1181 if (bb->next_bb != EXIT_BLOCK_PTR)
1182 bb->rbi->next = bb->next_bb;
1183 cfg_layout_finalize ();
1185 cleanup_cfg (CLEANUP_EXPENSIVE);
1186 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1187 reg_scan (get_insns (), max_reg_num ());
1188 if (dump_file)
1189 dump_flow_info (dump_file);
1190 close_dump_file (DFI_loop2, print_rtl_with_bb, get_insns ());
1191 timevar_pop (TV_LOOP);
1192 ggc_collect ();
1195 static void
1196 rest_of_handle_branch_target_load_optimize (void)
1198 static int warned = 0;
1200 /* Leave this a warning for now so that it is possible to experiment
1201 with running this pass twice. In 3.6, we should either make this
1202 an error, or use separate dump files. */
1203 if (flag_branch_target_load_optimize
1204 && flag_branch_target_load_optimize2
1205 && !warned)
1207 warning ("branch target register load optimization is not intended "
1208 "to be run twice");
1210 warned = 1;
1213 open_dump_file (DFI_branch_target_load, current_function_decl);
1214 branch_target_load_optimize (epilogue_completed);
1215 close_dump_file (DFI_branch_target_load, print_rtl_with_bb, get_insns ());
1216 ggc_collect ();
1219 #ifdef OPTIMIZE_MODE_SWITCHING
1220 static void
1221 rest_of_handle_mode_switching (void)
1223 timevar_push (TV_MODE_SWITCH);
1225 no_new_pseudos = 0;
1226 optimize_mode_switching (NULL);
1227 no_new_pseudos = 1;
1229 timevar_pop (TV_MODE_SWITCH);
1231 #endif
1233 static void
1234 rest_of_handle_jump (void)
1236 ggc_collect ();
1238 timevar_push (TV_JUMP);
1239 open_dump_file (DFI_sibling, current_function_decl);
1241 delete_unreachable_blocks ();
1242 #ifdef ENABLE_CHECKING
1243 verify_flow_info ();
1244 #endif
1246 if (cfun->tail_call_emit)
1247 fixup_tail_calls ();
1249 close_dump_file (DFI_sibling, print_rtl, get_insns ());
1250 timevar_pop (TV_JUMP);
1253 static void
1254 rest_of_handle_eh (void)
1256 insn_locators_initialize ();
1257 /* Complete generation of exception handling code. */
1258 if (doing_eh (0))
1260 timevar_push (TV_JUMP);
1261 open_dump_file (DFI_eh, current_function_decl);
1263 cleanup_cfg (CLEANUP_PRE_LOOP | CLEANUP_NO_INSN_DEL);
1265 finish_eh_generation ();
1267 cleanup_cfg (CLEANUP_PRE_LOOP | CLEANUP_NO_INSN_DEL);
1269 close_dump_file (DFI_eh, print_rtl, get_insns ());
1270 timevar_pop (TV_JUMP);
1274 static void
1275 rest_of_handle_stack_adjustments (void)
1277 life_analysis (dump_file, PROP_POSTRELOAD);
1278 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_UPDATE_LIFE
1279 | (flag_crossjumping ? CLEANUP_CROSSJUMP : 0));
1281 /* This is kind of a heuristic. We need to run combine_stack_adjustments
1282 even for machines with possibly nonzero RETURN_POPS_ARGS
1283 and ACCUMULATE_OUTGOING_ARGS. We expect that only ports having
1284 push instructions will have popping returns. */
1285 #ifndef PUSH_ROUNDING
1286 if (!ACCUMULATE_OUTGOING_ARGS)
1287 #endif
1288 combine_stack_adjustments ();
1291 static void
1292 rest_of_handle_flow2 (void)
1294 timevar_push (TV_FLOW2);
1295 open_dump_file (DFI_flow2, current_function_decl);
1297 /* Re-create the death notes which were deleted during reload. */
1298 #ifdef ENABLE_CHECKING
1299 verify_flow_info ();
1300 #endif
1302 /* If optimizing, then go ahead and split insns now. */
1303 #ifndef STACK_REGS
1304 if (optimize > 0)
1305 #endif
1306 split_all_insns (0);
1308 if (flag_branch_target_load_optimize)
1310 close_dump_file (DFI_flow2, print_rtl_with_bb, get_insns ());
1311 rest_of_handle_branch_target_load_optimize ();
1312 open_dump_file (DFI_flow2, current_function_decl);
1315 if (optimize)
1316 cleanup_cfg (CLEANUP_EXPENSIVE);
1318 /* On some machines, the prologue and epilogue code, or parts thereof,
1319 can be represented as RTL. Doing so lets us schedule insns between
1320 it and the rest of the code and also allows delayed branch
1321 scheduling to operate in the epilogue. */
1322 thread_prologue_and_epilogue_insns (get_insns ());
1323 epilogue_completed = 1;
1325 if (optimize)
1326 rest_of_handle_stack_adjustments ();
1328 flow2_completed = 1;
1330 close_dump_file (DFI_flow2, print_rtl_with_bb, get_insns ());
1331 timevar_pop (TV_FLOW2);
1333 ggc_collect ();
1337 static void
1338 rest_of_handle_jump2 (void)
1340 open_dump_file (DFI_jump, current_function_decl);
1342 /* Always do one jump optimization pass to ensure that JUMP_LABEL fields
1343 are initialized and to compute whether control can drop off the end
1344 of the function. */
1346 timevar_push (TV_JUMP);
1347 /* Turn NOTE_INSN_EXPECTED_VALUE into REG_BR_PROB. Do this
1348 before jump optimization switches branch directions. */
1349 if (flag_guess_branch_prob)
1350 expected_value_to_br_prob ();
1352 delete_trivially_dead_insns (get_insns (), max_reg_num ());
1353 reg_scan (get_insns (), max_reg_num ());
1354 if (dump_file)
1355 dump_flow_info (dump_file);
1356 cleanup_cfg ((optimize ? CLEANUP_EXPENSIVE : 0) | CLEANUP_PRE_LOOP
1357 | (flag_thread_jumps ? CLEANUP_THREADING : 0));
1359 create_loop_notes ();
1361 purge_line_number_notes (get_insns ());
1363 if (optimize)
1364 cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP);
1366 /* Jump optimization, and the removal of NULL pointer checks, may
1367 have reduced the number of instructions substantially. CSE, and
1368 future passes, allocate arrays whose dimensions involve the
1369 maximum instruction UID, so if we can reduce the maximum UID
1370 we'll save big on memory. */
1371 renumber_insns (dump_file);
1373 close_dump_file (DFI_jump, print_rtl_with_bb, get_insns ());
1374 timevar_pop (TV_JUMP);
1376 ggc_collect ();
1379 #ifdef HAVE_peephole2
1380 static void
1381 rest_of_handle_peephole2 (void)
1383 timevar_push (TV_PEEPHOLE2);
1384 open_dump_file (DFI_peephole2, current_function_decl);
1386 peephole2_optimize (dump_file);
1388 close_dump_file (DFI_peephole2, print_rtl_with_bb, get_insns ());
1389 timevar_pop (TV_PEEPHOLE2);
1391 #endif
1393 static void
1394 rest_of_handle_postreload (void)
1396 timevar_push (TV_RELOAD_CSE_REGS);
1397 open_dump_file (DFI_postreload, current_function_decl);
1399 /* Do a very simple CSE pass over just the hard registers. */
1400 reload_cse_regs (get_insns ());
1401 /* reload_cse_regs can eliminate potentially-trapping MEMs.
1402 Remove any EH edges associated with them. */
1403 if (flag_non_call_exceptions)
1404 purge_all_dead_edges (0);
1406 close_dump_file (DFI_postreload, print_rtl_with_bb, get_insns ());
1407 timevar_pop (TV_RELOAD_CSE_REGS);
1410 static void
1411 rest_of_handle_shorten_branches (void)
1413 /* Shorten branches. */
1414 timevar_push (TV_SHORTEN_BRANCH);
1415 shorten_branches (get_insns ());
1416 timevar_pop (TV_SHORTEN_BRANCH);
1419 static void
1420 rest_of_clean_state (void)
1422 rtx insn, next;
1423 coverage_end_function ();
1425 /* It is very important to decompose the RTL instruction chain here:
1426 debug information keeps pointing into CODE_LABEL insns inside the function
1427 body. If these remain pointing to the other insns, we end up preserving
1428 whole RTL chain and attached detailed debug info in memory. */
1429 for (insn = get_insns (); insn; insn = next)
1431 next = NEXT_INSN (insn);
1432 NEXT_INSN (insn) = NULL;
1433 PREV_INSN (insn) = NULL;
1436 /* In case the function was not output,
1437 don't leave any temporary anonymous types
1438 queued up for sdb output. */
1439 #ifdef SDB_DEBUGGING_INFO
1440 if (write_symbols == SDB_DEBUG)
1441 sdbout_types (NULL_TREE);
1442 #endif
1444 reload_completed = 0;
1445 epilogue_completed = 0;
1446 flow2_completed = 0;
1447 no_new_pseudos = 0;
1449 timevar_push (TV_FINAL);
1451 /* Clear out the insn_length contents now that they are no
1452 longer valid. */
1453 init_insn_lengths ();
1455 /* Show no temporary slots allocated. */
1456 init_temp_slots ();
1458 free_basic_block_vars ();
1459 free_bb_for_insn ();
1461 timevar_pop (TV_FINAL);
1463 if (targetm.binds_local_p (current_function_decl))
1465 int pref = cfun->preferred_stack_boundary;
1466 if (cfun->stack_alignment_needed > cfun->preferred_stack_boundary)
1467 pref = cfun->stack_alignment_needed;
1468 cgraph_rtl_info (current_function_decl)->preferred_incoming_stack_boundary
1469 = pref;
1472 /* Make sure volatile mem refs aren't considered valid operands for
1473 arithmetic insns. We must call this here if this is a nested inline
1474 function, since the above code leaves us in the init_recog state
1475 (from final.c), and the function context push/pop code does not
1476 save/restore volatile_ok.
1478 ??? Maybe it isn't necessary for expand_start_function to call this
1479 anymore if we do it here? */
1481 init_recog_no_volatile ();
1483 /* We're done with this function. Free up memory if we can. */
1484 free_after_parsing (cfun);
1485 free_after_compilation (cfun);
1489 /* This function is called from the pass manager in tree-optimize.c
1490 after all tree passes have finished for a single function, and we
1491 have expanded the function body from trees to RTL.
1492 Once we are here, we have decided that we're supposed to output
1493 that function, i.e. that we should write assembler code for it.
1495 We run a series of low-level passes here on the function's RTL
1496 representation. Each pass is called via a rest_of_* function. */
1498 static void
1499 rest_of_compilation (void)
1501 /* If we're emitting a nested function, make sure its parent gets
1502 emitted as well. Doing otherwise confuses debug info. */
1504 tree parent;
1505 for (parent = DECL_CONTEXT (current_function_decl);
1506 parent != NULL_TREE;
1507 parent = get_containing_scope (parent))
1508 if (TREE_CODE (parent) == FUNCTION_DECL)
1509 TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (parent)) = 1;
1512 /* We are now committed to emitting code for this function. Do any
1513 preparation, such as emitting abstract debug info for the inline
1514 before it gets mangled by optimization. */
1515 if (cgraph_function_possibly_inlined_p (current_function_decl))
1516 (*debug_hooks->outlining_inline_function) (current_function_decl);
1518 /* Remove any notes we don't need. That will make iterating
1519 over the instruction sequence faster, and allow the garbage
1520 collector to reclaim the memory used by the notes. */
1521 remove_unnecessary_notes ();
1523 /* Initialize some variables used by the optimizers. */
1524 init_function_for_compilation ();
1526 TREE_ASM_WRITTEN (current_function_decl) = 1;
1528 /* Early return if there were errors. We can run afoul of our
1529 consistency checks, and there's not really much point in fixing them. */
1530 if (rtl_dump_and_exit || flag_syntax_only || errorcount || sorrycount)
1531 goto exit_rest_of_compilation;
1533 rest_of_handle_jump ();
1535 rest_of_handle_eh ();
1537 /* Delay emitting hard_reg_initial_value sets until after EH landing pad
1538 generation, which might create new sets. */
1539 emit_initial_value_sets ();
1541 #ifdef FINALIZE_PIC
1542 /* If we are doing position-independent code generation, now
1543 is the time to output special prologues and epilogues.
1544 We do not want to do this earlier, because it just clutters
1545 up inline functions with meaningless insns. */
1546 if (flag_pic)
1547 FINALIZE_PIC;
1548 #endif
1550 /* Copy any shared structure that should not be shared. */
1551 unshare_all_rtl ();
1553 #ifdef SETJMP_VIA_SAVE_AREA
1554 /* This must be performed before virtual register instantiation.
1555 Please be aware that everything in the compiler that can look
1556 at the RTL up to this point must understand that REG_SAVE_AREA
1557 is just like a use of the REG contained inside. */
1558 if (current_function_calls_alloca)
1559 optimize_save_area_alloca ();
1560 #endif
1562 /* Instantiate all virtual registers. */
1563 instantiate_virtual_regs ();
1565 rest_of_handle_jump2 ();
1567 if (optimize > 0)
1568 rest_of_handle_cse ();
1570 if (optimize > 0)
1572 if (flag_gcse)
1573 rest_of_handle_gcse ();
1575 if (flag_loop_optimize)
1576 rest_of_handle_loop_optimize ();
1578 if (flag_gcse)
1579 rest_of_handle_jump_bypass ();
1582 timevar_push (TV_FLOW);
1583 rest_of_handle_cfg ();
1585 if (!flag_tree_based_profiling
1586 && (optimize > 0 || profile_arc_flag
1587 || flag_test_coverage || flag_branch_probabilities))
1589 rtl_register_profile_hooks ();
1590 rtl_register_value_prof_hooks ();
1591 rest_of_handle_branch_prob ();
1593 if (flag_branch_probabilities
1594 && flag_profile_values
1595 && (flag_value_profile_transformations
1596 || flag_speculative_prefetching))
1597 rest_of_handle_value_profile_transformations ();
1599 /* Remove the death notes created for vpt. */
1600 if (flag_profile_values)
1601 count_or_remove_death_notes (NULL, 1);
1604 if (optimize > 0)
1605 rest_of_handle_if_conversion ();
1607 if (optimize > 0 && flag_tracer)
1608 rest_of_handle_tracer ();
1610 if (optimize > 0
1611 && flag_loop_optimize2)
1612 rest_of_handle_loop2 ();
1614 if (optimize > 0 && flag_web)
1615 rest_of_handle_web ();
1617 if (optimize > 0 && flag_rerun_cse_after_loop)
1618 rest_of_handle_cse2 ();
1620 cse_not_expected = 1;
1622 rest_of_handle_life ();
1623 timevar_pop (TV_FLOW);
1625 if (optimize > 0)
1626 rest_of_handle_combine ();
1628 if (optimize > 0 && flag_if_conversion)
1629 rest_of_handle_if_after_combine ();
1631 /* The optimization to partition hot/cold basic blocks into separate
1632 sections of the .o file does not work well with linkonce or with
1633 user defined section attributes. Don't call it if either case
1634 arises. */
1636 if (flag_reorder_blocks_and_partition
1637 && !DECL_ONE_ONLY (current_function_decl)
1638 && !user_defined_section_attribute)
1639 rest_of_handle_partition_blocks ();
1641 if (optimize > 0 && flag_regmove)
1642 rest_of_handle_regmove ();
1644 /* Do unconditional splitting before register allocation to allow machine
1645 description to add extra information not needed previously. */
1646 split_all_insns (1);
1648 #ifdef OPTIMIZE_MODE_SWITCHING
1649 rest_of_handle_mode_switching ();
1650 #endif
1652 /* Any of the several passes since flow1 will have munged register
1653 lifetime data a bit. We need it to be up to date for scheduling
1654 (see handling of reg_known_equiv in init_alias_analysis). */
1655 recompute_reg_usage (get_insns (), !optimize_size);
1657 #ifdef INSN_SCHEDULING
1658 if (optimize > 0 && flag_modulo_sched)
1659 rest_of_handle_sms ();
1661 if (flag_schedule_insns)
1662 rest_of_handle_sched ();
1663 #endif
1665 /* Determine if the current function is a leaf before running reload
1666 since this can impact optimizations done by the prologue and
1667 epilogue thus changing register elimination offsets. */
1668 current_function_is_leaf = leaf_function_p ();
1670 if (rest_of_handle_old_regalloc ())
1671 goto exit_rest_of_compilation;
1673 if (optimize > 0)
1674 rest_of_handle_postreload ();
1676 if (optimize > 0 && flag_gcse_after_reload)
1677 rest_of_handle_gcse2 ();
1679 rest_of_handle_flow2 ();
1681 #ifdef HAVE_peephole2
1682 if (optimize > 0 && flag_peephole2)
1683 rest_of_handle_peephole2 ();
1684 #endif
1686 if (optimize > 0)
1687 rest_of_handle_if_after_reload ();
1689 if (optimize > 0)
1691 if (flag_rename_registers || flag_cprop_registers)
1692 rest_of_handle_regrename ();
1694 rest_of_handle_reorder_blocks ();
1697 if (flag_branch_target_load_optimize2)
1698 rest_of_handle_branch_target_load_optimize ();
1700 #ifdef LEAF_REGISTERS
1701 current_function_uses_only_leaf_regs
1702 = optimize > 0 && only_leaf_regs_used () && leaf_function_p ();
1703 #endif
1705 #ifdef INSN_SCHEDULING
1706 if (optimize > 0 && flag_schedule_insns_after_reload)
1707 rest_of_handle_sched2 ();
1708 #endif
1710 #ifdef STACK_REGS
1711 rest_of_handle_stack_regs ();
1712 #endif
1714 compute_alignments ();
1716 /* Aggressively duplicate basic blocks ending in computed gotos to the
1717 tails of their predecessors, unless we are optimizing for size. */
1718 if (flag_expensive_optimizations && !optimize_size)
1719 duplicate_computed_gotos ();
1721 if (flag_var_tracking)
1722 rest_of_handle_variable_tracking ();
1724 /* CFG is no longer maintained up-to-date. */
1725 free_bb_for_insn ();
1727 if (targetm.machine_dependent_reorg != 0)
1728 rest_of_handle_machine_reorg ();
1730 purge_line_number_notes (get_insns ());
1731 cleanup_barriers ();
1733 #ifdef DELAY_SLOTS
1734 if (flag_delayed_branch)
1735 rest_of_handle_delay_slots ();
1736 #endif
1738 #if defined (HAVE_ATTR_length) && !defined (STACK_REGS)
1739 timevar_push (TV_SHORTEN_BRANCH);
1740 split_all_insns_noflow ();
1741 timevar_pop (TV_SHORTEN_BRANCH);
1742 #endif
1744 convert_to_eh_region_ranges ();
1746 rest_of_handle_shorten_branches ();
1748 set_nothrow_function_flags ();
1750 rest_of_handle_final ();
1752 exit_rest_of_compilation:
1754 rest_of_clean_state ();
1757 void
1758 finish_optimization_passes (void)
1760 enum tree_dump_index i;
1761 struct dump_file_info *dfi;
1762 char *name;
1764 timevar_push (TV_DUMP);
1765 if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
1767 open_dump_file (DFI_bp, NULL);
1768 end_branch_prob ();
1769 close_dump_file (DFI_bp, NULL, NULL_RTX);
1772 if (optimize > 0 && open_dump_file (DFI_combine, NULL))
1774 dump_combine_total_stats (dump_file);
1775 close_dump_file (DFI_combine, NULL, NULL_RTX);
1778 /* Do whatever is necessary to finish printing the graphs. */
1779 if (graph_dump_format != no_graph)
1780 for (i = DFI_MIN; (dfi = get_dump_file_info (i)) != NULL; ++i)
1781 if (dump_initialized_p (i)
1782 && (dfi->flags & TDF_RTL) != 0
1783 && (name = get_dump_file_name (i)) != NULL)
1785 finish_graph_dump_file (name);
1786 free (name);
1789 timevar_pop (TV_DUMP);
1792 struct tree_opt_pass pass_rest_of_compilation =
1794 NULL, /* name */
1795 NULL, /* gate */
1796 rest_of_compilation, /* execute */
1797 NULL, /* sub */
1798 NULL, /* next */
1799 0, /* static_pass_number */
1800 TV_REST_OF_COMPILATION, /* tv_id */
1801 PROP_rtl, /* properties_required */
1802 0, /* properties_provided */
1803 PROP_rtl, /* properties_destroyed */
1804 0, /* todo_flags_start */
1805 TODO_ggc_collect, /* todo_flags_finish */
1806 0 /* letter */