Improve dup pattern
[official-gcc.git] / gcc / passes.c
blob64493ba1688ba713ec446cf5cdf5247ac80e4744
1 /* Top level of GCC compilers (cc1, cc1plus, etc.)
2 Copyright (C) 1987-2017 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 /* This is the top level of cc1/c++.
21 It parses command args, opens files, invokes the various passes
22 in the proper order, and counts the time used by each.
23 Error messages and low-level interface to malloc also handled here. */
25 #include "config.h"
26 #include "system.h"
27 #include "coretypes.h"
28 #include "backend.h"
29 #include "target.h"
30 #include "rtl.h"
31 #include "tree.h"
32 #include "gimple.h"
33 #include "cfghooks.h"
34 #include "df.h"
35 #include "memmodel.h"
36 #include "tm_p.h"
37 #include "ssa.h"
38 #include "emit-rtl.h"
39 #include "cgraph.h"
40 #include "lto-streamer.h"
41 #include "fold-const.h"
42 #include "varasm.h"
43 #include "output.h"
44 #include "graph.h"
45 #include "debug.h"
46 #include "cfgloop.h"
47 #include "value-prof.h"
48 #include "tree-cfg.h"
49 #include "tree-ssa-loop-manip.h"
50 #include "tree-into-ssa.h"
51 #include "tree-dfa.h"
52 #include "tree-ssa.h"
53 #include "tree-pass.h"
54 #include "plugin.h"
55 #include "ipa-utils.h"
56 #include "tree-pretty-print.h" /* for dump_function_header */
57 #include "context.h"
58 #include "pass_manager.h"
59 #include "cfgrtl.h"
60 #include "tree-ssa-live.h" /* For remove_unused_locals. */
61 #include "tree-cfgcleanup.h"
62 #include "insn-addr.h" /* for INSN_ADDRESSES_ALLOC. */
63 #include "diagnostic-core.h" /* for fnotice */
65 using namespace gcc;
67 /* This is used for debugging. It allows the current pass to printed
68 from anywhere in compilation.
69 The variable current_pass is also used for statistics and plugins. */
70 opt_pass *current_pass;
72 /* Most passes are single-instance (within their context) and thus don't
73 need to implement cloning, but passes that support multiple instances
74 *must* provide their own implementation of the clone method.
76 Handle this by providing a default implemenation, but make it a fatal
77 error to call it. */
79 opt_pass *
80 opt_pass::clone ()
82 internal_error ("pass %s does not support cloning", name);
85 void
86 opt_pass::set_pass_param (unsigned int, bool)
88 internal_error ("pass %s needs a set_pass_param implementation to handle the"
89 " extra argument in NEXT_PASS", name);
92 bool
93 opt_pass::gate (function *)
95 return true;
98 unsigned int
99 opt_pass::execute (function *)
101 return 0;
104 opt_pass::opt_pass (const pass_data &data, context *ctxt)
105 : pass_data (data),
106 sub (NULL),
107 next (NULL),
108 static_pass_number (0),
109 m_ctxt (ctxt)
114 void
115 pass_manager::execute_early_local_passes ()
117 execute_pass_list (cfun, pass_build_ssa_passes_1->sub);
118 if (flag_check_pointer_bounds)
119 execute_pass_list (cfun, pass_chkp_instrumentation_passes_1->sub);
120 execute_pass_list (cfun, pass_local_optimization_passes_1->sub);
123 unsigned int
124 pass_manager::execute_pass_mode_switching ()
126 return pass_mode_switching_1->execute (cfun);
130 /* Call from anywhere to find out what pass this is. Useful for
131 printing out debugging information deep inside an service
132 routine. */
133 void
134 print_current_pass (FILE *file)
136 if (current_pass)
137 fprintf (file, "current pass = %s (%d)\n",
138 current_pass->name, current_pass->static_pass_number);
139 else
140 fprintf (file, "no current pass.\n");
144 /* Call from the debugger to get the current pass name. */
145 DEBUG_FUNCTION void
146 debug_pass (void)
148 print_current_pass (stderr);
153 /* Global variables used to communicate with passes. */
154 bool in_gimple_form;
157 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
158 and TYPE_DECL nodes.
160 This does nothing for local (non-static) variables, unless the
161 variable is a register variable with DECL_ASSEMBLER_NAME set. In
162 that case, or if the variable is not an automatic, it sets up the
163 RTL and outputs any assembler code (label definition, storage
164 allocation and initialization).
166 DECL is the declaration. TOP_LEVEL is nonzero
167 if this declaration is not within a function. */
169 void
170 rest_of_decl_compilation (tree decl,
171 int top_level,
172 int at_end)
174 bool finalize = true;
176 /* We deferred calling assemble_alias so that we could collect
177 other attributes such as visibility. Emit the alias now. */
178 if (!in_lto_p)
180 tree alias;
181 alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl));
182 if (alias)
184 alias = TREE_VALUE (TREE_VALUE (alias));
185 alias = get_identifier (TREE_STRING_POINTER (alias));
186 /* A quirk of the initial implementation of aliases required that the
187 user add "extern" to all of them. Which is silly, but now
188 historical. Do note that the symbol is in fact locally defined. */
189 DECL_EXTERNAL (decl) = 0;
190 TREE_STATIC (decl) = 1;
191 assemble_alias (decl, alias);
192 finalize = false;
196 /* Can't defer this, because it needs to happen before any
197 later function definitions are processed. */
198 if (DECL_ASSEMBLER_NAME_SET_P (decl) && DECL_REGISTER (decl))
199 make_decl_rtl (decl);
201 /* Forward declarations for nested functions are not "external",
202 but we need to treat them as if they were. */
203 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
204 || TREE_CODE (decl) == FUNCTION_DECL)
206 timevar_push (TV_VARCONST);
208 /* Don't output anything when a tentative file-scope definition
209 is seen. But at end of compilation, do output code for them.
211 We do output all variables and rely on
212 callgraph code to defer them except for forward declarations
213 (see gcc.c-torture/compile/920624-1.c) */
214 if ((at_end
215 || !DECL_DEFER_OUTPUT (decl)
216 || DECL_INITIAL (decl))
217 && (!VAR_P (decl) || !DECL_HAS_VALUE_EXPR_P (decl))
218 && !DECL_EXTERNAL (decl))
220 /* When reading LTO unit, we also read varpool, so do not
221 rebuild it. */
222 if (in_lto_p && !at_end)
224 else if (finalize && TREE_CODE (decl) != FUNCTION_DECL)
225 varpool_node::finalize_decl (decl);
228 #ifdef ASM_FINISH_DECLARE_OBJECT
229 if (decl == last_assemble_variable_decl)
231 ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
232 top_level, at_end);
234 #endif
236 /* Now that we have activated any function-specific attributes
237 that might affect function decl, particularly align, relayout it. */
238 if (TREE_CODE (decl) == FUNCTION_DECL)
239 targetm.target_option.relayout_function (decl);
241 timevar_pop (TV_VARCONST);
243 else if (TREE_CODE (decl) == TYPE_DECL
244 /* Like in rest_of_type_compilation, avoid confusing the debug
245 information machinery when there are errors. */
246 && !seen_error ())
248 timevar_push (TV_SYMOUT);
249 debug_hooks->type_decl (decl, !top_level);
250 timevar_pop (TV_SYMOUT);
253 /* Let cgraph know about the existence of variables. */
254 if (in_lto_p && !at_end)
256 else if (VAR_P (decl) && !DECL_EXTERNAL (decl)
257 && TREE_STATIC (decl))
258 varpool_node::get_create (decl);
260 /* Generate early debug for global variables. Any local variables will
261 be handled by either handling reachable functions from
262 finalize_compilation_unit (and by consequence, locally scoped
263 symbols), or by rest_of_type_compilation below.
265 Also, pick up function prototypes, which will be mostly ignored
266 by the different early_global_decl() hooks, but will at least be
267 used by Go's hijack of the debug_hooks to implement
268 -fdump-go-spec. */
269 if (!in_lto_p
270 && (TREE_CODE (decl) != FUNCTION_DECL
271 /* This will pick up function prototypes with no bodies,
272 which are not visible in finalize_compilation_unit()
273 while iterating with FOR_EACH_*_FUNCTION through the
274 symbol table. */
275 || !DECL_SAVED_TREE (decl))
277 /* We need to check both decl_function_context and
278 current_function_decl here to make sure local extern
279 declarations end up with the correct context.
281 For local extern declarations, decl_function_context is
282 empty, but current_function_decl is set to the function where
283 the extern was declared . Without the check for
284 !current_function_decl below, the local extern ends up
285 incorrectly with a top-level context.
287 For example:
289 namespace S
295 int i = 42;
297 extern int i; // Local extern declaration.
298 return i;
304 && !decl_function_context (decl)
305 && !current_function_decl
306 && DECL_SOURCE_LOCATION (decl) != BUILTINS_LOCATION
307 && (!decl_type_context (decl)
308 /* If we created a varpool node for the decl make sure to
309 call early_global_decl. Otherwise we miss changes
310 introduced by member definitions like
311 struct A { static int staticdatamember; };
312 int A::staticdatamember;
313 and thus have incomplete early debug and late debug
314 called from varpool node removal fails to handle it
315 properly. */
316 || (finalize
317 && VAR_P (decl)
318 && TREE_STATIC (decl) && !DECL_EXTERNAL (decl)))
319 /* Avoid confusing the debug information machinery when there are
320 errors. */
321 && !seen_error ())
322 (*debug_hooks->early_global_decl) (decl);
325 /* Called after finishing a record, union or enumeral type. */
327 void
328 rest_of_type_compilation (tree type, int toplev)
330 /* Avoid confusing the debug information machinery when there are
331 errors. */
332 if (seen_error ())
333 return;
335 timevar_push (TV_SYMOUT);
336 debug_hooks->type_decl (TYPE_STUB_DECL (type), !toplev);
337 timevar_pop (TV_SYMOUT);
342 void
343 pass_manager::
344 finish_optimization_passes (void)
346 int i;
347 struct dump_file_info *dfi;
348 char *name;
349 gcc::dump_manager *dumps = m_ctxt->get_dumps ();
351 timevar_push (TV_DUMP);
352 if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
354 dumps->dump_start (pass_profile_1->static_pass_number, NULL);
355 end_branch_prob ();
356 dumps->dump_finish (pass_profile_1->static_pass_number);
359 if (optimize > 0)
361 dumps->dump_start (pass_profile_1->static_pass_number, NULL);
362 print_combine_total_stats ();
363 dumps->dump_finish (pass_profile_1->static_pass_number);
366 /* Do whatever is necessary to finish printing the graphs. */
367 for (i = TDI_end; (dfi = dumps->get_dump_file_info (i)) != NULL; ++i)
368 if (dfi->graph_dump_initialized)
370 name = dumps->get_dump_file_name (dfi);
371 finish_graph_dump_file (name);
372 free (name);
375 timevar_pop (TV_DUMP);
378 static unsigned int
379 execute_build_ssa_passes (void)
381 /* Once this pass (and its sub-passes) are complete, all functions
382 will be in SSA form. Technically this state change is happening
383 a tad early, since the sub-passes have not yet run, but since
384 none of the sub-passes are IPA passes and do not create new
385 functions, this is ok. We're setting this value for the benefit
386 of IPA passes that follow. */
387 if (symtab->state < IPA_SSA)
388 symtab->state = IPA_SSA;
389 return 0;
392 namespace {
394 const pass_data pass_data_build_ssa_passes =
396 SIMPLE_IPA_PASS, /* type */
397 "build_ssa_passes", /* name */
398 OPTGROUP_NONE, /* optinfo_flags */
399 TV_EARLY_LOCAL, /* tv_id */
400 0, /* properties_required */
401 0, /* properties_provided */
402 0, /* properties_destroyed */
403 0, /* todo_flags_start */
404 /* todo_flags_finish is executed before subpases. For this reason
405 it makes no sense to remove unreachable functions here. */
406 0, /* todo_flags_finish */
409 class pass_build_ssa_passes : public simple_ipa_opt_pass
411 public:
412 pass_build_ssa_passes (gcc::context *ctxt)
413 : simple_ipa_opt_pass (pass_data_build_ssa_passes, ctxt)
416 /* opt_pass methods: */
417 virtual bool gate (function *)
419 /* Don't bother doing anything if the program has errors. */
420 return (!seen_error () && !in_lto_p);
423 virtual unsigned int execute (function *)
425 return execute_build_ssa_passes ();
428 }; // class pass_build_ssa_passes
430 const pass_data pass_data_chkp_instrumentation_passes =
432 SIMPLE_IPA_PASS, /* type */
433 "chkp_passes", /* name */
434 OPTGROUP_NONE, /* optinfo_flags */
435 TV_NONE, /* tv_id */
436 0, /* properties_required */
437 0, /* properties_provided */
438 0, /* properties_destroyed */
439 0, /* todo_flags_start */
440 0, /* todo_flags_finish */
443 class pass_chkp_instrumentation_passes : public simple_ipa_opt_pass
445 public:
446 pass_chkp_instrumentation_passes (gcc::context *ctxt)
447 : simple_ipa_opt_pass (pass_data_chkp_instrumentation_passes, ctxt)
450 /* opt_pass methods: */
451 virtual bool gate (function *)
453 /* Don't bother doing anything if the program has errors. */
454 return (flag_check_pointer_bounds
455 && !seen_error () && !in_lto_p);
458 }; // class pass_chkp_instrumentation_passes
460 const pass_data pass_data_local_optimization_passes =
462 SIMPLE_IPA_PASS, /* type */
463 "opt_local_passes", /* name */
464 OPTGROUP_NONE, /* optinfo_flags */
465 TV_NONE, /* tv_id */
466 0, /* properties_required */
467 0, /* properties_provided */
468 0, /* properties_destroyed */
469 0, /* todo_flags_start */
470 0, /* todo_flags_finish */
473 class pass_local_optimization_passes : public simple_ipa_opt_pass
475 public:
476 pass_local_optimization_passes (gcc::context *ctxt)
477 : simple_ipa_opt_pass (pass_data_local_optimization_passes, ctxt)
480 /* opt_pass methods: */
481 virtual bool gate (function *)
483 /* Don't bother doing anything if the program has errors. */
484 return (!seen_error () && !in_lto_p);
487 }; // class pass_local_optimization_passes
489 } // anon namespace
491 simple_ipa_opt_pass *
492 make_pass_build_ssa_passes (gcc::context *ctxt)
494 return new pass_build_ssa_passes (ctxt);
497 simple_ipa_opt_pass *
498 make_pass_chkp_instrumentation_passes (gcc::context *ctxt)
500 return new pass_chkp_instrumentation_passes (ctxt);
503 simple_ipa_opt_pass *
504 make_pass_local_optimization_passes (gcc::context *ctxt)
506 return new pass_local_optimization_passes (ctxt);
509 namespace {
511 const pass_data pass_data_all_early_optimizations =
513 GIMPLE_PASS, /* type */
514 "early_optimizations", /* name */
515 OPTGROUP_NONE, /* optinfo_flags */
516 TV_NONE, /* tv_id */
517 0, /* properties_required */
518 0, /* properties_provided */
519 0, /* properties_destroyed */
520 0, /* todo_flags_start */
521 0, /* todo_flags_finish */
524 class pass_all_early_optimizations : public gimple_opt_pass
526 public:
527 pass_all_early_optimizations (gcc::context *ctxt)
528 : gimple_opt_pass (pass_data_all_early_optimizations, ctxt)
531 /* opt_pass methods: */
532 virtual bool gate (function *)
534 return (optimize >= 1
535 /* Don't bother doing anything if the program has errors. */
536 && !seen_error ());
539 }; // class pass_all_early_optimizations
541 } // anon namespace
543 static gimple_opt_pass *
544 make_pass_all_early_optimizations (gcc::context *ctxt)
546 return new pass_all_early_optimizations (ctxt);
549 namespace {
551 const pass_data pass_data_all_optimizations =
553 GIMPLE_PASS, /* type */
554 "*all_optimizations", /* name */
555 OPTGROUP_NONE, /* optinfo_flags */
556 TV_OPTIMIZE, /* tv_id */
557 0, /* properties_required */
558 0, /* properties_provided */
559 0, /* properties_destroyed */
560 0, /* todo_flags_start */
561 0, /* todo_flags_finish */
564 class pass_all_optimizations : public gimple_opt_pass
566 public:
567 pass_all_optimizations (gcc::context *ctxt)
568 : gimple_opt_pass (pass_data_all_optimizations, ctxt)
571 /* opt_pass methods: */
572 virtual bool gate (function *) { return optimize >= 1 && !optimize_debug; }
574 }; // class pass_all_optimizations
576 } // anon namespace
578 static gimple_opt_pass *
579 make_pass_all_optimizations (gcc::context *ctxt)
581 return new pass_all_optimizations (ctxt);
584 namespace {
586 const pass_data pass_data_all_optimizations_g =
588 GIMPLE_PASS, /* type */
589 "*all_optimizations_g", /* name */
590 OPTGROUP_NONE, /* optinfo_flags */
591 TV_OPTIMIZE, /* tv_id */
592 0, /* properties_required */
593 0, /* properties_provided */
594 0, /* properties_destroyed */
595 0, /* todo_flags_start */
596 0, /* todo_flags_finish */
599 class pass_all_optimizations_g : public gimple_opt_pass
601 public:
602 pass_all_optimizations_g (gcc::context *ctxt)
603 : gimple_opt_pass (pass_data_all_optimizations_g, ctxt)
606 /* opt_pass methods: */
607 virtual bool gate (function *) { return optimize >= 1 && optimize_debug; }
609 }; // class pass_all_optimizations_g
611 } // anon namespace
613 static gimple_opt_pass *
614 make_pass_all_optimizations_g (gcc::context *ctxt)
616 return new pass_all_optimizations_g (ctxt);
619 namespace {
621 const pass_data pass_data_rest_of_compilation =
623 RTL_PASS, /* type */
624 "*rest_of_compilation", /* name */
625 OPTGROUP_NONE, /* optinfo_flags */
626 TV_REST_OF_COMPILATION, /* tv_id */
627 PROP_rtl, /* properties_required */
628 0, /* properties_provided */
629 0, /* properties_destroyed */
630 0, /* todo_flags_start */
631 0, /* todo_flags_finish */
634 class pass_rest_of_compilation : public rtl_opt_pass
636 public:
637 pass_rest_of_compilation (gcc::context *ctxt)
638 : rtl_opt_pass (pass_data_rest_of_compilation, ctxt)
641 /* opt_pass methods: */
642 virtual bool gate (function *)
644 /* Early return if there were errors. We can run afoul of our
645 consistency checks, and there's not really much point in fixing them. */
646 return !(rtl_dump_and_exit || flag_syntax_only || seen_error ());
649 }; // class pass_rest_of_compilation
651 } // anon namespace
653 static rtl_opt_pass *
654 make_pass_rest_of_compilation (gcc::context *ctxt)
656 return new pass_rest_of_compilation (ctxt);
659 namespace {
661 const pass_data pass_data_postreload =
663 RTL_PASS, /* type */
664 "*all-postreload", /* name */
665 OPTGROUP_NONE, /* optinfo_flags */
666 TV_POSTRELOAD, /* tv_id */
667 PROP_rtl, /* properties_required */
668 0, /* properties_provided */
669 0, /* properties_destroyed */
670 0, /* todo_flags_start */
671 0, /* todo_flags_finish */
674 class pass_postreload : public rtl_opt_pass
676 public:
677 pass_postreload (gcc::context *ctxt)
678 : rtl_opt_pass (pass_data_postreload, ctxt)
681 /* opt_pass methods: */
682 virtual bool gate (function *) { return reload_completed; }
684 }; // class pass_postreload
686 } // anon namespace
688 static rtl_opt_pass *
689 make_pass_postreload (gcc::context *ctxt)
691 return new pass_postreload (ctxt);
694 namespace {
696 const pass_data pass_data_late_compilation =
698 RTL_PASS, /* type */
699 "*all-late_compilation", /* name */
700 OPTGROUP_NONE, /* optinfo_flags */
701 TV_LATE_COMPILATION, /* tv_id */
702 PROP_rtl, /* properties_required */
703 0, /* properties_provided */
704 0, /* properties_destroyed */
705 0, /* todo_flags_start */
706 0, /* todo_flags_finish */
709 class pass_late_compilation : public rtl_opt_pass
711 public:
712 pass_late_compilation (gcc::context *ctxt)
713 : rtl_opt_pass (pass_data_late_compilation, ctxt)
716 /* opt_pass methods: */
717 virtual bool gate (function *)
719 return reload_completed || targetm.no_register_allocation;
722 }; // class pass_late_compilation
724 } // anon namespace
726 static rtl_opt_pass *
727 make_pass_late_compilation (gcc::context *ctxt)
729 return new pass_late_compilation (ctxt);
734 /* Set the static pass number of pass PASS to ID and record that
735 in the mapping from static pass number to pass. */
737 void
738 pass_manager::
739 set_pass_for_id (int id, opt_pass *pass)
741 pass->static_pass_number = id;
742 if (passes_by_id_size <= id)
744 passes_by_id = XRESIZEVEC (opt_pass *, passes_by_id, id + 1);
745 memset (passes_by_id + passes_by_id_size, 0,
746 (id + 1 - passes_by_id_size) * sizeof (void *));
747 passes_by_id_size = id + 1;
749 passes_by_id[id] = pass;
752 /* Return the pass with the static pass number ID. */
754 opt_pass *
755 pass_manager::get_pass_for_id (int id) const
757 if (id >= passes_by_id_size)
758 return NULL;
759 return passes_by_id[id];
762 /* Iterate over the pass tree allocating dump file numbers. We want
763 to do this depth first, and independent of whether the pass is
764 enabled or not. */
766 void
767 register_one_dump_file (opt_pass *pass)
769 g->get_passes ()->register_one_dump_file (pass);
772 void
773 pass_manager::register_one_dump_file (opt_pass *pass)
775 char *dot_name, *flag_name, *glob_name;
776 const char *name, *full_name, *prefix;
778 /* Buffer big enough to format a 32-bit UINT_MAX into. */
779 char num[11];
780 dump_kind dkind;
781 int id;
782 int optgroup_flags = OPTGROUP_NONE;
783 gcc::dump_manager *dumps = m_ctxt->get_dumps ();
785 /* See below in next_pass_1. */
786 num[0] = '\0';
787 if (pass->static_pass_number != -1)
788 sprintf (num, "%u", ((int) pass->static_pass_number < 0
789 ? 1 : pass->static_pass_number));
791 /* The name is both used to identify the pass for the purposes of plugins,
792 and to specify dump file name and option.
793 The latter two might want something short which is not quite unique; for
794 that reason, we may have a disambiguating prefix, followed by a space
795 to mark the start of the following dump file name / option string. */
796 name = strchr (pass->name, ' ');
797 name = name ? name + 1 : pass->name;
798 dot_name = concat (".", name, num, NULL);
799 if (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS)
801 prefix = "ipa-";
802 dkind = DK_ipa;
803 optgroup_flags |= OPTGROUP_IPA;
805 else if (pass->type == GIMPLE_PASS)
807 prefix = "tree-";
808 dkind = DK_tree;
810 else
812 prefix = "rtl-";
813 dkind = DK_rtl;
816 flag_name = concat (prefix, name, num, NULL);
817 glob_name = concat (prefix, name, NULL);
818 optgroup_flags |= pass->optinfo_flags;
819 /* For any passes that do not have an optgroup set, and which are not
820 IPA passes setup above, set the optgroup to OPTGROUP_OTHER so that
821 any dump messages are emitted properly under -fopt-info(-optall). */
822 if (optgroup_flags == OPTGROUP_NONE)
823 optgroup_flags = OPTGROUP_OTHER;
824 id = dumps->dump_register (dot_name, flag_name, glob_name, dkind,
825 optgroup_flags,
826 true);
827 set_pass_for_id (id, pass);
828 full_name = concat (prefix, pass->name, num, NULL);
829 register_pass_name (pass, full_name);
830 free (CONST_CAST (char *, full_name));
833 /* Register the dump files for the pass_manager starting at PASS. */
835 void
836 pass_manager::register_dump_files (opt_pass *pass)
840 if (pass->name && pass->name[0] != '*')
841 register_one_dump_file (pass);
843 if (pass->sub)
844 register_dump_files (pass->sub);
846 pass = pass->next;
848 while (pass);
851 /* Register PASS with NAME. */
853 void
854 pass_manager::register_pass_name (opt_pass *pass, const char *name)
856 if (!m_name_to_pass_map)
857 m_name_to_pass_map = new hash_map<nofree_string_hash, opt_pass *> (256);
859 if (m_name_to_pass_map->get (name))
860 return; /* Ignore plugin passes. */
862 const char *unique_name = xstrdup (name);
863 m_name_to_pass_map->put (unique_name, pass);
866 /* Map from pass id to canonicalized pass name. */
868 typedef const char *char_ptr;
869 static vec<char_ptr> pass_tab;
871 /* Callback function for traversing NAME_TO_PASS_MAP. */
873 bool
874 passes_pass_traverse (const char *const &name, opt_pass *const &pass, void *)
876 gcc_assert (pass->static_pass_number > 0);
877 gcc_assert (pass_tab.exists ());
879 pass_tab[pass->static_pass_number] = name;
881 return 1;
884 /* The function traverses NAME_TO_PASS_MAP and creates a pass info
885 table for dumping purpose. */
887 void
888 pass_manager::create_pass_tab (void) const
890 if (!flag_dump_passes)
891 return;
893 pass_tab.safe_grow_cleared (passes_by_id_size + 1);
894 m_name_to_pass_map->traverse <void *, passes_pass_traverse> (NULL);
897 static bool override_gate_status (opt_pass *, tree, bool);
899 /* Dump the instantiated name for PASS. IS_ON indicates if PASS
900 is turned on or not. */
902 static void
903 dump_one_pass (opt_pass *pass, int pass_indent)
905 int indent = 3 * pass_indent;
906 const char *pn;
907 bool is_on, is_really_on;
909 is_on = pass->gate (cfun);
910 is_really_on = override_gate_status (pass, current_function_decl, is_on);
912 if (pass->static_pass_number <= 0)
913 pn = pass->name;
914 else
915 pn = pass_tab[pass->static_pass_number];
917 fprintf (stderr, "%*s%-40s%*s:%s%s\n", indent, " ", pn,
918 (15 - indent < 0 ? 0 : 15 - indent), " ",
919 is_on ? " ON" : " OFF",
920 ((!is_on) == (!is_really_on) ? ""
921 : (is_really_on ? " (FORCED_ON)" : " (FORCED_OFF)")));
924 /* Dump pass list PASS with indentation INDENT. */
926 static void
927 dump_pass_list (opt_pass *pass, int indent)
931 dump_one_pass (pass, indent);
932 if (pass->sub)
933 dump_pass_list (pass->sub, indent + 1);
934 pass = pass->next;
936 while (pass);
939 /* Dump all optimization passes. */
941 void
942 dump_passes (void)
944 g->get_passes ()->dump_passes ();
947 void
948 pass_manager::dump_passes () const
950 push_dummy_function (true);
952 create_pass_tab ();
954 dump_pass_list (all_lowering_passes, 1);
955 dump_pass_list (all_small_ipa_passes, 1);
956 dump_pass_list (all_regular_ipa_passes, 1);
957 dump_pass_list (all_late_ipa_passes, 1);
958 dump_pass_list (all_passes, 1);
960 pop_dummy_function ();
963 /* Returns the pass with NAME. */
965 opt_pass *
966 pass_manager::get_pass_by_name (const char *name)
968 opt_pass **p = m_name_to_pass_map->get (name);
969 if (p)
970 return *p;
972 return NULL;
976 /* Range [start, last]. */
978 struct uid_range
980 unsigned int start;
981 unsigned int last;
982 const char *assem_name;
983 struct uid_range *next;
986 typedef struct uid_range *uid_range_p;
989 static vec<uid_range_p> enabled_pass_uid_range_tab;
990 static vec<uid_range_p> disabled_pass_uid_range_tab;
993 /* Parse option string for -fdisable- and -fenable-
994 The syntax of the options:
996 -fenable-<pass_name>
997 -fdisable-<pass_name>
999 -fenable-<pass_name>=s1:e1,s2:e2,...
1000 -fdisable-<pass_name>=s1:e1,s2:e2,...
1003 static void
1004 enable_disable_pass (const char *arg, bool is_enable)
1006 opt_pass *pass;
1007 char *range_str, *phase_name;
1008 char *argstr = xstrdup (arg);
1009 vec<uid_range_p> *tab = 0;
1011 range_str = strchr (argstr,'=');
1012 if (range_str)
1014 *range_str = '\0';
1015 range_str++;
1018 phase_name = argstr;
1019 if (!*phase_name)
1021 if (is_enable)
1022 error ("unrecognized option -fenable");
1023 else
1024 error ("unrecognized option -fdisable");
1025 free (argstr);
1026 return;
1028 pass = g->get_passes ()->get_pass_by_name (phase_name);
1029 if (!pass || pass->static_pass_number == -1)
1031 if (is_enable)
1032 error ("unknown pass %s specified in -fenable", phase_name);
1033 else
1034 error ("unknown pass %s specified in -fdisable", phase_name);
1035 free (argstr);
1036 return;
1039 if (is_enable)
1040 tab = &enabled_pass_uid_range_tab;
1041 else
1042 tab = &disabled_pass_uid_range_tab;
1044 if ((unsigned) pass->static_pass_number >= tab->length ())
1045 tab->safe_grow_cleared (pass->static_pass_number + 1);
1047 if (!range_str)
1049 uid_range_p slot;
1050 uid_range_p new_range = XCNEW (struct uid_range);
1052 new_range->start = 0;
1053 new_range->last = (unsigned)-1;
1055 slot = (*tab)[pass->static_pass_number];
1056 new_range->next = slot;
1057 (*tab)[pass->static_pass_number] = new_range;
1058 if (is_enable)
1059 inform (UNKNOWN_LOCATION, "enable pass %s for functions in the range "
1060 "of [%u, %u]", phase_name, new_range->start, new_range->last);
1061 else
1062 inform (UNKNOWN_LOCATION, "disable pass %s for functions in the range "
1063 "of [%u, %u]", phase_name, new_range->start, new_range->last);
1065 else
1067 char *next_range = NULL;
1068 char *one_range = range_str;
1069 char *end_val = NULL;
1073 uid_range_p slot;
1074 uid_range_p new_range;
1075 char *invalid = NULL;
1076 long start;
1077 char *func_name = NULL;
1079 next_range = strchr (one_range, ',');
1080 if (next_range)
1082 *next_range = '\0';
1083 next_range++;
1086 end_val = strchr (one_range, ':');
1087 if (end_val)
1089 *end_val = '\0';
1090 end_val++;
1092 start = strtol (one_range, &invalid, 10);
1093 if (*invalid || start < 0)
1095 if (end_val || (one_range[0] >= '0'
1096 && one_range[0] <= '9'))
1098 error ("Invalid range %s in option %s",
1099 one_range,
1100 is_enable ? "-fenable" : "-fdisable");
1101 free (argstr);
1102 return;
1104 func_name = one_range;
1106 if (!end_val)
1108 new_range = XCNEW (struct uid_range);
1109 if (!func_name)
1111 new_range->start = (unsigned) start;
1112 new_range->last = (unsigned) start;
1114 else
1116 new_range->start = (unsigned) -1;
1117 new_range->last = (unsigned) -1;
1118 new_range->assem_name = xstrdup (func_name);
1121 else
1123 long last = strtol (end_val, &invalid, 10);
1124 if (*invalid || last < start)
1126 error ("Invalid range %s in option %s",
1127 end_val,
1128 is_enable ? "-fenable" : "-fdisable");
1129 free (argstr);
1130 return;
1132 new_range = XCNEW (struct uid_range);
1133 new_range->start = (unsigned) start;
1134 new_range->last = (unsigned) last;
1137 slot = (*tab)[pass->static_pass_number];
1138 new_range->next = slot;
1139 (*tab)[pass->static_pass_number] = new_range;
1140 if (is_enable)
1142 if (new_range->assem_name)
1143 inform (UNKNOWN_LOCATION,
1144 "enable pass %s for function %s",
1145 phase_name, new_range->assem_name);
1146 else
1147 inform (UNKNOWN_LOCATION,
1148 "enable pass %s for functions in the range of [%u, %u]",
1149 phase_name, new_range->start, new_range->last);
1151 else
1153 if (new_range->assem_name)
1154 inform (UNKNOWN_LOCATION,
1155 "disable pass %s for function %s",
1156 phase_name, new_range->assem_name);
1157 else
1158 inform (UNKNOWN_LOCATION,
1159 "disable pass %s for functions in the range of [%u, %u]",
1160 phase_name, new_range->start, new_range->last);
1163 one_range = next_range;
1164 } while (next_range);
1167 free (argstr);
1170 /* Enable pass specified by ARG. */
1172 void
1173 enable_pass (const char *arg)
1175 enable_disable_pass (arg, true);
1178 /* Disable pass specified by ARG. */
1180 void
1181 disable_pass (const char *arg)
1183 enable_disable_pass (arg, false);
1186 /* Returns true if PASS is explicitly enabled/disabled for FUNC. */
1188 static bool
1189 is_pass_explicitly_enabled_or_disabled (opt_pass *pass,
1190 tree func,
1191 vec<uid_range_p> tab)
1193 uid_range_p slot, range;
1194 int cgraph_uid;
1195 const char *aname = NULL;
1197 if (!tab.exists ()
1198 || (unsigned) pass->static_pass_number >= tab.length ()
1199 || pass->static_pass_number == -1)
1200 return false;
1202 slot = tab[pass->static_pass_number];
1203 if (!slot)
1204 return false;
1206 cgraph_uid = func ? cgraph_node::get (func)->uid : 0;
1207 if (func && DECL_ASSEMBLER_NAME_SET_P (func))
1208 aname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (func));
1210 range = slot;
1211 while (range)
1213 if ((unsigned) cgraph_uid >= range->start
1214 && (unsigned) cgraph_uid <= range->last)
1215 return true;
1216 if (range->assem_name && aname
1217 && !strcmp (range->assem_name, aname))
1218 return true;
1219 range = range->next;
1222 return false;
1226 /* Update static_pass_number for passes (and the flag
1227 TODO_mark_first_instance).
1229 Passes are constructed with static_pass_number preinitialized to 0
1231 This field is used in two different ways: initially as instance numbers
1232 of their kind, and then as ids within the entire pass manager.
1234 Within pass_manager::pass_manager:
1236 * In add_pass_instance(), as called by next_pass_1 in
1237 NEXT_PASS in init_optimization_passes
1239 * When the initial instance of a pass within a pass manager is seen,
1240 it is flagged, and its static_pass_number is set to -1
1242 * On subsequent times that it is seen, the static pass number
1243 is decremented each time, so that if there are e.g. 4 dups,
1244 they have static_pass_number -4, 2, 3, 4 respectively (note
1245 how the initial one is negative and gives the count); these
1246 can be thought of as instance numbers of the specific pass
1248 * Within the register_dump_files () traversal, set_pass_for_id()
1249 is called on each pass, using these instance numbers to create
1250 dumpfile switches, and then overwriting them with a pass id,
1251 which are global to the whole pass manager (based on
1252 (TDI_end + current value of extra_dump_files_in_use) ) */
1254 static void
1255 add_pass_instance (opt_pass *new_pass, bool track_duplicates,
1256 opt_pass *initial_pass)
1258 /* Are we dealing with the first pass of its kind, or a clone? */
1259 if (new_pass != initial_pass)
1261 /* We're dealing with a clone. */
1262 new_pass->todo_flags_start &= ~TODO_mark_first_instance;
1264 /* Indicate to register_dump_files that this pass has duplicates,
1265 and so it should rename the dump file. The first instance will
1266 be -1, and be number of duplicates = -static_pass_number - 1.
1267 Subsequent instances will be > 0 and just the duplicate number. */
1268 if ((new_pass->name && new_pass->name[0] != '*') || track_duplicates)
1270 initial_pass->static_pass_number -= 1;
1271 new_pass->static_pass_number = -initial_pass->static_pass_number;
1274 else
1276 /* We're dealing with the first pass of its kind. */
1277 new_pass->todo_flags_start |= TODO_mark_first_instance;
1278 new_pass->static_pass_number = -1;
1280 invoke_plugin_callbacks (PLUGIN_NEW_PASS, new_pass);
1284 /* Add a pass to the pass list. Duplicate the pass if it's already
1285 in the list. */
1287 static opt_pass **
1288 next_pass_1 (opt_pass **list, opt_pass *pass, opt_pass *initial_pass)
1290 /* Every pass should have a name so that plugins can refer to them. */
1291 gcc_assert (pass->name != NULL);
1293 add_pass_instance (pass, false, initial_pass);
1294 *list = pass;
1296 return &(*list)->next;
1299 /* List node for an inserted pass instance. We need to keep track of all
1300 the newly-added pass instances (with 'added_pass_nodes' defined below)
1301 so that we can register their dump files after pass-positioning is finished.
1302 Registering dumping files needs to be post-processed or the
1303 static_pass_number of the opt_pass object would be modified and mess up
1304 the dump file names of future pass instances to be added. */
1306 struct pass_list_node
1308 opt_pass *pass;
1309 struct pass_list_node *next;
1312 static struct pass_list_node *added_pass_nodes = NULL;
1313 static struct pass_list_node *prev_added_pass_node;
1315 /* Insert the pass at the proper position. Return true if the pass
1316 is successfully added.
1318 NEW_PASS_INFO - new pass to be inserted
1319 PASS_LIST - root of the pass list to insert the new pass to */
1321 static bool
1322 position_pass (struct register_pass_info *new_pass_info, opt_pass **pass_list)
1324 opt_pass *pass = *pass_list, *prev_pass = NULL;
1325 bool success = false;
1327 for ( ; pass; prev_pass = pass, pass = pass->next)
1329 /* Check if the current pass is of the same type as the new pass and
1330 matches the name and the instance number of the reference pass. */
1331 if (pass->type == new_pass_info->pass->type
1332 && pass->name
1333 && !strcmp (pass->name, new_pass_info->reference_pass_name)
1334 && ((new_pass_info->ref_pass_instance_number == 0)
1335 || (new_pass_info->ref_pass_instance_number ==
1336 pass->static_pass_number)
1337 || (new_pass_info->ref_pass_instance_number == 1
1338 && pass->todo_flags_start & TODO_mark_first_instance)))
1340 opt_pass *new_pass;
1341 struct pass_list_node *new_pass_node;
1343 if (new_pass_info->ref_pass_instance_number == 0)
1345 new_pass = new_pass_info->pass->clone ();
1346 add_pass_instance (new_pass, true, new_pass_info->pass);
1348 else
1350 new_pass = new_pass_info->pass;
1351 add_pass_instance (new_pass, true, new_pass);
1354 /* Insert the new pass instance based on the positioning op. */
1355 switch (new_pass_info->pos_op)
1357 case PASS_POS_INSERT_AFTER:
1358 new_pass->next = pass->next;
1359 pass->next = new_pass;
1361 /* Skip newly inserted pass to avoid repeated
1362 insertions in the case where the new pass and the
1363 existing one have the same name. */
1364 pass = new_pass;
1365 break;
1366 case PASS_POS_INSERT_BEFORE:
1367 new_pass->next = pass;
1368 if (prev_pass)
1369 prev_pass->next = new_pass;
1370 else
1371 *pass_list = new_pass;
1372 break;
1373 case PASS_POS_REPLACE:
1374 new_pass->next = pass->next;
1375 if (prev_pass)
1376 prev_pass->next = new_pass;
1377 else
1378 *pass_list = new_pass;
1379 new_pass->sub = pass->sub;
1380 new_pass->tv_id = pass->tv_id;
1381 pass = new_pass;
1382 break;
1383 default:
1384 error ("invalid pass positioning operation");
1385 return false;
1388 /* Save the newly added pass (instance) in the added_pass_nodes
1389 list so that we can register its dump file later. Note that
1390 we cannot register the dump file now because doing so will modify
1391 the static_pass_number of the opt_pass object and therefore
1392 mess up the dump file name of future instances. */
1393 new_pass_node = XCNEW (struct pass_list_node);
1394 new_pass_node->pass = new_pass;
1395 if (!added_pass_nodes)
1396 added_pass_nodes = new_pass_node;
1397 else
1398 prev_added_pass_node->next = new_pass_node;
1399 prev_added_pass_node = new_pass_node;
1401 success = true;
1404 if (pass->sub && position_pass (new_pass_info, &pass->sub))
1405 success = true;
1408 return success;
1411 /* Hooks a new pass into the pass lists.
1413 PASS_INFO - pass information that specifies the opt_pass object,
1414 reference pass, instance number, and how to position
1415 the pass */
1417 void
1418 register_pass (struct register_pass_info *pass_info)
1420 g->get_passes ()->register_pass (pass_info);
1423 void
1424 register_pass (opt_pass* pass, pass_positioning_ops pos,
1425 const char* ref_pass_name, int ref_pass_inst_number)
1427 register_pass_info i;
1428 i.pass = pass;
1429 i.reference_pass_name = ref_pass_name;
1430 i.ref_pass_instance_number = ref_pass_inst_number;
1431 i.pos_op = pos;
1433 g->get_passes ()->register_pass (&i);
1436 void
1437 pass_manager::register_pass (struct register_pass_info *pass_info)
1439 bool all_instances, success;
1440 gcc::dump_manager *dumps = m_ctxt->get_dumps ();
1442 /* The checks below could fail in buggy plugins. Existing GCC
1443 passes should never fail these checks, so we mention plugin in
1444 the messages. */
1445 if (!pass_info->pass)
1446 fatal_error (input_location, "plugin cannot register a missing pass");
1448 if (!pass_info->pass->name)
1449 fatal_error (input_location, "plugin cannot register an unnamed pass");
1451 if (!pass_info->reference_pass_name)
1452 fatal_error
1453 (input_location,
1454 "plugin cannot register pass %qs without reference pass name",
1455 pass_info->pass->name);
1457 /* Try to insert the new pass to the pass lists. We need to check
1458 all five lists as the reference pass could be in one (or all) of
1459 them. */
1460 all_instances = pass_info->ref_pass_instance_number == 0;
1461 success = position_pass (pass_info, &all_lowering_passes);
1462 if (!success || all_instances)
1463 success |= position_pass (pass_info, &all_small_ipa_passes);
1464 if (!success || all_instances)
1465 success |= position_pass (pass_info, &all_regular_ipa_passes);
1466 if (!success || all_instances)
1467 success |= position_pass (pass_info, &all_late_ipa_passes);
1468 if (!success || all_instances)
1469 success |= position_pass (pass_info, &all_passes);
1470 if (!success)
1471 fatal_error
1472 (input_location,
1473 "pass %qs not found but is referenced by new pass %qs",
1474 pass_info->reference_pass_name, pass_info->pass->name);
1476 /* OK, we have successfully inserted the new pass. We need to register
1477 the dump files for the newly added pass and its duplicates (if any).
1478 Because the registration of plugin/backend passes happens after the
1479 command-line options are parsed, the options that specify single
1480 pass dumping (e.g. -fdump-tree-PASSNAME) cannot be used for new
1481 passes. Therefore we currently can only enable dumping of
1482 new passes when the 'dump-all' flags (e.g. -fdump-tree-all)
1483 are specified. While doing so, we also delete the pass_list_node
1484 objects created during pass positioning. */
1485 while (added_pass_nodes)
1487 struct pass_list_node *next_node = added_pass_nodes->next;
1488 enum tree_dump_index tdi;
1489 register_one_dump_file (added_pass_nodes->pass);
1490 if (added_pass_nodes->pass->type == SIMPLE_IPA_PASS
1491 || added_pass_nodes->pass->type == IPA_PASS)
1492 tdi = TDI_ipa_all;
1493 else if (added_pass_nodes->pass->type == GIMPLE_PASS)
1494 tdi = TDI_tree_all;
1495 else
1496 tdi = TDI_rtl_all;
1497 /* Check if dump-all flag is specified. */
1498 if (dumps->get_dump_file_info (tdi)->pstate)
1500 dumps->get_dump_file_info (added_pass_nodes->pass->static_pass_number)
1501 ->pstate = dumps->get_dump_file_info (tdi)->pstate;
1502 dumps->get_dump_file_info (added_pass_nodes->pass->static_pass_number)
1503 ->pflags = dumps->get_dump_file_info (tdi)->pflags;
1505 XDELETE (added_pass_nodes);
1506 added_pass_nodes = next_node;
1510 /* Construct the pass tree. The sequencing of passes is driven by
1511 the cgraph routines:
1513 finalize_compilation_unit ()
1514 for each node N in the cgraph
1515 cgraph_analyze_function (N)
1516 cgraph_lower_function (N) -> all_lowering_passes
1518 If we are optimizing, compile is then invoked:
1520 compile ()
1521 ipa_passes () -> all_small_ipa_passes
1522 -> Analysis of all_regular_ipa_passes
1523 * possible LTO streaming at copmilation time *
1524 -> Execution of all_regular_ipa_passes
1525 * possible LTO streaming at link time *
1526 -> all_late_ipa_passes
1527 expand_all_functions ()
1528 for each node N in the cgraph
1529 expand_function (N) -> Transformation of all_regular_ipa_passes
1530 -> all_passes
1533 pass_manager::pass_manager (context *ctxt)
1534 : all_passes (NULL), all_small_ipa_passes (NULL), all_lowering_passes (NULL),
1535 all_regular_ipa_passes (NULL),
1536 all_late_ipa_passes (NULL), passes_by_id (NULL), passes_by_id_size (0),
1537 m_ctxt (ctxt), m_name_to_pass_map (NULL)
1539 opt_pass **p;
1541 /* Zero-initialize pass members. */
1542 #define INSERT_PASSES_AFTER(PASS)
1543 #define PUSH_INSERT_PASSES_WITHIN(PASS)
1544 #define POP_INSERT_PASSES()
1545 #define NEXT_PASS(PASS, NUM) PASS ## _ ## NUM = NULL
1546 #define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) NEXT_PASS (PASS, NUM)
1547 #define TERMINATE_PASS_LIST(PASS)
1548 #include "pass-instances.def"
1549 #undef INSERT_PASSES_AFTER
1550 #undef PUSH_INSERT_PASSES_WITHIN
1551 #undef POP_INSERT_PASSES
1552 #undef NEXT_PASS
1553 #undef NEXT_PASS_WITH_ARG
1554 #undef TERMINATE_PASS_LIST
1556 /* Initialize the pass_lists array. */
1557 #define DEF_PASS_LIST(LIST) pass_lists[PASS_LIST_NO_##LIST] = &LIST;
1558 GCC_PASS_LISTS
1559 #undef DEF_PASS_LIST
1561 /* Build the tree of passes. */
1563 #define INSERT_PASSES_AFTER(PASS) \
1565 opt_pass **p_start; \
1566 p_start = p = &(PASS);
1568 #define TERMINATE_PASS_LIST(PASS) \
1569 gcc_assert (p_start == &PASS); \
1570 *p = NULL; \
1573 #define PUSH_INSERT_PASSES_WITHIN(PASS) \
1575 opt_pass **p = &(PASS ## _1)->sub;
1577 #define POP_INSERT_PASSES() \
1580 #define NEXT_PASS(PASS, NUM) \
1581 do { \
1582 gcc_assert (NULL == PASS ## _ ## NUM); \
1583 if ((NUM) == 1) \
1584 PASS ## _1 = make_##PASS (m_ctxt); \
1585 else \
1587 gcc_assert (PASS ## _1); \
1588 PASS ## _ ## NUM = PASS ## _1->clone (); \
1590 p = next_pass_1 (p, PASS ## _ ## NUM, PASS ## _1); \
1591 } while (0)
1593 #define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) \
1594 do { \
1595 NEXT_PASS (PASS, NUM); \
1596 PASS ## _ ## NUM->set_pass_param (0, ARG); \
1597 } while (0)
1599 #include "pass-instances.def"
1601 #undef INSERT_PASSES_AFTER
1602 #undef PUSH_INSERT_PASSES_WITHIN
1603 #undef POP_INSERT_PASSES
1604 #undef NEXT_PASS
1605 #undef NEXT_PASS_WITH_ARG
1606 #undef TERMINATE_PASS_LIST
1608 /* Register the passes with the tree dump code. */
1609 register_dump_files (all_lowering_passes);
1610 register_dump_files (all_small_ipa_passes);
1611 register_dump_files (all_regular_ipa_passes);
1612 register_dump_files (all_late_ipa_passes);
1613 register_dump_files (all_passes);
1616 static void
1617 delete_pass_tree (opt_pass *pass)
1619 while (pass)
1621 /* Recurse into child passes. */
1622 delete_pass_tree (pass->sub);
1624 opt_pass *next = pass->next;
1626 /* Delete this pass. */
1627 delete pass;
1629 /* Iterate onto sibling passes. */
1630 pass = next;
1634 pass_manager::~pass_manager ()
1636 XDELETEVEC (passes_by_id);
1638 /* Call delete_pass_tree on each of the pass_lists. */
1639 #define DEF_PASS_LIST(LIST) \
1640 delete_pass_tree (*pass_lists[PASS_LIST_NO_##LIST]);
1641 GCC_PASS_LISTS
1642 #undef DEF_PASS_LIST
1646 /* If we are in IPA mode (i.e., current_function_decl is NULL), call
1647 function CALLBACK for every function in the call graph. Otherwise,
1648 call CALLBACK on the current function. */
1650 static void
1651 do_per_function (void (*callback) (function *, void *data), void *data)
1653 if (current_function_decl)
1654 callback (cfun, data);
1655 else
1657 struct cgraph_node *node;
1658 FOR_EACH_DEFINED_FUNCTION (node)
1659 if (node->analyzed && (gimple_has_body_p (node->decl) && !in_lto_p)
1660 && (!node->clone_of || node->decl != node->clone_of->decl))
1661 callback (DECL_STRUCT_FUNCTION (node->decl), data);
1665 /* Because inlining might remove no-longer reachable nodes, we need to
1666 keep the array visible to garbage collector to avoid reading collected
1667 out nodes. */
1668 static int nnodes;
1669 static GTY ((length ("nnodes"))) cgraph_node **order;
1671 /* Hook called when NODE is removed and therefore should be
1672 excluded from order vector. DATA is an array of integers.
1673 DATA[0] holds max index it may be accessed by. For cgraph
1674 node DATA[node->uid + 1] holds index of this node in order
1675 vector. */
1676 static void
1677 remove_cgraph_node_from_order (cgraph_node *node, void *data)
1679 int *order_idx = (int *)data;
1681 if (node->uid >= order_idx[0])
1682 return;
1684 int idx = order_idx[node->uid + 1];
1685 if (idx >= 0 && idx < nnodes && order[idx] == node)
1686 order[idx] = NULL;
1689 /* If we are in IPA mode (i.e., current_function_decl is NULL), call
1690 function CALLBACK for every function in the call graph. Otherwise,
1691 call CALLBACK on the current function.
1692 This function is global so that plugins can use it. */
1693 void
1694 do_per_function_toporder (void (*callback) (function *, void *data), void *data)
1696 int i;
1698 if (current_function_decl)
1699 callback (cfun, data);
1700 else
1702 cgraph_node_hook_list *hook;
1703 int *order_idx;
1704 gcc_assert (!order);
1705 order = ggc_vec_alloc<cgraph_node *> (symtab->cgraph_count);
1707 order_idx = XALLOCAVEC (int, symtab->cgraph_max_uid + 1);
1708 memset (order_idx + 1, -1, sizeof (int) * symtab->cgraph_max_uid);
1709 order_idx[0] = symtab->cgraph_max_uid;
1711 nnodes = ipa_reverse_postorder (order);
1712 for (i = nnodes - 1; i >= 0; i--)
1714 order[i]->process = 1;
1715 order_idx[order[i]->uid + 1] = i;
1717 hook = symtab->add_cgraph_removal_hook (remove_cgraph_node_from_order,
1718 order_idx);
1719 for (i = nnodes - 1; i >= 0; i--)
1721 /* Function could be inlined and removed as unreachable. */
1722 if (!order[i])
1723 continue;
1725 struct cgraph_node *node = order[i];
1727 /* Allow possibly removed nodes to be garbage collected. */
1728 order[i] = NULL;
1729 node->process = 0;
1730 if (node->has_gimple_body_p ())
1732 struct function *fn = DECL_STRUCT_FUNCTION (node->decl);
1733 push_cfun (fn);
1734 callback (fn, data);
1735 pop_cfun ();
1738 symtab->remove_cgraph_removal_hook (hook);
1740 ggc_free (order);
1741 order = NULL;
1742 nnodes = 0;
1745 /* Helper function to perform function body dump. */
1747 static void
1748 execute_function_dump (function *fn, void *data)
1750 opt_pass *pass = (opt_pass *)data;
1752 if (dump_file)
1754 push_cfun (fn);
1756 if (fn->curr_properties & PROP_trees)
1757 dump_function_to_file (fn->decl, dump_file, dump_flags);
1758 else
1759 print_rtl_with_bb (dump_file, get_insns (), dump_flags);
1761 /* Flush the file. If verification fails, we won't be able to
1762 close the file before aborting. */
1763 fflush (dump_file);
1765 if ((fn->curr_properties & PROP_cfg)
1766 && (dump_flags & TDF_GRAPH))
1768 gcc::dump_manager *dumps = g->get_dumps ();
1769 struct dump_file_info *dfi
1770 = dumps->get_dump_file_info (pass->static_pass_number);
1771 if (!dfi->graph_dump_initialized)
1773 clean_graph_dump_file (dump_file_name);
1774 dfi->graph_dump_initialized = true;
1776 print_graph_cfg (dump_file_name, fn);
1779 pop_cfun ();
1783 /* This function is called when an internal compiler error is encountered.
1784 Ensure that function dump is made available before compiler is aborted. */
1786 void
1787 emergency_dump_function ()
1789 if (!current_pass)
1790 return;
1791 enum opt_pass_type pt = current_pass->type;
1792 fnotice (stderr, "during %s pass: %s\n",
1793 pt == GIMPLE_PASS ? "GIMPLE" : pt == RTL_PASS ? "RTL" : "IPA",
1794 current_pass->name);
1795 if (!dump_file || !cfun)
1796 return;
1797 fnotice (stderr, "dump file: %s\n", dump_file_name);
1798 execute_function_dump (cfun, current_pass);
1801 static struct profile_record *profile_record;
1803 /* Do profile consistency book-keeping for the pass with static number INDEX.
1804 If SUBPASS is zero, we run _before_ the pass, and if SUBPASS is one, then
1805 we run _after_ the pass. RUN is true if the pass really runs, or FALSE
1806 if we are only book-keeping on passes that may have selectively disabled
1807 themselves on a given function. */
1808 static void
1809 check_profile_consistency (int index, int subpass, bool run)
1811 pass_manager *passes = g->get_passes ();
1812 if (index == -1)
1813 return;
1814 if (!profile_record)
1815 profile_record = XCNEWVEC (struct profile_record,
1816 passes->passes_by_id_size);
1817 gcc_assert (index < passes->passes_by_id_size && index >= 0);
1818 gcc_assert (subpass < 2);
1819 profile_record[index].run |= run;
1820 account_profile_record (&profile_record[index], subpass);
1823 /* Output profile consistency. */
1825 void
1826 dump_profile_report (void)
1828 g->get_passes ()->dump_profile_report ();
1831 void
1832 pass_manager::dump_profile_report () const
1834 int i, j;
1835 int last_freq_in = 0, last_count_in = 0, last_freq_out = 0, last_count_out = 0;
1836 gcov_type last_time = 0, last_size = 0;
1837 double rel_time_change, rel_size_change;
1838 int last_reported = 0;
1840 if (!profile_record)
1841 return;
1842 fprintf (stderr, "\nProfile consistency report:\n\n");
1843 fprintf (stderr, "Pass name |mismatch in |mismated out|Overall\n");
1844 fprintf (stderr, " |freq count |freq count |size time\n");
1846 for (i = 0; i < passes_by_id_size; i++)
1847 for (j = 0 ; j < 2; j++)
1848 if (profile_record[i].run)
1850 if (last_time)
1851 rel_time_change = (profile_record[i].time[j]
1852 - (double)last_time) * 100 / (double)last_time;
1853 else
1854 rel_time_change = 0;
1855 if (last_size)
1856 rel_size_change = (profile_record[i].size[j]
1857 - (double)last_size) * 100 / (double)last_size;
1858 else
1859 rel_size_change = 0;
1861 if (profile_record[i].num_mismatched_freq_in[j] != last_freq_in
1862 || profile_record[i].num_mismatched_freq_out[j] != last_freq_out
1863 || profile_record[i].num_mismatched_count_in[j] != last_count_in
1864 || profile_record[i].num_mismatched_count_out[j] != last_count_out
1865 || rel_time_change || rel_size_change)
1867 last_reported = i;
1868 fprintf (stderr, "%-20s %s",
1869 passes_by_id [i]->name,
1870 j ? "(after TODO)" : " ");
1871 if (profile_record[i].num_mismatched_freq_in[j] != last_freq_in)
1872 fprintf (stderr, "| %+5i",
1873 profile_record[i].num_mismatched_freq_in[j]
1874 - last_freq_in);
1875 else
1876 fprintf (stderr, "| ");
1877 if (profile_record[i].num_mismatched_count_in[j] != last_count_in)
1878 fprintf (stderr, " %+5i",
1879 profile_record[i].num_mismatched_count_in[j]
1880 - last_count_in);
1881 else
1882 fprintf (stderr, " ");
1883 if (profile_record[i].num_mismatched_freq_out[j] != last_freq_out)
1884 fprintf (stderr, "| %+5i",
1885 profile_record[i].num_mismatched_freq_out[j]
1886 - last_freq_out);
1887 else
1888 fprintf (stderr, "| ");
1889 if (profile_record[i].num_mismatched_count_out[j] != last_count_out)
1890 fprintf (stderr, " %+5i",
1891 profile_record[i].num_mismatched_count_out[j]
1892 - last_count_out);
1893 else
1894 fprintf (stderr, " ");
1896 /* Size/time units change across gimple and RTL. */
1897 if (i == pass_expand_1->static_pass_number)
1898 fprintf (stderr, "|----------");
1899 else
1901 if (rel_size_change)
1902 fprintf (stderr, "| %+8.4f%%", rel_size_change);
1903 else
1904 fprintf (stderr, "| ");
1905 if (rel_time_change)
1906 fprintf (stderr, " %+8.4f%%", rel_time_change);
1908 fprintf (stderr, "\n");
1909 last_freq_in = profile_record[i].num_mismatched_freq_in[j];
1910 last_freq_out = profile_record[i].num_mismatched_freq_out[j];
1911 last_count_in = profile_record[i].num_mismatched_count_in[j];
1912 last_count_out = profile_record[i].num_mismatched_count_out[j];
1914 else if (j && last_reported != i)
1916 last_reported = i;
1917 fprintf (stderr, "%-20s ------------| | |\n",
1918 passes_by_id [i]->name);
1920 last_time = profile_record[i].time[j];
1921 last_size = profile_record[i].size[j];
1925 /* Perform all TODO actions that ought to be done on each function. */
1927 static void
1928 execute_function_todo (function *fn, void *data)
1930 bool from_ipa_pass = (cfun == NULL);
1931 unsigned int flags = (size_t)data;
1932 flags &= ~fn->last_verified;
1933 if (!flags)
1934 return;
1936 push_cfun (fn);
1938 /* Always cleanup the CFG before trying to update SSA. */
1939 if (flags & TODO_cleanup_cfg)
1941 cleanup_tree_cfg ();
1943 /* When cleanup_tree_cfg merges consecutive blocks, it may
1944 perform some simplistic propagation when removing single
1945 valued PHI nodes. This propagation may, in turn, cause the
1946 SSA form to become out-of-date (see PR 22037). So, even
1947 if the parent pass had not scheduled an SSA update, we may
1948 still need to do one. */
1949 if (!(flags & TODO_update_ssa_any) && need_ssa_update_p (cfun))
1950 flags |= TODO_update_ssa;
1953 if (flags & TODO_update_ssa_any)
1955 unsigned update_flags = flags & TODO_update_ssa_any;
1956 update_ssa (update_flags);
1959 if (flag_tree_pta && (flags & TODO_rebuild_alias))
1960 compute_may_aliases ();
1962 if (optimize && (flags & TODO_update_address_taken))
1963 execute_update_addresses_taken ();
1965 if (flags & TODO_remove_unused_locals)
1966 remove_unused_locals ();
1968 if (flags & TODO_rebuild_frequencies)
1969 rebuild_frequencies ();
1971 if (flags & TODO_rebuild_cgraph_edges)
1972 cgraph_edge::rebuild_edges ();
1974 gcc_assert (dom_info_state (fn, CDI_POST_DOMINATORS) == DOM_NONE);
1975 /* If we've seen errors do not bother running any verifiers. */
1976 if (flag_checking && !seen_error ())
1978 dom_state pre_verify_state = dom_info_state (fn, CDI_DOMINATORS);
1979 dom_state pre_verify_pstate = dom_info_state (fn, CDI_POST_DOMINATORS);
1981 if (flags & TODO_verify_il)
1983 if (cfun->curr_properties & PROP_trees)
1985 if (cfun->curr_properties & PROP_cfg)
1986 /* IPA passes leave stmts to be fixed up, so make sure to
1987 not verify stmts really throw. */
1988 verify_gimple_in_cfg (cfun, !from_ipa_pass);
1989 else
1990 verify_gimple_in_seq (gimple_body (cfun->decl));
1992 if (cfun->curr_properties & PROP_ssa)
1993 /* IPA passes leave stmts to be fixed up, so make sure to
1994 not verify SSA operands whose verifier will choke on that. */
1995 verify_ssa (true, !from_ipa_pass);
1996 /* IPA passes leave basic-blocks unsplit, so make sure to
1997 not trip on that. */
1998 if ((cfun->curr_properties & PROP_cfg)
1999 && !from_ipa_pass)
2000 verify_flow_info ();
2001 if (current_loops
2002 && ! loops_state_satisfies_p (LOOPS_NEED_FIXUP))
2004 verify_loop_structure ();
2005 if (loops_state_satisfies_p (LOOP_CLOSED_SSA))
2006 verify_loop_closed_ssa (false);
2008 if (cfun->curr_properties & PROP_rtl)
2009 verify_rtl_sharing ();
2012 /* Make sure verifiers don't change dominator state. */
2013 gcc_assert (dom_info_state (fn, CDI_DOMINATORS) == pre_verify_state);
2014 gcc_assert (dom_info_state (fn, CDI_POST_DOMINATORS) == pre_verify_pstate);
2017 fn->last_verified = flags & TODO_verify_all;
2019 pop_cfun ();
2021 /* For IPA passes make sure to release dominator info, it can be
2022 computed by non-verifying TODOs. */
2023 if (from_ipa_pass)
2025 free_dominance_info (fn, CDI_DOMINATORS);
2026 free_dominance_info (fn, CDI_POST_DOMINATORS);
2030 /* Perform all TODO actions. */
2031 static void
2032 execute_todo (unsigned int flags)
2034 if (flag_checking
2035 && cfun
2036 && need_ssa_update_p (cfun))
2037 gcc_assert (flags & TODO_update_ssa_any);
2039 statistics_fini_pass ();
2041 if (flags)
2042 do_per_function (execute_function_todo, (void *)(size_t) flags);
2044 /* At this point we should not have any unreachable code in the
2045 CFG, so it is safe to flush the pending freelist for SSA_NAMES. */
2046 if (cfun && cfun->gimple_df)
2047 flush_ssaname_freelist ();
2049 /* Always remove functions just as before inlining: IPA passes might be
2050 interested to see bodies of extern inline functions that are not inlined
2051 to analyze side effects. The full removal is done just at the end
2052 of IPA pass queue. */
2053 if (flags & TODO_remove_functions)
2055 gcc_assert (!cfun);
2056 symtab->remove_unreachable_nodes (dump_file);
2059 if ((flags & TODO_dump_symtab) && dump_file && !current_function_decl)
2061 gcc_assert (!cfun);
2062 symtab->dump (dump_file);
2063 /* Flush the file. If verification fails, we won't be able to
2064 close the file before aborting. */
2065 fflush (dump_file);
2068 /* Now that the dumping has been done, we can get rid of the optional
2069 df problems. */
2070 if (flags & TODO_df_finish)
2071 df_finish_pass ((flags & TODO_df_verify) != 0);
2074 /* Verify invariants that should hold between passes. This is a place
2075 to put simple sanity checks. */
2077 static void
2078 verify_interpass_invariants (void)
2080 gcc_checking_assert (!fold_deferring_overflow_warnings_p ());
2083 /* Clear the last verified flag. */
2085 static void
2086 clear_last_verified (function *fn, void *data ATTRIBUTE_UNUSED)
2088 fn->last_verified = 0;
2091 /* Helper function. Verify that the properties has been turn into the
2092 properties expected by the pass. */
2094 static void
2095 verify_curr_properties (function *fn, void *data)
2097 unsigned int props = (size_t)data;
2098 gcc_assert ((fn->curr_properties & props) == props);
2101 /* Release dump file name if set. */
2103 static void
2104 release_dump_file_name (void)
2106 if (dump_file_name)
2108 free (CONST_CAST (char *, dump_file_name));
2109 dump_file_name = NULL;
2113 /* Initialize pass dump file. */
2114 /* This is non-static so that the plugins can use it. */
2116 bool
2117 pass_init_dump_file (opt_pass *pass)
2119 /* If a dump file name is present, open it if enabled. */
2120 if (pass->static_pass_number != -1)
2122 timevar_push (TV_DUMP);
2123 gcc::dump_manager *dumps = g->get_dumps ();
2124 bool initializing_dump =
2125 !dumps->dump_initialized_p (pass->static_pass_number);
2126 release_dump_file_name ();
2127 dump_file_name = dumps->get_dump_file_name (pass->static_pass_number);
2128 dumps->dump_start (pass->static_pass_number, &dump_flags);
2129 if (dump_file && current_function_decl && ! (dump_flags & TDF_GIMPLE))
2130 dump_function_header (dump_file, current_function_decl, dump_flags);
2131 if (initializing_dump
2132 && dump_file && (dump_flags & TDF_GRAPH)
2133 && cfun && (cfun->curr_properties & PROP_cfg))
2135 clean_graph_dump_file (dump_file_name);
2136 struct dump_file_info *dfi
2137 = dumps->get_dump_file_info (pass->static_pass_number);
2138 dfi->graph_dump_initialized = true;
2140 timevar_pop (TV_DUMP);
2141 return initializing_dump;
2143 else
2144 return false;
2147 /* Flush PASS dump file. */
2148 /* This is non-static so that plugins can use it. */
2150 void
2151 pass_fini_dump_file (opt_pass *pass)
2153 timevar_push (TV_DUMP);
2155 /* Flush and close dump file. */
2156 release_dump_file_name ();
2158 g->get_dumps ()->dump_finish (pass->static_pass_number);
2159 timevar_pop (TV_DUMP);
2162 /* After executing the pass, apply expected changes to the function
2163 properties. */
2165 static void
2166 update_properties_after_pass (function *fn, void *data)
2168 opt_pass *pass = (opt_pass *) data;
2169 fn->curr_properties = (fn->curr_properties | pass->properties_provided)
2170 & ~pass->properties_destroyed;
2173 /* Execute summary generation for all of the passes in IPA_PASS. */
2175 void
2176 execute_ipa_summary_passes (ipa_opt_pass_d *ipa_pass)
2178 while (ipa_pass)
2180 opt_pass *pass = ipa_pass;
2182 /* Execute all of the IPA_PASSes in the list. */
2183 if (ipa_pass->type == IPA_PASS
2184 && pass->gate (cfun)
2185 && ipa_pass->generate_summary)
2187 pass_init_dump_file (pass);
2189 /* If a timevar is present, start it. */
2190 if (pass->tv_id)
2191 timevar_push (pass->tv_id);
2193 current_pass = pass;
2194 ipa_pass->generate_summary ();
2196 /* Stop timevar. */
2197 if (pass->tv_id)
2198 timevar_pop (pass->tv_id);
2200 pass_fini_dump_file (pass);
2202 ipa_pass = (ipa_opt_pass_d *)ipa_pass->next;
2206 /* Execute IPA_PASS function transform on NODE. */
2208 static void
2209 execute_one_ipa_transform_pass (struct cgraph_node *node,
2210 ipa_opt_pass_d *ipa_pass)
2212 opt_pass *pass = ipa_pass;
2213 unsigned int todo_after = 0;
2215 current_pass = pass;
2216 if (!ipa_pass->function_transform)
2217 return;
2219 /* Note that the folders should only create gimple expressions.
2220 This is a hack until the new folder is ready. */
2221 in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
2223 pass_init_dump_file (pass);
2225 /* If a timevar is present, start it. */
2226 if (pass->tv_id != TV_NONE)
2227 timevar_push (pass->tv_id);
2229 /* Run pre-pass verification. */
2230 execute_todo (ipa_pass->function_transform_todo_flags_start);
2232 /* Do it! */
2233 todo_after = ipa_pass->function_transform (node);
2235 if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
2236 check_profile_consistency (pass->static_pass_number, 0, true);
2238 /* Run post-pass cleanup and verification. */
2239 execute_todo (todo_after);
2240 verify_interpass_invariants ();
2241 if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
2242 check_profile_consistency (pass->static_pass_number, 1, true);
2244 /* Stop timevar. */
2245 if (pass->tv_id != TV_NONE)
2246 timevar_pop (pass->tv_id);
2248 if (dump_file)
2249 do_per_function (execute_function_dump, pass);
2250 pass_fini_dump_file (pass);
2252 current_pass = NULL;
2253 redirect_edge_var_map_empty ();
2255 /* Signal this is a suitable GC collection point. */
2256 if (!(todo_after & TODO_do_not_ggc_collect))
2257 ggc_collect ();
2260 /* For the current function, execute all ipa transforms. */
2262 void
2263 execute_all_ipa_transforms (void)
2265 struct cgraph_node *node;
2266 if (!cfun)
2267 return;
2268 node = cgraph_node::get (current_function_decl);
2270 if (node->ipa_transforms_to_apply.exists ())
2272 unsigned int i;
2274 for (i = 0; i < node->ipa_transforms_to_apply.length (); i++)
2275 execute_one_ipa_transform_pass (node, node->ipa_transforms_to_apply[i]);
2276 node->ipa_transforms_to_apply.release ();
2280 /* Check if PASS is explicitly disabled or enabled and return
2281 the gate status. FUNC is the function to be processed, and
2282 GATE_STATUS is the gate status determined by pass manager by
2283 default. */
2285 static bool
2286 override_gate_status (opt_pass *pass, tree func, bool gate_status)
2288 bool explicitly_enabled = false;
2289 bool explicitly_disabled = false;
2291 explicitly_enabled
2292 = is_pass_explicitly_enabled_or_disabled (pass, func,
2293 enabled_pass_uid_range_tab);
2294 explicitly_disabled
2295 = is_pass_explicitly_enabled_or_disabled (pass, func,
2296 disabled_pass_uid_range_tab);
2298 gate_status = !explicitly_disabled && (gate_status || explicitly_enabled);
2300 return gate_status;
2303 /* Determine if PASS_NAME matches CRITERION.
2304 Not a pure predicate, since it can update CRITERION, to support
2305 matching the Nth invocation of a pass.
2306 Subroutine of should_skip_pass_p. */
2308 static bool
2309 determine_pass_name_match (const char *pass_name, char *criterion)
2311 size_t namelen = strlen (pass_name);
2312 if (! strncmp (pass_name, criterion, namelen))
2314 /* The following supports starting with the Nth invocation
2315 of a pass (where N does not necessarily is equal to the
2316 dump file suffix). */
2317 if (criterion[namelen] == '\0'
2318 || (criterion[namelen] == '1'
2319 && criterion[namelen + 1] == '\0'))
2320 return true;
2321 else
2323 if (criterion[namelen + 1] == '\0')
2324 --criterion[namelen];
2325 return false;
2328 else
2329 return false;
2332 /* For skipping passes until "startwith" pass.
2333 Return true iff PASS should be skipped.
2334 Clear cfun->pass_startwith when encountering the "startwith" pass,
2335 so that all subsequent passes are run. */
2337 static bool
2338 should_skip_pass_p (opt_pass *pass)
2340 if (!cfun)
2341 return false;
2342 if (!cfun->pass_startwith)
2343 return false;
2345 /* For __GIMPLE functions, we have to at least start when we leave
2346 SSA. Hence, we need to detect the "expand" pass, and stop skipping
2347 when we encounter it. A cheap way to identify "expand" is it to
2348 detect the destruction of PROP_ssa.
2349 For __RTL functions, we invoke "rest_of_compilation" directly, which
2350 is after "expand", and hence we don't reach this conditional. */
2351 if (pass->properties_destroyed & PROP_ssa)
2353 if (!quiet_flag)
2354 fprintf (stderr, "starting anyway when leaving SSA: %s\n", pass->name);
2355 cfun->pass_startwith = NULL;
2356 return false;
2359 if (determine_pass_name_match (pass->name, cfun->pass_startwith))
2361 if (!quiet_flag)
2362 fprintf (stderr, "found starting pass: %s\n", pass->name);
2363 cfun->pass_startwith = NULL;
2364 return false;
2367 /* For GIMPLE passes, run any property provider (but continue skipping
2368 afterwards).
2369 We don't want to force running RTL passes that are property providers:
2370 "expand" is covered above, and the only pass other than "expand" that
2371 provides a property is "into_cfglayout" (PROP_cfglayout), which does
2372 too much for a dumped __RTL function. */
2373 if (pass->type == GIMPLE_PASS
2374 && pass->properties_provided != 0)
2375 return false;
2377 /* Don't skip df init; later RTL passes need it. */
2378 if (strstr (pass->name, "dfinit") != NULL)
2379 return false;
2381 if (!quiet_flag)
2382 fprintf (stderr, "skipping pass: %s\n", pass->name);
2384 /* If we get here, then we have a "startwith" that we haven't seen yet;
2385 skip the pass. */
2386 return true;
2389 /* Skip the given pass, for handling passes before "startwith"
2390 in __GIMPLE and__RTL-marked functions.
2391 In theory, this ought to be a no-op, but some of the RTL passes
2392 need additional processing here. */
2394 static void
2395 skip_pass (opt_pass *pass)
2397 /* Pass "reload" sets the global "reload_completed", and many
2398 things depend on this (e.g. instructions in .md files). */
2399 if (strcmp (pass->name, "reload") == 0)
2400 reload_completed = 1;
2402 /* The INSN_ADDRESSES vec is normally set up by
2403 shorten_branches; set it up for the benefit of passes that
2404 run after this. */
2405 if (strcmp (pass->name, "shorten") == 0)
2406 INSN_ADDRESSES_ALLOC (get_max_uid ());
2408 /* Update the cfg hooks as appropriate. */
2409 if (strcmp (pass->name, "into_cfglayout") == 0)
2411 cfg_layout_rtl_register_cfg_hooks ();
2412 cfun->curr_properties |= PROP_cfglayout;
2414 if (strcmp (pass->name, "outof_cfglayout") == 0)
2416 rtl_register_cfg_hooks ();
2417 cfun->curr_properties &= ~PROP_cfglayout;
2421 /* Execute PASS. */
2423 bool
2424 execute_one_pass (opt_pass *pass)
2426 unsigned int todo_after = 0;
2428 bool gate_status;
2430 /* IPA passes are executed on whole program, so cfun should be NULL.
2431 Other passes need function context set. */
2432 if (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS)
2433 gcc_assert (!cfun && !current_function_decl);
2434 else
2435 gcc_assert (cfun && current_function_decl);
2437 current_pass = pass;
2439 /* Check whether gate check should be avoided.
2440 User controls the value of the gate through the parameter "gate_status". */
2441 gate_status = pass->gate (cfun);
2442 gate_status = override_gate_status (pass, current_function_decl, gate_status);
2444 /* Override gate with plugin. */
2445 invoke_plugin_callbacks (PLUGIN_OVERRIDE_GATE, &gate_status);
2447 if (!gate_status)
2449 /* Run so passes selectively disabling themselves on a given function
2450 are not miscounted. */
2451 if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
2453 check_profile_consistency (pass->static_pass_number, 0, false);
2454 check_profile_consistency (pass->static_pass_number, 1, false);
2456 current_pass = NULL;
2457 return false;
2460 if (should_skip_pass_p (pass))
2462 skip_pass (pass);
2463 return true;
2466 /* Pass execution event trigger: useful to identify passes being
2467 executed. */
2468 invoke_plugin_callbacks (PLUGIN_PASS_EXECUTION, pass);
2470 if (!quiet_flag && !cfun)
2471 fprintf (stderr, " <%s>", pass->name ? pass->name : "");
2473 /* Note that the folders should only create gimple expressions.
2474 This is a hack until the new folder is ready. */
2475 in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
2477 pass_init_dump_file (pass);
2479 /* If a timevar is present, start it. */
2480 if (pass->tv_id != TV_NONE)
2481 timevar_push (pass->tv_id);
2483 /* Run pre-pass verification. */
2484 execute_todo (pass->todo_flags_start);
2486 if (flag_checking)
2487 do_per_function (verify_curr_properties,
2488 (void *)(size_t)pass->properties_required);
2490 /* Do it! */
2491 todo_after = pass->execute (cfun);
2493 if (todo_after & TODO_discard_function)
2495 /* Stop timevar. */
2496 if (pass->tv_id != TV_NONE)
2497 timevar_pop (pass->tv_id);
2499 pass_fini_dump_file (pass);
2501 gcc_assert (cfun);
2502 /* As cgraph_node::release_body expects release dominators info,
2503 we have to release it. */
2504 if (dom_info_available_p (CDI_DOMINATORS))
2505 free_dominance_info (CDI_DOMINATORS);
2507 if (dom_info_available_p (CDI_POST_DOMINATORS))
2508 free_dominance_info (CDI_POST_DOMINATORS);
2510 tree fn = cfun->decl;
2511 pop_cfun ();
2512 gcc_assert (!cfun);
2513 cgraph_node::get (fn)->release_body ();
2515 current_pass = NULL;
2516 redirect_edge_var_map_empty ();
2518 ggc_collect ();
2520 return true;
2523 do_per_function (clear_last_verified, NULL);
2525 do_per_function (update_properties_after_pass, pass);
2527 if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
2528 check_profile_consistency (pass->static_pass_number, 0, true);
2530 /* Run post-pass cleanup and verification. */
2531 execute_todo (todo_after | pass->todo_flags_finish | TODO_verify_il);
2532 if (profile_report && cfun && (cfun->curr_properties & PROP_cfg))
2533 check_profile_consistency (pass->static_pass_number, 1, true);
2535 verify_interpass_invariants ();
2537 /* Stop timevar. */
2538 if (pass->tv_id != TV_NONE)
2539 timevar_pop (pass->tv_id);
2541 if (pass->type == IPA_PASS
2542 && ((ipa_opt_pass_d *)pass)->function_transform)
2544 struct cgraph_node *node;
2545 FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
2546 node->ipa_transforms_to_apply.safe_push ((ipa_opt_pass_d *)pass);
2548 else if (dump_file)
2549 do_per_function (execute_function_dump, pass);
2551 if (!current_function_decl)
2552 symtab->process_new_functions ();
2554 pass_fini_dump_file (pass);
2556 if (pass->type != SIMPLE_IPA_PASS && pass->type != IPA_PASS)
2557 gcc_assert (!(cfun->curr_properties & PROP_trees)
2558 || pass->type != RTL_PASS);
2560 current_pass = NULL;
2561 redirect_edge_var_map_empty ();
2563 /* Signal this is a suitable GC collection point. */
2564 if (!((todo_after | pass->todo_flags_finish) & TODO_do_not_ggc_collect))
2565 ggc_collect ();
2567 return true;
2570 static void
2571 execute_pass_list_1 (opt_pass *pass)
2575 gcc_assert (pass->type == GIMPLE_PASS
2576 || pass->type == RTL_PASS);
2578 if (cfun == NULL)
2579 return;
2580 if (execute_one_pass (pass) && pass->sub)
2581 execute_pass_list_1 (pass->sub);
2582 pass = pass->next;
2584 while (pass);
2587 void
2588 execute_pass_list (function *fn, opt_pass *pass)
2590 gcc_assert (fn == cfun);
2591 execute_pass_list_1 (pass);
2592 if (cfun && fn->cfg)
2594 free_dominance_info (CDI_DOMINATORS);
2595 free_dominance_info (CDI_POST_DOMINATORS);
2599 /* Write out all LTO data. */
2600 static void
2601 write_lto (void)
2603 timevar_push (TV_IPA_LTO_GIMPLE_OUT);
2604 lto_output ();
2605 timevar_pop (TV_IPA_LTO_GIMPLE_OUT);
2606 timevar_push (TV_IPA_LTO_DECL_OUT);
2607 produce_asm_for_decls ();
2608 timevar_pop (TV_IPA_LTO_DECL_OUT);
2611 /* Same as execute_pass_list but assume that subpasses of IPA passes
2612 are local passes. If SET is not NULL, write out summaries of only
2613 those node in SET. */
2615 static void
2616 ipa_write_summaries_2 (opt_pass *pass, struct lto_out_decl_state *state)
2618 while (pass)
2620 ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *)pass;
2621 gcc_assert (!current_function_decl);
2622 gcc_assert (!cfun);
2623 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2624 if (pass->type == IPA_PASS
2625 && ipa_pass->write_summary
2626 && pass->gate (cfun))
2628 /* If a timevar is present, start it. */
2629 if (pass->tv_id)
2630 timevar_push (pass->tv_id);
2632 pass_init_dump_file (pass);
2634 current_pass = pass;
2635 ipa_pass->write_summary ();
2637 pass_fini_dump_file (pass);
2639 /* If a timevar is present, start it. */
2640 if (pass->tv_id)
2641 timevar_pop (pass->tv_id);
2644 if (pass->sub && pass->sub->type != GIMPLE_PASS)
2645 ipa_write_summaries_2 (pass->sub, state);
2647 pass = pass->next;
2651 /* Helper function of ipa_write_summaries. Creates and destroys the
2652 decl state and calls ipa_write_summaries_2 for all passes that have
2653 summaries. SET is the set of nodes to be written. */
2655 static void
2656 ipa_write_summaries_1 (lto_symtab_encoder_t encoder)
2658 pass_manager *passes = g->get_passes ();
2659 struct lto_out_decl_state *state = lto_new_out_decl_state ();
2660 state->symtab_node_encoder = encoder;
2662 lto_output_init_mode_table ();
2663 lto_push_out_decl_state (state);
2665 gcc_assert (!flag_wpa);
2666 ipa_write_summaries_2 (passes->all_regular_ipa_passes, state);
2668 write_lto ();
2670 gcc_assert (lto_get_out_decl_state () == state);
2671 lto_pop_out_decl_state ();
2672 lto_delete_out_decl_state (state);
2675 /* Write out summaries for all the nodes in the callgraph. */
2677 void
2678 ipa_write_summaries (void)
2680 lto_symtab_encoder_t encoder;
2681 int i, order_pos;
2682 varpool_node *vnode;
2683 struct cgraph_node *node;
2684 struct cgraph_node **order;
2686 if ((!flag_generate_lto && !flag_generate_offload) || seen_error ())
2687 return;
2689 select_what_to_stream ();
2691 encoder = lto_symtab_encoder_new (false);
2693 /* Create the callgraph set in the same order used in
2694 cgraph_expand_all_functions. This mostly facilitates debugging,
2695 since it causes the gimple file to be processed in the same order
2696 as the source code. */
2697 order = XCNEWVEC (struct cgraph_node *, symtab->cgraph_count);
2698 order_pos = ipa_reverse_postorder (order);
2699 gcc_assert (order_pos == symtab->cgraph_count);
2701 for (i = order_pos - 1; i >= 0; i--)
2703 struct cgraph_node *node = order[i];
2705 if (node->has_gimple_body_p ())
2707 /* When streaming out references to statements as part of some IPA
2708 pass summary, the statements need to have uids assigned and the
2709 following does that for all the IPA passes here. Naturally, this
2710 ordering then matches the one IPA-passes get in their stmt_fixup
2711 hooks. */
2713 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2714 renumber_gimple_stmt_uids ();
2715 pop_cfun ();
2717 if (node->definition && node->need_lto_streaming)
2718 lto_set_symtab_encoder_in_partition (encoder, node);
2721 FOR_EACH_DEFINED_FUNCTION (node)
2722 if (node->alias && node->need_lto_streaming)
2723 lto_set_symtab_encoder_in_partition (encoder, node);
2724 FOR_EACH_DEFINED_VARIABLE (vnode)
2725 if (vnode->need_lto_streaming)
2726 lto_set_symtab_encoder_in_partition (encoder, vnode);
2728 ipa_write_summaries_1 (compute_ltrans_boundary (encoder));
2730 free (order);
2733 /* Same as execute_pass_list but assume that subpasses of IPA passes
2734 are local passes. If SET is not NULL, write out optimization summaries of
2735 only those node in SET. */
2737 static void
2738 ipa_write_optimization_summaries_1 (opt_pass *pass,
2739 struct lto_out_decl_state *state)
2741 while (pass)
2743 ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *)pass;
2744 gcc_assert (!current_function_decl);
2745 gcc_assert (!cfun);
2746 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2747 if (pass->type == IPA_PASS
2748 && ipa_pass->write_optimization_summary
2749 && pass->gate (cfun))
2751 /* If a timevar is present, start it. */
2752 if (pass->tv_id)
2753 timevar_push (pass->tv_id);
2755 pass_init_dump_file (pass);
2757 current_pass = pass;
2758 ipa_pass->write_optimization_summary ();
2760 pass_fini_dump_file (pass);
2762 /* If a timevar is present, start it. */
2763 if (pass->tv_id)
2764 timevar_pop (pass->tv_id);
2767 if (pass->sub && pass->sub->type != GIMPLE_PASS)
2768 ipa_write_optimization_summaries_1 (pass->sub, state);
2770 pass = pass->next;
2774 /* Write all the optimization summaries for the cgraph nodes in SET. If SET is
2775 NULL, write out all summaries of all nodes. */
2777 void
2778 ipa_write_optimization_summaries (lto_symtab_encoder_t encoder)
2780 struct lto_out_decl_state *state = lto_new_out_decl_state ();
2781 lto_symtab_encoder_iterator lsei;
2782 state->symtab_node_encoder = encoder;
2784 lto_output_init_mode_table ();
2785 lto_push_out_decl_state (state);
2786 for (lsei = lsei_start_function_in_partition (encoder);
2787 !lsei_end_p (lsei); lsei_next_function_in_partition (&lsei))
2789 struct cgraph_node *node = lsei_cgraph_node (lsei);
2790 /* When streaming out references to statements as part of some IPA
2791 pass summary, the statements need to have uids assigned.
2793 For functions newly born at WPA stage we need to initialize
2794 the uids here. */
2795 if (node->definition
2796 && gimple_has_body_p (node->decl))
2798 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2799 renumber_gimple_stmt_uids ();
2800 pop_cfun ();
2804 gcc_assert (flag_wpa);
2805 pass_manager *passes = g->get_passes ();
2806 ipa_write_optimization_summaries_1 (passes->all_regular_ipa_passes, state);
2808 write_lto ();
2810 gcc_assert (lto_get_out_decl_state () == state);
2811 lto_pop_out_decl_state ();
2812 lto_delete_out_decl_state (state);
2815 /* Same as execute_pass_list but assume that subpasses of IPA passes
2816 are local passes. */
2818 static void
2819 ipa_read_summaries_1 (opt_pass *pass)
2821 while (pass)
2823 ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *) pass;
2825 gcc_assert (!current_function_decl);
2826 gcc_assert (!cfun);
2827 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2829 if (pass->gate (cfun))
2831 if (pass->type == IPA_PASS && ipa_pass->read_summary)
2833 /* If a timevar is present, start it. */
2834 if (pass->tv_id)
2835 timevar_push (pass->tv_id);
2837 pass_init_dump_file (pass);
2839 current_pass = pass;
2840 ipa_pass->read_summary ();
2842 pass_fini_dump_file (pass);
2844 /* Stop timevar. */
2845 if (pass->tv_id)
2846 timevar_pop (pass->tv_id);
2849 if (pass->sub && pass->sub->type != GIMPLE_PASS)
2850 ipa_read_summaries_1 (pass->sub);
2852 pass = pass->next;
2857 /* Read all the summaries for all_regular_ipa_passes. */
2859 void
2860 ipa_read_summaries (void)
2862 pass_manager *passes = g->get_passes ();
2863 ipa_read_summaries_1 (passes->all_regular_ipa_passes);
2866 /* Same as execute_pass_list but assume that subpasses of IPA passes
2867 are local passes. */
2869 static void
2870 ipa_read_optimization_summaries_1 (opt_pass *pass)
2872 while (pass)
2874 ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *) pass;
2876 gcc_assert (!current_function_decl);
2877 gcc_assert (!cfun);
2878 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2880 if (pass->gate (cfun))
2882 if (pass->type == IPA_PASS && ipa_pass->read_optimization_summary)
2884 /* If a timevar is present, start it. */
2885 if (pass->tv_id)
2886 timevar_push (pass->tv_id);
2888 pass_init_dump_file (pass);
2890 current_pass = pass;
2891 ipa_pass->read_optimization_summary ();
2893 pass_fini_dump_file (pass);
2895 /* Stop timevar. */
2896 if (pass->tv_id)
2897 timevar_pop (pass->tv_id);
2900 if (pass->sub && pass->sub->type != GIMPLE_PASS)
2901 ipa_read_optimization_summaries_1 (pass->sub);
2903 pass = pass->next;
2907 /* Read all the summaries for all_regular_ipa_passes. */
2909 void
2910 ipa_read_optimization_summaries (void)
2912 pass_manager *passes = g->get_passes ();
2913 ipa_read_optimization_summaries_1 (passes->all_regular_ipa_passes);
2916 /* Same as execute_pass_list but assume that subpasses of IPA passes
2917 are local passes. */
2918 void
2919 execute_ipa_pass_list (opt_pass *pass)
2923 gcc_assert (!current_function_decl);
2924 gcc_assert (!cfun);
2925 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2926 if (execute_one_pass (pass) && pass->sub)
2928 if (pass->sub->type == GIMPLE_PASS)
2930 invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_START, NULL);
2931 do_per_function_toporder ((void (*)(function *, void *))
2932 execute_pass_list,
2933 pass->sub);
2934 invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_END, NULL);
2936 else if (pass->sub->type == SIMPLE_IPA_PASS
2937 || pass->sub->type == IPA_PASS)
2938 execute_ipa_pass_list (pass->sub);
2939 else
2940 gcc_unreachable ();
2942 gcc_assert (!current_function_decl);
2943 symtab->process_new_functions ();
2944 pass = pass->next;
2946 while (pass);
2949 /* Execute stmt fixup hooks of all passes in PASS for NODE and STMTS. */
2951 static void
2952 execute_ipa_stmt_fixups (opt_pass *pass,
2953 struct cgraph_node *node, gimple **stmts)
2955 while (pass)
2957 /* Execute all of the IPA_PASSes in the list. */
2958 if (pass->type == IPA_PASS
2959 && pass->gate (cfun))
2961 ipa_opt_pass_d *ipa_pass = (ipa_opt_pass_d *) pass;
2963 if (ipa_pass->stmt_fixup)
2965 pass_init_dump_file (pass);
2966 /* If a timevar is present, start it. */
2967 if (pass->tv_id)
2968 timevar_push (pass->tv_id);
2970 current_pass = pass;
2971 ipa_pass->stmt_fixup (node, stmts);
2973 /* Stop timevar. */
2974 if (pass->tv_id)
2975 timevar_pop (pass->tv_id);
2976 pass_fini_dump_file (pass);
2978 if (pass->sub)
2979 execute_ipa_stmt_fixups (pass->sub, node, stmts);
2981 pass = pass->next;
2985 /* Execute stmt fixup hooks of all IPA passes for NODE and STMTS. */
2987 void
2988 execute_all_ipa_stmt_fixups (struct cgraph_node *node, gimple **stmts)
2990 pass_manager *passes = g->get_passes ();
2991 execute_ipa_stmt_fixups (passes->all_regular_ipa_passes, node, stmts);
2995 extern void debug_properties (unsigned int);
2996 extern void dump_properties (FILE *, unsigned int);
2998 DEBUG_FUNCTION void
2999 dump_properties (FILE *dump, unsigned int props)
3001 fprintf (dump, "Properties:\n");
3002 if (props & PROP_gimple_any)
3003 fprintf (dump, "PROP_gimple_any\n");
3004 if (props & PROP_gimple_lcf)
3005 fprintf (dump, "PROP_gimple_lcf\n");
3006 if (props & PROP_gimple_leh)
3007 fprintf (dump, "PROP_gimple_leh\n");
3008 if (props & PROP_cfg)
3009 fprintf (dump, "PROP_cfg\n");
3010 if (props & PROP_ssa)
3011 fprintf (dump, "PROP_ssa\n");
3012 if (props & PROP_no_crit_edges)
3013 fprintf (dump, "PROP_no_crit_edges\n");
3014 if (props & PROP_rtl)
3015 fprintf (dump, "PROP_rtl\n");
3016 if (props & PROP_gimple_lomp)
3017 fprintf (dump, "PROP_gimple_lomp\n");
3018 if (props & PROP_gimple_lomp_dev)
3019 fprintf (dump, "PROP_gimple_lomp_dev\n");
3020 if (props & PROP_gimple_lcx)
3021 fprintf (dump, "PROP_gimple_lcx\n");
3022 if (props & PROP_gimple_lvec)
3023 fprintf (dump, "PROP_gimple_lvec\n");
3024 if (props & PROP_cfglayout)
3025 fprintf (dump, "PROP_cfglayout\n");
3028 DEBUG_FUNCTION void
3029 debug_properties (unsigned int props)
3031 dump_properties (stderr, props);
3034 /* Called by local passes to see if function is called by already processed nodes.
3035 Because we process nodes in topological order, this means that function is
3036 in recursive cycle or we introduced new direct calls. */
3037 bool
3038 function_called_by_processed_nodes_p (void)
3040 struct cgraph_edge *e;
3041 for (e = cgraph_node::get (current_function_decl)->callers;
3043 e = e->next_caller)
3045 if (e->caller->decl == current_function_decl)
3046 continue;
3047 if (!e->caller->has_gimple_body_p ())
3048 continue;
3049 if (TREE_ASM_WRITTEN (e->caller->decl))
3050 continue;
3051 if (!e->caller->process && !e->caller->global.inlined_to)
3052 break;
3054 if (dump_file && e)
3056 fprintf (dump_file, "Already processed call to:\n");
3057 e->caller->dump (dump_file);
3059 return e != NULL;
3062 #include "gt-passes.h"