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
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
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. */
27 #include "coretypes.h"
40 #include "lto-streamer.h"
41 #include "fold-const.h"
47 #include "value-prof.h"
49 #include "tree-ssa-loop-manip.h"
50 #include "tree-into-ssa.h"
53 #include "tree-pass.h"
55 #include "ipa-utils.h"
56 #include "tree-pretty-print.h" /* for dump_function_header */
58 #include "pass_manager.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 */
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
82 internal_error ("pass %s does not support cloning", name
);
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
);
93 opt_pass::gate (function
*)
99 opt_pass::execute (function
*)
104 opt_pass::opt_pass (const pass_data
&data
, context
*ctxt
)
108 static_pass_number (0),
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
);
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
134 print_current_pass (FILE *file
)
137 fprintf (file
, "current pass = %s (%d)\n",
138 current_pass
->name
, current_pass
->static_pass_number
);
140 fprintf (file
, "no current pass.\n");
144 /* Call from the debugger to get the current pass name. */
148 print_current_pass (stderr
);
153 /* Global variables used to communicate with passes. */
157 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
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. */
170 rest_of_decl_compilation (tree decl
,
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. */
181 alias
= lookup_attribute ("alias", DECL_ATTRIBUTES (decl
));
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
);
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) */
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
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
,
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. */
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
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
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.
297 extern int i; // Local extern declaration.
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
318 && TREE_STATIC (decl
) && !DECL_EXTERNAL (decl
)))
319 /* Avoid confusing the debug information machinery when there are
322 (*debug_hooks
->early_global_decl
) (decl
);
325 /* Called after finishing a record, union or enumeral type. */
328 rest_of_type_compilation (tree type
, int toplev
)
330 /* Avoid confusing the debug information machinery when there are
335 timevar_push (TV_SYMOUT
);
336 debug_hooks
->type_decl (TYPE_STUB_DECL (type
), !toplev
);
337 timevar_pop (TV_SYMOUT
);
344 finish_optimization_passes (void)
347 struct dump_file_info
*dfi
;
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
);
356 dumps
->dump_finish (pass_profile_1
->static_pass_number
);
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
);
375 timevar_pop (TV_DUMP
);
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
;
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
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 */
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
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 */
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
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
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
);
511 const pass_data pass_data_all_early_optimizations
=
513 GIMPLE_PASS
, /* type */
514 "early_optimizations", /* name */
515 OPTGROUP_NONE
, /* optinfo_flags */
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
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. */
539 }; // class pass_all_early_optimizations
543 static gimple_opt_pass
*
544 make_pass_all_early_optimizations (gcc::context
*ctxt
)
546 return new pass_all_early_optimizations (ctxt
);
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
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
578 static gimple_opt_pass
*
579 make_pass_all_optimizations (gcc::context
*ctxt
)
581 return new pass_all_optimizations (ctxt
);
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
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
613 static gimple_opt_pass
*
614 make_pass_all_optimizations_g (gcc::context
*ctxt
)
616 return new pass_all_optimizations_g (ctxt
);
621 const pass_data pass_data_rest_of_compilation
=
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
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
653 static rtl_opt_pass
*
654 make_pass_rest_of_compilation (gcc::context
*ctxt
)
656 return new pass_rest_of_compilation (ctxt
);
661 const pass_data pass_data_postreload
=
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
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
688 static rtl_opt_pass
*
689 make_pass_postreload (gcc::context
*ctxt
)
691 return new pass_postreload (ctxt
);
696 const pass_data pass_data_late_compilation
=
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
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
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. */
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. */
755 pass_manager::get_pass_for_id (int id
) const
757 if (id
>= passes_by_id_size
)
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
767 register_one_dump_file (opt_pass
*pass
)
769 g
->get_passes ()->register_one_dump_file (pass
);
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. */
782 int optgroup_flags
= OPTGROUP_NONE
;
783 gcc::dump_manager
*dumps
= m_ctxt
->get_dumps ();
785 /* See below in next_pass_1. */
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
)
803 optgroup_flags
|= OPTGROUP_IPA
;
805 else if (pass
->type
== GIMPLE_PASS
)
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
,
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. */
836 pass_manager::register_dump_files (opt_pass
*pass
)
840 if (pass
->name
&& pass
->name
[0] != '*')
841 register_one_dump_file (pass
);
844 register_dump_files (pass
->sub
);
851 /* Register PASS with NAME. */
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. */
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
;
884 /* The function traverses NAME_TO_PASS_MAP and creates a pass info
885 table for dumping purpose. */
888 pass_manager::create_pass_tab (void) const
890 if (!flag_dump_passes
)
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. */
903 dump_one_pass (opt_pass
*pass
, int pass_indent
)
905 int indent
= 3 * pass_indent
;
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)
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. */
927 dump_pass_list (opt_pass
*pass
, int indent
)
931 dump_one_pass (pass
, indent
);
933 dump_pass_list (pass
->sub
, indent
+ 1);
939 /* Dump all optimization passes. */
944 g
->get_passes ()->dump_passes ();
948 pass_manager::dump_passes () const
950 push_dummy_function (true);
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. */
966 pass_manager::get_pass_by_name (const char *name
)
968 opt_pass
**p
= m_name_to_pass_map
->get (name
);
976 /* Range [start, 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:
997 -fdisable-<pass_name>
999 -fenable-<pass_name>=s1:e1,s2:e2,...
1000 -fdisable-<pass_name>=s1:e1,s2:e2,...
1004 enable_disable_pass (const char *arg
, bool is_enable
)
1007 char *range_str
, *phase_name
;
1008 char *argstr
= xstrdup (arg
);
1009 vec
<uid_range_p
> *tab
= 0;
1011 range_str
= strchr (argstr
,'=');
1018 phase_name
= argstr
;
1022 error ("unrecognized option -fenable");
1024 error ("unrecognized option -fdisable");
1028 pass
= g
->get_passes ()->get_pass_by_name (phase_name
);
1029 if (!pass
|| pass
->static_pass_number
== -1)
1032 error ("unknown pass %s specified in -fenable", phase_name
);
1034 error ("unknown pass %s specified in -fdisable", phase_name
);
1040 tab
= &enabled_pass_uid_range_tab
;
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);
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
;
1059 inform (UNKNOWN_LOCATION
, "enable pass %s for functions in the range "
1060 "of [%u, %u]", phase_name
, new_range
->start
, new_range
->last
);
1062 inform (UNKNOWN_LOCATION
, "disable pass %s for functions in the range "
1063 "of [%u, %u]", phase_name
, new_range
->start
, new_range
->last
);
1067 char *next_range
= NULL
;
1068 char *one_range
= range_str
;
1069 char *end_val
= NULL
;
1074 uid_range_p new_range
;
1075 char *invalid
= NULL
;
1077 char *func_name
= NULL
;
1079 next_range
= strchr (one_range
, ',');
1086 end_val
= strchr (one_range
, ':');
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",
1100 is_enable
? "-fenable" : "-fdisable");
1104 func_name
= one_range
;
1108 new_range
= XCNEW (struct uid_range
);
1111 new_range
->start
= (unsigned) start
;
1112 new_range
->last
= (unsigned) start
;
1116 new_range
->start
= (unsigned) -1;
1117 new_range
->last
= (unsigned) -1;
1118 new_range
->assem_name
= xstrdup (func_name
);
1123 long last
= strtol (end_val
, &invalid
, 10);
1124 if (*invalid
|| last
< start
)
1126 error ("Invalid range %s in option %s",
1128 is_enable
? "-fenable" : "-fdisable");
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
;
1142 if (new_range
->assem_name
)
1143 inform (UNKNOWN_LOCATION
,
1144 "enable pass %s for function %s",
1145 phase_name
, new_range
->assem_name
);
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
);
1153 if (new_range
->assem_name
)
1154 inform (UNKNOWN_LOCATION
,
1155 "disable pass %s for function %s",
1156 phase_name
, new_range
->assem_name
);
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
);
1170 /* Enable pass specified by ARG. */
1173 enable_pass (const char *arg
)
1175 enable_disable_pass (arg
, true);
1178 /* Disable pass specified by ARG. */
1181 disable_pass (const char *arg
)
1183 enable_disable_pass (arg
, false);
1186 /* Returns true if PASS is explicitly enabled/disabled for FUNC. */
1189 is_pass_explicitly_enabled_or_disabled (opt_pass
*pass
,
1191 vec
<uid_range_p
> tab
)
1193 uid_range_p slot
, range
;
1195 const char *aname
= NULL
;
1198 || (unsigned) pass
->static_pass_number
>= tab
.length ()
1199 || pass
->static_pass_number
== -1)
1202 slot
= tab
[pass
->static_pass_number
];
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
));
1213 if ((unsigned) cgraph_uid
>= range
->start
1214 && (unsigned) cgraph_uid
<= range
->last
)
1216 if (range
->assem_name
&& aname
1217 && !strcmp (range
->assem_name
, aname
))
1219 range
= range
->next
;
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) ) */
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
;
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
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
);
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
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 */
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
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
)))
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
);
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. */
1366 case PASS_POS_INSERT_BEFORE
:
1367 new_pass
->next
= pass
;
1369 prev_pass
->next
= new_pass
;
1371 *pass_list
= new_pass
;
1373 case PASS_POS_REPLACE
:
1374 new_pass
->next
= pass
->next
;
1376 prev_pass
->next
= new_pass
;
1378 *pass_list
= new_pass
;
1379 new_pass
->sub
= pass
->sub
;
1380 new_pass
->tv_id
= pass
->tv_id
;
1384 error ("invalid pass positioning operation");
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
;
1398 prev_added_pass_node
->next
= new_pass_node
;
1399 prev_added_pass_node
= new_pass_node
;
1404 if (pass
->sub
&& position_pass (new_pass_info
, &pass
->sub
))
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
1418 register_pass (struct register_pass_info
*pass_info
)
1420 g
->get_passes ()->register_pass (pass_info
);
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
;
1429 i
.reference_pass_name
= ref_pass_name
;
1430 i
.ref_pass_instance_number
= ref_pass_inst_number
;
1433 g
->get_passes ()->register_pass (&i
);
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
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
)
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
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
);
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
)
1493 else if (added_pass_nodes
->pass
->type
== GIMPLE_PASS
)
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:
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
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
)
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
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;
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); \
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) \
1582 gcc_assert (NULL == PASS ## _ ## NUM); \
1584 PASS ## _1 = make_##PASS (m_ctxt); \
1587 gcc_assert (PASS ## _1); \
1588 PASS ## _ ## NUM = PASS ## _1->clone (); \
1590 p = next_pass_1 (p, PASS ## _ ## NUM, PASS ## _1); \
1593 #define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) \
1595 NEXT_PASS (PASS, NUM); \
1596 PASS ## _ ## NUM->set_pass_param (0, ARG); \
1599 #include "pass-instances.def"
1601 #undef INSERT_PASSES_AFTER
1602 #undef PUSH_INSERT_PASSES_WITHIN
1603 #undef POP_INSERT_PASSES
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
);
1617 delete_pass_tree (opt_pass
*pass
)
1621 /* Recurse into child passes. */
1622 delete_pass_tree (pass
->sub
);
1624 opt_pass
*next
= pass
->next
;
1626 /* Delete this pass. */
1629 /* Iterate onto sibling passes. */
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]);
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. */
1651 do_per_function (void (*callback
) (function
*, void *data
), void *data
)
1653 if (current_function_decl
)
1654 callback (cfun
, data
);
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
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
1677 remove_cgraph_node_from_order (cgraph_node
*node
, void *data
)
1679 int *order_idx
= (int *)data
;
1681 if (node
->uid
>= order_idx
[0])
1684 int idx
= order_idx
[node
->uid
+ 1];
1685 if (idx
>= 0 && idx
< nnodes
&& order
[idx
] == node
)
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. */
1694 do_per_function_toporder (void (*callback
) (function
*, void *data
), void *data
)
1698 if (current_function_decl
)
1699 callback (cfun
, data
);
1702 cgraph_node_hook_list
*hook
;
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
,
1719 for (i
= nnodes
- 1; i
>= 0; i
--)
1721 /* Function could be inlined and removed as unreachable. */
1725 struct cgraph_node
*node
= order
[i
];
1727 /* Allow possibly removed nodes to be garbage collected. */
1730 if (node
->has_gimple_body_p ())
1732 struct function
*fn
= DECL_STRUCT_FUNCTION (node
->decl
);
1734 callback (fn
, data
);
1738 symtab
->remove_cgraph_removal_hook (hook
);
1745 /* Helper function to perform function body dump. */
1748 execute_function_dump (function
*fn
, void *data
)
1750 opt_pass
*pass
= (opt_pass
*)data
;
1756 if (fn
->curr_properties
& PROP_trees
)
1757 dump_function_to_file (fn
->decl
, dump_file
, dump_flags
);
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. */
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
);
1783 /* This function is called when an internal compiler error is encountered.
1784 Ensure that function dump is made available before compiler is aborted. */
1787 emergency_dump_function ()
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
)
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. */
1809 check_profile_consistency (int index
, int subpass
, bool run
)
1811 pass_manager
*passes
= g
->get_passes ();
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. */
1826 dump_profile_report (void)
1828 g
->get_passes ()->dump_profile_report ();
1832 pass_manager::dump_profile_report () const
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
)
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
)
1851 rel_time_change
= (profile_record
[i
].time
[j
]
1852 - (double)last_time
) * 100 / (double)last_time
;
1854 rel_time_change
= 0;
1856 rel_size_change
= (profile_record
[i
].size
[j
]
1857 - (double)last_size
) * 100 / (double)last_size
;
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
)
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
]
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
]
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
]
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
]
1894 fprintf (stderr
, " ");
1896 /* Size/time units change across gimple and RTL. */
1897 if (i
== pass_expand_1
->static_pass_number
)
1898 fprintf (stderr
, "|----------");
1901 if (rel_size_change
)
1902 fprintf (stderr
, "| %+8.4f%%", rel_size_change
);
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
)
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. */
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
;
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
);
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
)
2000 verify_flow_info ();
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
;
2021 /* For IPA passes make sure to release dominator info, it can be
2022 computed by non-verifying TODOs. */
2025 free_dominance_info (fn
, CDI_DOMINATORS
);
2026 free_dominance_info (fn
, CDI_POST_DOMINATORS
);
2030 /* Perform all TODO actions. */
2032 execute_todo (unsigned int flags
)
2036 && need_ssa_update_p (cfun
))
2037 gcc_assert (flags
& TODO_update_ssa_any
);
2039 statistics_fini_pass ();
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
)
2056 symtab
->remove_unreachable_nodes (dump_file
);
2059 if ((flags
& TODO_dump_symtab
) && dump_file
&& !current_function_decl
)
2062 symtab
->dump (dump_file
);
2063 /* Flush the file. If verification fails, we won't be able to
2064 close the file before aborting. */
2068 /* Now that the dumping has been done, we can get rid of the optional
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. */
2078 verify_interpass_invariants (void)
2080 gcc_checking_assert (!fold_deferring_overflow_warnings_p ());
2083 /* Clear the last verified flag. */
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. */
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. */
2104 release_dump_file_name (void)
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. */
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
;
2147 /* Flush PASS dump file. */
2148 /* This is non-static so that plugins can use it. */
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
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. */
2176 execute_ipa_summary_passes (ipa_opt_pass_d
*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. */
2191 timevar_push (pass
->tv_id
);
2193 current_pass
= pass
;
2194 ipa_pass
->generate_summary ();
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. */
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
)
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
);
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);
2245 if (pass
->tv_id
!= TV_NONE
)
2246 timevar_pop (pass
->tv_id
);
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
))
2260 /* For the current function, execute all ipa transforms. */
2263 execute_all_ipa_transforms (void)
2265 struct cgraph_node
*node
;
2268 node
= cgraph_node::get (current_function_decl
);
2270 if (node
->ipa_transforms_to_apply
.exists ())
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
2286 override_gate_status (opt_pass
*pass
, tree func
, bool gate_status
)
2288 bool explicitly_enabled
= false;
2289 bool explicitly_disabled
= false;
2292 = is_pass_explicitly_enabled_or_disabled (pass
, func
,
2293 enabled_pass_uid_range_tab
);
2295 = is_pass_explicitly_enabled_or_disabled (pass
, func
,
2296 disabled_pass_uid_range_tab
);
2298 gate_status
= !explicitly_disabled
&& (gate_status
|| explicitly_enabled
);
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. */
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'))
2323 if (criterion
[namelen
+ 1] == '\0')
2324 --criterion
[namelen
];
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. */
2338 should_skip_pass_p (opt_pass
*pass
)
2342 if (!cfun
->pass_startwith
)
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
)
2354 fprintf (stderr
, "starting anyway when leaving SSA: %s\n", pass
->name
);
2355 cfun
->pass_startwith
= NULL
;
2359 if (determine_pass_name_match (pass
->name
, cfun
->pass_startwith
))
2362 fprintf (stderr
, "found starting pass: %s\n", pass
->name
);
2363 cfun
->pass_startwith
= NULL
;
2367 /* For GIMPLE passes, run any property provider (but continue skipping
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)
2377 /* Don't skip df init; later RTL passes need it. */
2378 if (strstr (pass
->name
, "dfinit") != NULL
)
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;
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. */
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
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
;
2424 execute_one_pass (opt_pass
*pass
)
2426 unsigned int todo_after
= 0;
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
);
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
);
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
;
2460 if (should_skip_pass_p (pass
))
2466 /* Pass execution event trigger: useful to identify passes being
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
);
2487 do_per_function (verify_curr_properties
,
2488 (void *)(size_t)pass
->properties_required
);
2491 todo_after
= pass
->execute (cfun
);
2493 if (todo_after
& TODO_discard_function
)
2496 if (pass
->tv_id
!= TV_NONE
)
2497 timevar_pop (pass
->tv_id
);
2499 pass_fini_dump_file (pass
);
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
;
2513 cgraph_node::get (fn
)->release_body ();
2515 current_pass
= NULL
;
2516 redirect_edge_var_map_empty ();
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 ();
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
);
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
))
2571 execute_pass_list_1 (opt_pass
*pass
)
2575 gcc_assert (pass
->type
== GIMPLE_PASS
2576 || pass
->type
== RTL_PASS
);
2580 if (execute_one_pass (pass
) && pass
->sub
)
2581 execute_pass_list_1 (pass
->sub
);
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. */
2603 timevar_push (TV_IPA_LTO_GIMPLE_OUT
);
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. */
2616 ipa_write_summaries_2 (opt_pass
*pass
, struct lto_out_decl_state
*state
)
2620 ipa_opt_pass_d
*ipa_pass
= (ipa_opt_pass_d
*)pass
;
2621 gcc_assert (!current_function_decl
);
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. */
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. */
2641 timevar_pop (pass
->tv_id
);
2644 if (pass
->sub
&& pass
->sub
->type
!= GIMPLE_PASS
)
2645 ipa_write_summaries_2 (pass
->sub
, state
);
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. */
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
);
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. */
2678 ipa_write_summaries (void)
2680 lto_symtab_encoder_t encoder
;
2682 varpool_node
*vnode
;
2683 struct cgraph_node
*node
;
2684 struct cgraph_node
**order
;
2686 if ((!flag_generate_lto
&& !flag_generate_offload
) || seen_error ())
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
2713 push_cfun (DECL_STRUCT_FUNCTION (node
->decl
));
2714 renumber_gimple_stmt_uids ();
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
));
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. */
2738 ipa_write_optimization_summaries_1 (opt_pass
*pass
,
2739 struct lto_out_decl_state
*state
)
2743 ipa_opt_pass_d
*ipa_pass
= (ipa_opt_pass_d
*)pass
;
2744 gcc_assert (!current_function_decl
);
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. */
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. */
2764 timevar_pop (pass
->tv_id
);
2767 if (pass
->sub
&& pass
->sub
->type
!= GIMPLE_PASS
)
2768 ipa_write_optimization_summaries_1 (pass
->sub
, state
);
2774 /* Write all the optimization summaries for the cgraph nodes in SET. If SET is
2775 NULL, write out all summaries of all nodes. */
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
2795 if (node
->definition
2796 && gimple_has_body_p (node
->decl
))
2798 push_cfun (DECL_STRUCT_FUNCTION (node
->decl
));
2799 renumber_gimple_stmt_uids ();
2804 gcc_assert (flag_wpa
);
2805 pass_manager
*passes
= g
->get_passes ();
2806 ipa_write_optimization_summaries_1 (passes
->all_regular_ipa_passes
, state
);
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. */
2819 ipa_read_summaries_1 (opt_pass
*pass
)
2823 ipa_opt_pass_d
*ipa_pass
= (ipa_opt_pass_d
*) pass
;
2825 gcc_assert (!current_function_decl
);
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. */
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
);
2846 timevar_pop (pass
->tv_id
);
2849 if (pass
->sub
&& pass
->sub
->type
!= GIMPLE_PASS
)
2850 ipa_read_summaries_1 (pass
->sub
);
2857 /* Read all the summaries for all_regular_ipa_passes. */
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. */
2870 ipa_read_optimization_summaries_1 (opt_pass
*pass
)
2874 ipa_opt_pass_d
*ipa_pass
= (ipa_opt_pass_d
*) pass
;
2876 gcc_assert (!current_function_decl
);
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. */
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
);
2897 timevar_pop (pass
->tv_id
);
2900 if (pass
->sub
&& pass
->sub
->type
!= GIMPLE_PASS
)
2901 ipa_read_optimization_summaries_1 (pass
->sub
);
2907 /* Read all the summaries for all_regular_ipa_passes. */
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. */
2919 execute_ipa_pass_list (opt_pass
*pass
)
2923 gcc_assert (!current_function_decl
);
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 *))
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
);
2942 gcc_assert (!current_function_decl
);
2943 symtab
->process_new_functions ();
2949 /* Execute stmt fixup hooks of all passes in PASS for NODE and STMTS. */
2952 execute_ipa_stmt_fixups (opt_pass
*pass
,
2953 struct cgraph_node
*node
, gimple
**stmts
)
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. */
2968 timevar_push (pass
->tv_id
);
2970 current_pass
= pass
;
2971 ipa_pass
->stmt_fixup (node
, stmts
);
2975 timevar_pop (pass
->tv_id
);
2976 pass_fini_dump_file (pass
);
2979 execute_ipa_stmt_fixups (pass
->sub
, node
, stmts
);
2985 /* Execute stmt fixup hooks of all IPA passes for NODE and STMTS. */
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);
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");
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. */
3038 function_called_by_processed_nodes_p (void)
3040 struct cgraph_edge
*e
;
3041 for (e
= cgraph_node::get (current_function_decl
)->callers
;
3045 if (e
->caller
->decl
== current_function_decl
)
3047 if (!e
->caller
->has_gimple_body_p ())
3049 if (TREE_ASM_WRITTEN (e
->caller
->decl
))
3051 if (!e
->caller
->process
&& !e
->caller
->global
.inlined_to
)
3056 fprintf (dump_file
, "Already processed call to:\n");
3057 e
->caller
->dump (dump_file
);
3062 #include "gt-passes.h"