]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-pass.h
Update copyright years in gcc/
[thirdparty/gcc.git] / gcc / tree-pass.h
CommitLineData
6de9cd9a 1/* Definitions for describing one tree-ssa optimization pass.
23a5b65a 2 Copyright (C) 2004-2014 Free Software Foundation, Inc.
6de9cd9a
DN
3 Contributed by Richard Henderson <rth@redhat.com>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9dcd6f09 9the Free Software Foundation; either version 3, or (at your option)
6de9cd9a
DN
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
6de9cd9a
DN
20
21
22#ifndef GCC_TREE_PASS_H
23#define GCC_TREE_PASS_H 1
24
7072a650 25#include "timevar.h"
7ee2468b 26#include "dumpfile.h"
9f8628ba 27
24b97832
ILT
28/* Optimization pass type. */
29enum opt_pass_type
30{
31 GIMPLE_PASS,
32 RTL_PASS,
33 SIMPLE_IPA_PASS,
34 IPA_PASS
35};
36
f7695dbf
DM
37/* Metadata for a pass, non-varying across all instances of a pass. */
38struct pass_data
6de9cd9a 39{
8ddbbcae 40 /* Optimization pass type. */
24b97832
ILT
41 enum opt_pass_type type;
42
8e352cd3
BS
43 /* Terse name of the pass used as a fragment of the dump file
44 name. If the name starts with a star, no dump happens. */
6de9cd9a
DN
45 const char *name;
46
2b4e6bf1
SS
47 /* The -fopt-info optimization group flags as defined in dumpfile.h. */
48 unsigned int optinfo_flags;
49
f7695dbf
DM
50 /* If true, this pass has its own implementation of the opt_pass::gate
51 method. */
52 bool has_gate;
6de9cd9a 53
f7695dbf
DM
54 /* If true, this pass has its own implementation of the opt_pass::execute
55 method. */
56 bool has_execute;
6de9cd9a
DN
57
58 /* The timevar id associated with this pass. */
59 /* ??? Ideally would be dynamically assigned. */
7072a650 60 timevar_id_t tv_id;
6de9cd9a
DN
61
62 /* Sets of properties input and output from this pass. */
63 unsigned int properties_required;
64 unsigned int properties_provided;
65 unsigned int properties_destroyed;
66
67 /* Flags indicating common sets things to do before and after. */
68 unsigned int todo_flags_start;
69 unsigned int todo_flags_finish;
8ddbbcae
JH
70};
71
f7695dbf
DM
72namespace gcc
73{
74 class context;
75} // namespace gcc
76
77/* An instance of a pass. This is also "pass_data" to minimize the
78 changes in existing code. */
6cd4d135 79class opt_pass : public pass_data
f7695dbf
DM
80{
81public:
82 virtual ~opt_pass () { }
83
84 /* Create a copy of this pass.
85
86 Passes that can have multiple instances must provide their own
87 implementation of this, to ensure that any sharing of state between
88 this instance and the copy is "wired up" correctly.
89
90 The default implementation prints an error message and aborts. */
91 virtual opt_pass *clone ();
92
93 /* If has_gate is set, this pass and all sub-passes are executed only if
3fa3690d
OE
94 the function returns true.
95 The default implementation returns true. */
f7695dbf
DM
96 virtual bool gate ();
97
98 /* This is the code to run. If has_execute is false, then there should
99 be sub-passes otherwise this pass does nothing.
100 The return value contains TODOs to execute in addition to those in
101 TODO_flags_finish. */
102 virtual unsigned int execute ();
103
104protected:
c3284718 105 opt_pass (const pass_data&, gcc::context *);
f7695dbf
DM
106
107public:
108 /* A list of sub-passes to run, dependent on gate predicate. */
6a5ac314 109 opt_pass *sub;
f7695dbf
DM
110
111 /* Next in the list of passes to run, independent of gate predicate. */
6a5ac314 112 opt_pass *next;
f7695dbf
DM
113
114 /* Static pass number, used as a fragment of the dump file name. */
115 int static_pass_number;
116
9d5879a6
AH
117 /* When a given dump file is being initialized, this flag is set to
118 true if the corresponding TDF_graph dump file has also been
119 initialized. */
120 bool graph_dump_initialized;
121
f7695dbf 122protected:
65d3284b 123 gcc::context *m_ctxt;
f7695dbf
DM
124};
125
17653c00 126/* Description of GIMPLE pass. */
f7695dbf 127class gimple_opt_pass : public opt_pass
8ddbbcae 128{
f7695dbf 129protected:
c3284718
RS
130 gimple_opt_pass (const pass_data& data, gcc::context *ctxt)
131 : opt_pass (data, ctxt)
f7695dbf
DM
132 {
133 }
8ddbbcae 134};
9f8628ba 135
fa10beec 136/* Description of RTL pass. */
f7695dbf 137class rtl_opt_pass : public opt_pass
8ddbbcae 138{
f7695dbf 139protected:
c3284718
RS
140 rtl_opt_pass (const pass_data& data, gcc::context *ctxt)
141 : opt_pass (data, ctxt)
f7695dbf
DM
142 {
143 }
8ddbbcae
JH
144};
145
2c8326a5 146class varpool_node;
17653c00 147struct cgraph_node;
7b99cca4 148struct lto_symtab_encoder_d;
17653c00
JH
149
150/* Description of IPA pass with generate summary, write, execute, read and
151 transform stages. */
f7695dbf 152class ipa_opt_pass_d : public opt_pass
17653c00 153{
f7695dbf 154public:
1920df6c
KZ
155 /* IPA passes can analyze function body and variable initializers
156 using this hook and produce summary. */
157 void (*generate_summary) (void);
158
159 /* This hook is used to serialize IPA summaries on disk. */
f27c1867 160 void (*write_summary) (void);
17653c00 161
e792884f 162 /* This hook is used to deserialize IPA summaries from disk. */
1920df6c 163 void (*read_summary) (void);
e792884f
JH
164
165 /* This hook is used to serialize IPA optimization summaries on disk. */
f27c1867 166 void (*write_optimization_summary) (void);
e792884f
JH
167
168 /* This hook is used to deserialize IPA summaries from disk. */
169 void (*read_optimization_summary) (void);
170
2c5721d9
MJ
171 /* Hook to convert gimple stmt uids into true gimple statements. The second
172 parameter is an array of statements indexed by their uid. */
173 void (*stmt_fixup) (struct cgraph_node *, gimple *);
174
17653c00
JH
175 /* Results of interprocedural propagation of an IPA pass is applied to
176 function body via this hook. */
177 unsigned int function_transform_todo_flags_start;
178 unsigned int (*function_transform) (struct cgraph_node *);
2c8326a5 179 void (*variable_transform) (varpool_node *);
f7695dbf
DM
180
181protected:
c3284718
RS
182 ipa_opt_pass_d (const pass_data& data, gcc::context *ctxt,
183 void (*generate_summary) (void),
184 void (*write_summary) (void),
185 void (*read_summary) (void),
186 void (*write_optimization_summary) (void),
187 void (*read_optimization_summary) (void),
188 void (*stmt_fixup) (struct cgraph_node *, gimple *),
189 unsigned int function_transform_todo_flags_start,
190 unsigned int (*function_transform) (struct cgraph_node *),
2c8326a5 191 void (*variable_transform) (varpool_node *))
c3284718
RS
192 : opt_pass (data, ctxt),
193 generate_summary (generate_summary),
194 write_summary (write_summary),
195 read_summary (read_summary),
196 write_optimization_summary (write_optimization_summary),
197 read_optimization_summary (read_optimization_summary),
198 stmt_fixup (stmt_fixup),
199 function_transform_todo_flags_start (function_transform_todo_flags_start),
200 function_transform (function_transform),
201 variable_transform (variable_transform)
f7695dbf
DM
202 {
203 }
17653c00
JH
204};
205
206/* Description of simple IPA pass. Simple IPA passes have just one execute
8ddbbcae 207 hook. */
f7695dbf 208class simple_ipa_opt_pass : public opt_pass
8ddbbcae 209{
f7695dbf 210protected:
c3284718
RS
211 simple_ipa_opt_pass (const pass_data& data, gcc::context *ctxt)
212 : opt_pass (data, ctxt)
f7695dbf
DM
213 {
214 }
9f8628ba
PB
215};
216
6de9cd9a
DN
217/* Pass properties. */
218#define PROP_gimple_any (1 << 0) /* entire gimple grammar */
219#define PROP_gimple_lcf (1 << 1) /* lowered control flow */
220#define PROP_gimple_leh (1 << 2) /* lowered eh */
221#define PROP_cfg (1 << 3)
7b0e48fb
DB
222#define PROP_ssa (1 << 5)
223#define PROP_no_crit_edges (1 << 6)
224#define PROP_rtl (1 << 7)
4effdf02
RG
225#define PROP_gimple_lomp (1 << 8) /* lowered OpenMP directives */
226#define PROP_cfglayout (1 << 9) /* cfglayout mode on RTL */
688a482d 227#define PROP_gimple_lcx (1 << 10) /* lowered complex */
7d776ee2 228#define PROP_loops (1 << 11) /* preserve loop structures */
6f37411d 229#define PROP_gimple_lvec (1 << 12) /* lowered vector */
2f8e398b
PB
230
231#define PROP_trees \
bbbe4e7b 232 (PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh | PROP_gimple_lomp)
6de9cd9a
DN
233
234/* To-do flags. */
d3afd9aa 235#define TODO_do_not_ggc_collect (1 << 1)
b8698a0f 236#define TODO_verify_ssa (1 << 2)
0bca51f0
DN
237#define TODO_verify_flow (1 << 3)
238#define TODO_verify_stmts (1 << 4)
239#define TODO_cleanup_cfg (1 << 5)
8f940ee6 240#define TODO_dump_symtab (1 << 7)
f4b3ca72 241#define TODO_remove_functions (1 << 8)
45a80bb9 242#define TODO_rebuild_frequencies (1 << 9)
a36b8a1e 243#define TODO_verify_rtl_sharing (1 << 10)
0bca51f0
DN
244
245/* To-do flags for calls to update_ssa. */
246
247/* Update the SSA form inserting PHI nodes for newly exposed symbols
248 and virtual names marked for updating. When updating real names,
249 only insert PHI nodes for a real name O_j in blocks reached by all
250 the new and old definitions for O_j. If the iterated dominance
251 frontier for O_j is not pruned, we may end up inserting PHI nodes
252 in blocks that have one or more edges with no incoming definition
253 for O_j. This would lead to uninitialized warnings for O_j's
254 symbol. */
a36b8a1e 255#define TODO_update_ssa (1 << 11)
0bca51f0
DN
256
257/* Update the SSA form without inserting any new PHI nodes at all.
258 This is used by passes that have either inserted all the PHI nodes
259 themselves or passes that need only to patch use-def and def-def
260 chains for virtuals (e.g., DCE). */
a36b8a1e 261#define TODO_update_ssa_no_phi (1 << 12)
0bca51f0 262
0fa2e4df 263/* Insert PHI nodes everywhere they are needed. No pruning of the
0bca51f0
DN
264 IDF is done. This is used by passes that need the PHI nodes for
265 O_j even if it means that some arguments will come from the default
b305e3da 266 definition of O_j's symbol.
b8698a0f 267
0bca51f0
DN
268 WARNING: If you need to use this flag, chances are that your pass
269 may be doing something wrong. Inserting PHI nodes for an old name
270 where not all edges carry a new replacement may lead to silent
271 codegen errors or spurious uninitialized warnings. */
a36b8a1e 272#define TODO_update_ssa_full_phi (1 << 13)
0bca51f0
DN
273
274/* Passes that update the SSA form on their own may want to delegate
275 the updating of virtual names to the generic updater. Since FUD
276 chains are easier to maintain, this simplifies the work they need
277 to do. NOTE: If this flag is used, any OLD->NEW mappings for real
278 names are explicitly destroyed and only the symbols marked for
279 renaming are processed. */
a36b8a1e 280#define TODO_update_ssa_only_virtuals (1 << 14)
0bca51f0 281
3f519b35 282/* Some passes leave unused local variables that can be removed from
cb91fab0
JH
283 cfun->local_decls. This reduces the size of dump files
284 and the memory footprint for VAR_DECLs. */
a36b8a1e 285#define TODO_remove_unused_locals (1 << 15)
3f519b35 286
6fb5fa3c
DB
287/* Call df_finish at the end of the pass. This is done after all of
288 the dumpers have been allowed to run so that they have access to
289 the instance before it is destroyed. */
a36b8a1e 290#define TODO_df_finish (1 << 17)
6fb5fa3c 291
0d475361 292/* Call df_verify at the end of the pass if checking is enabled. */
a36b8a1e 293#define TODO_df_verify (1 << 18)
0d475361 294
b02b9b53 295/* Internally used for the first instance of a pass. */
a36b8a1e 296#define TODO_mark_first_instance (1 << 19)
b02b9b53 297
7b0e48fb 298/* Rebuild aliasing info. */
5006671f
RG
299#define TODO_rebuild_alias (1 << 20)
300
301/* Rebuild the addressable-vars bitmap and do register promotion. */
302#define TODO_update_address_taken (1 << 21)
7b0e48fb 303
cf9712cc
JH
304/* Rebuild the callgraph edges. */
305#define TODO_rebuild_cgraph_edges (1 << 22)
306
4fe8e1a2 307/* Internally used in execute_function_todo(). */
0bca51f0
DN
308#define TODO_update_ssa_any \
309 (TODO_update_ssa \
310 | TODO_update_ssa_no_phi \
311 | TODO_update_ssa_full_phi \
312 | TODO_update_ssa_only_virtuals)
6de9cd9a
DN
313
314#define TODO_verify_all \
315 (TODO_verify_ssa | TODO_verify_flow | TODO_verify_stmts)
316
b80b0fd9
ST
317
318/* Register pass info. */
319
320enum pass_positioning_ops
321{
322 PASS_POS_INSERT_AFTER, /* Insert after the reference pass. */
323 PASS_POS_INSERT_BEFORE, /* Insert before the reference pass. */
324 PASS_POS_REPLACE /* Replace the reference pass. */
325};
326
327struct register_pass_info
328{
6a5ac314 329 opt_pass *pass; /* New pass to register. */
b80b0fd9
ST
330 const char *reference_pass_name; /* Name of the reference pass for hooking
331 up the new pass. */
332 int ref_pass_instance_number; /* Insert the pass at the specified
333 instance number of the reference pass.
334 Do it for every instance if it is 0. */
335 enum pass_positioning_ops pos_op; /* how to insert the new pass. */
336};
337
3fa3690d
OE
338/* Registers a new pass. Either fill out the register_pass_info or specify
339 the individual parameters. The pass object is expected to have been
340 allocated using operator new and the pass manager takes the ownership of
341 the pass object. */
342extern void register_pass (register_pass_info *);
343extern void register_pass (opt_pass* pass, pass_positioning_ops pos,
344 const char* ref_pass_name, int ref_pass_inst_number);
345
27a4cd48
DM
346extern gimple_opt_pass *make_pass_asan (gcc::context *ctxt);
347extern gimple_opt_pass *make_pass_asan_O0 (gcc::context *ctxt);
348extern gimple_opt_pass *make_pass_tsan (gcc::context *ctxt);
349extern gimple_opt_pass *make_pass_tsan_O0 (gcc::context *ctxt);
350extern gimple_opt_pass *make_pass_lower_cf (gcc::context *ctxt);
351extern gimple_opt_pass *make_pass_refactor_eh (gcc::context *ctxt);
352extern gimple_opt_pass *make_pass_lower_eh (gcc::context *ctxt);
353extern gimple_opt_pass *make_pass_lower_eh_dispatch (gcc::context *ctxt);
354extern gimple_opt_pass *make_pass_lower_resx (gcc::context *ctxt);
355extern gimple_opt_pass *make_pass_build_cfg (gcc::context *ctxt);
356extern gimple_opt_pass *make_pass_early_tree_profile (gcc::context *ctxt);
357extern gimple_opt_pass *make_pass_cleanup_eh (gcc::context *ctxt);
358extern gimple_opt_pass *make_pass_sra (gcc::context *ctxt);
359extern gimple_opt_pass *make_pass_sra_early (gcc::context *ctxt);
360extern gimple_opt_pass *make_pass_early_ipa_sra (gcc::context *ctxt);
361extern gimple_opt_pass *make_pass_tail_recursion (gcc::context *ctxt);
362extern gimple_opt_pass *make_pass_tail_calls (gcc::context *ctxt);
363extern gimple_opt_pass *make_pass_tree_loop (gcc::context *ctxt);
364extern gimple_opt_pass *make_pass_tree_loop_init (gcc::context *ctxt);
365extern gimple_opt_pass *make_pass_lim (gcc::context *ctxt);
366extern gimple_opt_pass *make_pass_tree_unswitch (gcc::context *ctxt);
367extern gimple_opt_pass *make_pass_predcom (gcc::context *ctxt);
368extern gimple_opt_pass *make_pass_iv_canon (gcc::context *ctxt);
369extern gimple_opt_pass *make_pass_scev_cprop (gcc::context *ctxt);
370extern gimple_opt_pass *make_pass_empty_loop (gcc::context *ctxt);
371extern gimple_opt_pass *make_pass_record_bounds (gcc::context *ctxt);
372extern gimple_opt_pass *make_pass_graphite (gcc::context *ctxt);
373extern gimple_opt_pass *make_pass_graphite_transforms (gcc::context *ctxt);
374extern gimple_opt_pass *make_pass_if_conversion (gcc::context *ctxt);
375extern gimple_opt_pass *make_pass_loop_distribution (gcc::context *ctxt);
376extern gimple_opt_pass *make_pass_vectorize (gcc::context *ctxt);
377extern gimple_opt_pass *make_pass_slp_vectorize (gcc::context *ctxt);
378extern gimple_opt_pass *make_pass_complete_unroll (gcc::context *ctxt);
379extern gimple_opt_pass *make_pass_complete_unrolli (gcc::context *ctxt);
380extern gimple_opt_pass *make_pass_parallelize_loops (gcc::context *ctxt);
381extern gimple_opt_pass *make_pass_loop_prefetch (gcc::context *ctxt);
382extern gimple_opt_pass *make_pass_iv_optimize (gcc::context *ctxt);
383extern gimple_opt_pass *make_pass_tree_loop_done (gcc::context *ctxt);
384extern gimple_opt_pass *make_pass_ch (gcc::context *ctxt);
385extern gimple_opt_pass *make_pass_ccp (gcc::context *ctxt);
386extern gimple_opt_pass *make_pass_phi_only_cprop (gcc::context *ctxt);
387extern gimple_opt_pass *make_pass_build_ssa (gcc::context *ctxt);
388extern gimple_opt_pass *make_pass_build_alias (gcc::context *ctxt);
389extern gimple_opt_pass *make_pass_build_ealias (gcc::context *ctxt);
390extern gimple_opt_pass *make_pass_dominator (gcc::context *ctxt);
391extern gimple_opt_pass *make_pass_dce (gcc::context *ctxt);
392extern gimple_opt_pass *make_pass_dce_loop (gcc::context *ctxt);
393extern gimple_opt_pass *make_pass_cd_dce (gcc::context *ctxt);
394extern gimple_opt_pass *make_pass_call_cdce (gcc::context *ctxt);
395extern gimple_opt_pass *make_pass_merge_phi (gcc::context *ctxt);
396extern gimple_opt_pass *make_pass_split_crit_edges (gcc::context *ctxt);
397extern gimple_opt_pass *make_pass_pre (gcc::context *ctxt);
c9e93168 398extern unsigned int tail_merge_optimize (unsigned int);
27a4cd48
DM
399extern gimple_opt_pass *make_pass_profile (gcc::context *ctxt);
400extern gimple_opt_pass *make_pass_strip_predict_hints (gcc::context *ctxt);
401extern gimple_opt_pass *make_pass_lower_complex_O0 (gcc::context *ctxt);
402extern gimple_opt_pass *make_pass_lower_complex (gcc::context *ctxt);
403extern gimple_opt_pass *make_pass_lower_vector (gcc::context *ctxt);
404extern gimple_opt_pass *make_pass_lower_vector_ssa (gcc::context *ctxt);
405extern gimple_opt_pass *make_pass_lower_omp (gcc::context *ctxt);
406extern gimple_opt_pass *make_pass_diagnose_omp_blocks (gcc::context *ctxt);
407extern gimple_opt_pass *make_pass_expand_omp (gcc::context *ctxt);
27a4cd48
DM
408extern gimple_opt_pass *make_pass_object_sizes (gcc::context *ctxt);
409extern gimple_opt_pass *make_pass_strlen (gcc::context *ctxt);
410extern gimple_opt_pass *make_pass_fold_builtins (gcc::context *ctxt);
411extern gimple_opt_pass *make_pass_stdarg (gcc::context *ctxt);
412extern gimple_opt_pass *make_pass_early_warn_uninitialized (gcc::context *ctxt);
413extern gimple_opt_pass *make_pass_late_warn_uninitialized (gcc::context *ctxt);
414extern gimple_opt_pass *make_pass_cse_reciprocals (gcc::context *ctxt);
415extern gimple_opt_pass *make_pass_cse_sincos (gcc::context *ctxt);
416extern gimple_opt_pass *make_pass_optimize_bswap (gcc::context *ctxt);
417extern gimple_opt_pass *make_pass_optimize_widening_mul (gcc::context *ctxt);
418extern gimple_opt_pass *make_pass_warn_function_return (gcc::context *ctxt);
419extern gimple_opt_pass *make_pass_warn_function_noreturn (gcc::context *ctxt);
420extern gimple_opt_pass *make_pass_cselim (gcc::context *ctxt);
421extern gimple_opt_pass *make_pass_phiopt (gcc::context *ctxt);
422extern gimple_opt_pass *make_pass_forwprop (gcc::context *ctxt);
423extern gimple_opt_pass *make_pass_phiprop (gcc::context *ctxt);
424extern gimple_opt_pass *make_pass_tree_ifcombine (gcc::context *ctxt);
425extern gimple_opt_pass *make_pass_dse (gcc::context *ctxt);
426extern gimple_opt_pass *make_pass_nrv (gcc::context *ctxt);
427extern gimple_opt_pass *make_pass_rename_ssa_copies (gcc::context *ctxt);
428extern gimple_opt_pass *make_pass_sink_code (gcc::context *ctxt);
429extern gimple_opt_pass *make_pass_fre (gcc::context *ctxt);
430extern gimple_opt_pass *make_pass_check_data_deps (gcc::context *ctxt);
431extern gimple_opt_pass *make_pass_copy_prop (gcc::context *ctxt);
8fdc414d 432extern gimple_opt_pass *make_pass_isolate_erroneous_paths (gcc::context *ctxt);
27a4cd48
DM
433extern gimple_opt_pass *make_pass_vrp (gcc::context *ctxt);
434extern gimple_opt_pass *make_pass_uncprop (gcc::context *ctxt);
435extern gimple_opt_pass *make_pass_return_slot (gcc::context *ctxt);
436extern gimple_opt_pass *make_pass_reassoc (gcc::context *ctxt);
437extern gimple_opt_pass *make_pass_rebuild_cgraph_edges (gcc::context *ctxt);
438extern gimple_opt_pass *make_pass_remove_cgraph_callee_edges (gcc::context
439 *ctxt);
440extern gimple_opt_pass *make_pass_build_cgraph_edges (gcc::context *ctxt);
441extern gimple_opt_pass *make_pass_local_pure_const (gcc::context *ctxt);
442extern gimple_opt_pass *make_pass_tracer (gcc::context *ctxt);
443extern gimple_opt_pass *make_pass_warn_unused_result (gcc::context *ctxt);
444extern gimple_opt_pass *make_pass_diagnose_tm_blocks (gcc::context *ctxt);
445extern gimple_opt_pass *make_pass_lower_tm (gcc::context *ctxt);
446extern gimple_opt_pass *make_pass_tm_init (gcc::context *ctxt);
447extern gimple_opt_pass *make_pass_tm_mark (gcc::context *ctxt);
448extern gimple_opt_pass *make_pass_tm_memopt (gcc::context *ctxt);
449extern gimple_opt_pass *make_pass_tm_edges (gcc::context *ctxt);
450extern gimple_opt_pass *make_pass_split_functions (gcc::context *ctxt);
451extern gimple_opt_pass *make_pass_feedback_split_functions (gcc::context *ctxt);
452extern gimple_opt_pass *make_pass_strength_reduction (gcc::context *ctxt);
2077db1b 453extern gimple_opt_pass *make_pass_vtable_verify (gcc::context *ctxt);
b9a55b13
MP
454extern gimple_opt_pass *make_pass_ubsan (gcc::context *ctxt);
455extern gimple_opt_pass *make_pass_sanopt (gcc::context *ctxt);
6de9cd9a 456
012309e6 457/* IPA Passes */
27a4cd48
DM
458extern simple_ipa_opt_pass *make_pass_ipa_lower_emutls (gcc::context *ctxt);
459extern simple_ipa_opt_pass
460 *make_pass_ipa_function_and_variable_visibility (gcc::context *ctxt);
461extern simple_ipa_opt_pass *make_pass_ipa_tree_profile (gcc::context *ctxt);
462
463extern simple_ipa_opt_pass *make_pass_early_local_passes (gcc::context *ctxt);
464
465extern ipa_opt_pass_d *make_pass_ipa_whole_program_visibility (gcc::context
466 *ctxt);
27a4cd48
DM
467extern simple_ipa_opt_pass *make_pass_ipa_increase_alignment (gcc::context
468 *ctxt);
469extern ipa_opt_pass_d *make_pass_ipa_inline (gcc::context *ctxt);
470extern simple_ipa_opt_pass *make_pass_ipa_free_lang_data (gcc::context *ctxt);
471extern simple_ipa_opt_pass *make_pass_ipa_free_inline_summary (gcc::context
472 *ctxt);
473extern ipa_opt_pass_d *make_pass_ipa_cp (gcc::context *ctxt);
bbc9396b 474extern ipa_opt_pass_d *make_pass_ipa_devirt (gcc::context *ctxt);
27a4cd48
DM
475extern ipa_opt_pass_d *make_pass_ipa_reference (gcc::context *ctxt);
476extern ipa_opt_pass_d *make_pass_ipa_pure_const (gcc::context *ctxt);
477extern simple_ipa_opt_pass *make_pass_ipa_pta (gcc::context *ctxt);
27a4cd48 478extern simple_ipa_opt_pass *make_pass_ipa_tm (gcc::context *ctxt);
0136f8f0 479extern simple_ipa_opt_pass *make_pass_omp_simd_clone (gcc::context *ctxt);
27a4cd48
DM
480extern ipa_opt_pass_d *make_pass_ipa_profile (gcc::context *ctxt);
481extern ipa_opt_pass_d *make_pass_ipa_cdtor_merge (gcc::context *ctxt);
482
483extern gimple_opt_pass *make_pass_cleanup_cfg_post_optimizing (gcc::context
484 *ctxt);
485extern gimple_opt_pass *make_pass_init_datastructures (gcc::context *ctxt);
486extern gimple_opt_pass *make_pass_fixup_cfg (gcc::context *ctxt);
487
488extern rtl_opt_pass *make_pass_expand (gcc::context *ctxt);
489extern rtl_opt_pass *make_pass_instantiate_virtual_regs (gcc::context *ctxt);
490extern rtl_opt_pass *make_pass_rtl_fwprop (gcc::context *ctxt);
491extern rtl_opt_pass *make_pass_rtl_fwprop_addr (gcc::context *ctxt);
492extern rtl_opt_pass *make_pass_jump (gcc::context *ctxt);
493extern rtl_opt_pass *make_pass_jump2 (gcc::context *ctxt);
494extern rtl_opt_pass *make_pass_lower_subreg (gcc::context *ctxt);
495extern rtl_opt_pass *make_pass_cse (gcc::context *ctxt);
496extern rtl_opt_pass *make_pass_fast_rtl_dce (gcc::context *ctxt);
497extern rtl_opt_pass *make_pass_ud_rtl_dce (gcc::context *ctxt);
498extern rtl_opt_pass *make_pass_rtl_dce (gcc::context *ctxt);
499extern rtl_opt_pass *make_pass_rtl_dse1 (gcc::context *ctxt);
500extern rtl_opt_pass *make_pass_rtl_dse2 (gcc::context *ctxt);
501extern rtl_opt_pass *make_pass_rtl_dse3 (gcc::context *ctxt);
502extern rtl_opt_pass *make_pass_rtl_cprop (gcc::context *ctxt);
503extern rtl_opt_pass *make_pass_rtl_pre (gcc::context *ctxt);
504extern rtl_opt_pass *make_pass_rtl_hoist (gcc::context *ctxt);
505extern rtl_opt_pass *make_pass_rtl_store_motion (gcc::context *ctxt);
506extern rtl_opt_pass *make_pass_cse_after_global_opts (gcc::context *ctxt);
507extern rtl_opt_pass *make_pass_rtl_ifcvt (gcc::context *ctxt);
508
509extern rtl_opt_pass *make_pass_into_cfg_layout_mode (gcc::context *ctxt);
510extern rtl_opt_pass *make_pass_outof_cfg_layout_mode (gcc::context *ctxt);
511
512extern rtl_opt_pass *make_pass_loop2 (gcc::context *ctxt);
513extern rtl_opt_pass *make_pass_rtl_loop_init (gcc::context *ctxt);
514extern rtl_opt_pass *make_pass_rtl_move_loop_invariants (gcc::context *ctxt);
515extern rtl_opt_pass *make_pass_rtl_unswitch (gcc::context *ctxt);
516extern rtl_opt_pass *make_pass_rtl_unroll_and_peel_loops (gcc::context *ctxt);
517extern rtl_opt_pass *make_pass_rtl_doloop (gcc::context *ctxt);
518extern rtl_opt_pass *make_pass_rtl_loop_done (gcc::context *ctxt);
519
520extern rtl_opt_pass *make_pass_web (gcc::context *ctxt);
521extern rtl_opt_pass *make_pass_cse2 (gcc::context *ctxt);
522extern rtl_opt_pass *make_pass_df_initialize_opt (gcc::context *ctxt);
523extern rtl_opt_pass *make_pass_df_initialize_no_opt (gcc::context *ctxt);
524extern rtl_opt_pass *make_pass_reginfo_init (gcc::context *ctxt);
525extern rtl_opt_pass *make_pass_inc_dec (gcc::context *ctxt);
526extern rtl_opt_pass *make_pass_stack_ptr_mod (gcc::context *ctxt);
527extern rtl_opt_pass *make_pass_initialize_regs (gcc::context *ctxt);
528extern rtl_opt_pass *make_pass_combine (gcc::context *ctxt);
529extern rtl_opt_pass *make_pass_if_after_combine (gcc::context *ctxt);
530extern rtl_opt_pass *make_pass_ree (gcc::context *ctxt);
531extern rtl_opt_pass *make_pass_partition_blocks (gcc::context *ctxt);
532extern rtl_opt_pass *make_pass_match_asm_constraints (gcc::context *ctxt);
27a4cd48
DM
533extern rtl_opt_pass *make_pass_split_all_insns (gcc::context *ctxt);
534extern rtl_opt_pass *make_pass_fast_rtl_byte_dce (gcc::context *ctxt);
535extern rtl_opt_pass *make_pass_lower_subreg2 (gcc::context *ctxt);
536extern rtl_opt_pass *make_pass_mode_switching (gcc::context *ctxt);
537extern rtl_opt_pass *make_pass_sms (gcc::context *ctxt);
538extern rtl_opt_pass *make_pass_sched (gcc::context *ctxt);
f20f2613 539extern rtl_opt_pass *make_pass_live_range_shrinkage (gcc::context *ctxt);
27a4cd48
DM
540extern rtl_opt_pass *make_pass_ira (gcc::context *ctxt);
541extern rtl_opt_pass *make_pass_reload (gcc::context *ctxt);
542extern rtl_opt_pass *make_pass_clean_state (gcc::context *ctxt);
543extern rtl_opt_pass *make_pass_branch_prob (gcc::context *ctxt);
544extern rtl_opt_pass *make_pass_value_profile_transformations (gcc::context
545 *ctxt);
546extern rtl_opt_pass *make_pass_postreload_cse (gcc::context *ctxt);
547extern rtl_opt_pass *make_pass_gcse2 (gcc::context *ctxt);
548extern rtl_opt_pass *make_pass_split_after_reload (gcc::context *ctxt);
549extern rtl_opt_pass *make_pass_branch_target_load_optimize1 (gcc::context
550 *ctxt);
551extern rtl_opt_pass *make_pass_thread_prologue_and_epilogue (gcc::context
552 *ctxt);
553extern rtl_opt_pass *make_pass_stack_adjustments (gcc::context *ctxt);
554extern rtl_opt_pass *make_pass_peephole2 (gcc::context *ctxt);
555extern rtl_opt_pass *make_pass_if_after_reload (gcc::context *ctxt);
556extern rtl_opt_pass *make_pass_regrename (gcc::context *ctxt);
557extern rtl_opt_pass *make_pass_cprop_hardreg (gcc::context *ctxt);
558extern rtl_opt_pass *make_pass_reorder_blocks (gcc::context *ctxt);
559extern rtl_opt_pass *make_pass_branch_target_load_optimize2 (gcc::context
560 *ctxt);
561extern rtl_opt_pass *make_pass_leaf_regs (gcc::context *ctxt);
562extern rtl_opt_pass *make_pass_split_before_sched2 (gcc::context *ctxt);
563extern rtl_opt_pass *make_pass_compare_elim_after_reload (gcc::context *ctxt);
564extern rtl_opt_pass *make_pass_sched2 (gcc::context *ctxt);
565extern rtl_opt_pass *make_pass_stack_regs (gcc::context *ctxt);
566extern rtl_opt_pass *make_pass_stack_regs_run (gcc::context *ctxt);
567extern rtl_opt_pass *make_pass_df_finish (gcc::context *ctxt);
568extern rtl_opt_pass *make_pass_compute_alignments (gcc::context *ctxt);
569extern rtl_opt_pass *make_pass_duplicate_computed_gotos (gcc::context *ctxt);
570extern rtl_opt_pass *make_pass_variable_tracking (gcc::context *ctxt);
571extern rtl_opt_pass *make_pass_free_cfg (gcc::context *ctxt);
572extern rtl_opt_pass *make_pass_machine_reorg (gcc::context *ctxt);
573extern rtl_opt_pass *make_pass_cleanup_barriers (gcc::context *ctxt);
574extern rtl_opt_pass *make_pass_delay_slots (gcc::context *ctxt);
575extern rtl_opt_pass *make_pass_split_for_shorten_branches (gcc::context *ctxt);
576extern rtl_opt_pass *make_pass_split_before_regstack (gcc::context *ctxt);
577extern rtl_opt_pass *make_pass_convert_to_eh_region_ranges (gcc::context *ctxt);
578extern rtl_opt_pass *make_pass_shorten_branches (gcc::context *ctxt);
579extern rtl_opt_pass *make_pass_set_nothrow_function_flags (gcc::context *ctxt);
580extern rtl_opt_pass *make_pass_dwarf2_frame (gcc::context *ctxt);
581extern rtl_opt_pass *make_pass_final (gcc::context *ctxt);
582extern rtl_opt_pass *make_pass_rtl_seqabstr (gcc::context *ctxt);
583extern gimple_opt_pass *make_pass_release_ssa_names (gcc::context *ctxt);
584extern gimple_opt_pass *make_pass_early_inline (gcc::context *ctxt);
585extern gimple_opt_pass *make_pass_inline_parameters (gcc::context *ctxt);
586extern gimple_opt_pass *make_pass_update_address_taken (gcc::context *ctxt);
587extern gimple_opt_pass *make_pass_convert_switch (gcc::context *ctxt);
ef330312 588
9fe0cb7d 589/* Current optimization pass. */
6a5ac314 590extern opt_pass *current_pass;
9fe0cb7d 591
6a5ac314
OE
592extern bool execute_one_pass (opt_pass *);
593extern void execute_pass_list (opt_pass *);
594extern void execute_ipa_pass_list (opt_pass *);
595extern void execute_ipa_summary_passes (ipa_opt_pass_d *);
d7f09764 596extern void execute_all_ipa_transforms (void);
2c5721d9 597extern void execute_all_ipa_stmt_fixups (struct cgraph_node *, gimple *);
6a5ac314
OE
598extern bool pass_init_dump_file (opt_pass *);
599extern void pass_fini_dump_file (opt_pass *);
d7f09764 600
090fa0ab 601extern const char *get_current_pass_name (void);
6fb5fa3c
DB
602extern void print_current_pass (FILE *);
603extern void debug_pass (void);
d7f09764 604extern void ipa_write_summaries (void);
7b99cca4 605extern void ipa_write_optimization_summaries (struct lto_symtab_encoder_d *);
d7f09764 606extern void ipa_read_summaries (void);
e792884f 607extern void ipa_read_optimization_summaries (void);
6a5ac314 608extern void register_one_dump_file (opt_pass *);
33977f81 609extern bool function_called_by_processed_nodes_p (void);
b4861090 610
b02b9b53
ZD
611/* Set to true if the pass is called the first time during compilation of the
612 current function. Note that using this information in the optimization
613 passes is considered not to be clean, and it should be avoided if possible.
614 This flag is currently used to prevent loops from being peeled repeatedly
615 in jump threading; it will be removed once we preserve loop structures
616 throughout the compilation -- we will be able to mark the affected loops
617 directly in jump threading, and avoid peeling them next time. */
618extern bool first_pass_instance;
619
090fa0ab
GF
620/* Declare for plugins. */
621extern void do_per_function_toporder (void (*) (void *), void *);
622
226c52aa
XDL
623extern void disable_pass (const char *);
624extern void enable_pass (const char *);
deced1e2 625extern void dump_passes (void);
226c52aa 626
6de9cd9a 627#endif /* GCC_TREE_PASS_H */