]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-pass.h
2017-12-07 Richard Biener <rguenther@suse.de>
[thirdparty/gcc.git] / gcc / tree-pass.h
CommitLineData
4ee9c684 1/* Definitions for describing one tree-ssa optimization pass.
aad93da1 2 Copyright (C) 2004-2017 Free Software Foundation, Inc.
4ee9c684 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
8c4c00c1 9the Free Software Foundation; either version 3, or (at your option)
4ee9c684 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
8c4c00c1 18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
4ee9c684 20
21
22#ifndef GCC_TREE_PASS_H
23#define GCC_TREE_PASS_H 1
24
0b1615c1 25#include "timevar.h"
b9ed1410 26#include "dumpfile.h"
0f9005dd 27
31315c24 28struct function;
29
0b09525f 30/* Optimization pass type. */
31enum opt_pass_type
32{
33 GIMPLE_PASS,
34 RTL_PASS,
35 SIMPLE_IPA_PASS,
36 IPA_PASS
37};
38
bcfddb5b 39/* Metadata for a pass, non-varying across all instances of a pass. */
40struct pass_data
4ee9c684 41{
20099e35 42 /* Optimization pass type. */
0b09525f 43 enum opt_pass_type type;
44
9478582c 45 /* Terse name of the pass used as a fragment of the dump file
46 name. If the name starts with a star, no dump happens. */
4ee9c684 47 const char *name;
48
c7875731 49 /* The -fopt-info optimization group flags as defined in dumpfile.h. */
50 unsigned int optinfo_flags;
51
4ee9c684 52 /* The timevar id associated with this pass. */
53 /* ??? Ideally would be dynamically assigned. */
0b1615c1 54 timevar_id_t tv_id;
4ee9c684 55
56 /* Sets of properties input and output from this pass. */
57 unsigned int properties_required;
58 unsigned int properties_provided;
59 unsigned int properties_destroyed;
60
61 /* Flags indicating common sets things to do before and after. */
62 unsigned int todo_flags_start;
63 unsigned int todo_flags_finish;
20099e35 64};
65
bcfddb5b 66namespace gcc
67{
68 class context;
69} // namespace gcc
70
71/* An instance of a pass. This is also "pass_data" to minimize the
72 changes in existing code. */
5d068519 73class opt_pass : public pass_data
bcfddb5b 74{
75public:
76 virtual ~opt_pass () { }
77
78 /* Create a copy of this pass.
79
80 Passes that can have multiple instances must provide their own
81 implementation of this, to ensure that any sharing of state between
82 this instance and the copy is "wired up" correctly.
83
84 The default implementation prints an error message and aborts. */
85 virtual opt_pass *clone ();
bc179819 86 virtual void set_pass_param (unsigned int, bool);
bcfddb5b 87
92b56240 88 /* This pass and all sub-passes are executed only if the function returns
89 true. The default implementation returns true. */
31315c24 90 virtual bool gate (function *fun);
bcfddb5b 91
6698dfce 92 /* This is the code to run. If this is not overridden, then there should
bcfddb5b 93 be sub-passes otherwise this pass does nothing.
94 The return value contains TODOs to execute in addition to those in
95 TODO_flags_finish. */
65b0537f 96 virtual unsigned int execute (function *fun);
bcfddb5b 97
98protected:
9af5ce0c 99 opt_pass (const pass_data&, gcc::context *);
bcfddb5b 100
101public:
102 /* A list of sub-passes to run, dependent on gate predicate. */
b23e5d49 103 opt_pass *sub;
bcfddb5b 104
105 /* Next in the list of passes to run, independent of gate predicate. */
b23e5d49 106 opt_pass *next;
bcfddb5b 107
108 /* Static pass number, used as a fragment of the dump file name. */
109 int static_pass_number;
110
111protected:
ae84f584 112 gcc::context *m_ctxt;
bcfddb5b 113};
114
68e3904e 115/* Description of GIMPLE pass. */
bcfddb5b 116class gimple_opt_pass : public opt_pass
20099e35 117{
bcfddb5b 118protected:
9af5ce0c 119 gimple_opt_pass (const pass_data& data, gcc::context *ctxt)
120 : opt_pass (data, ctxt)
bcfddb5b 121 {
122 }
20099e35 123};
0f9005dd 124
f0b5f617 125/* Description of RTL pass. */
bcfddb5b 126class rtl_opt_pass : public opt_pass
20099e35 127{
bcfddb5b 128protected:
9af5ce0c 129 rtl_opt_pass (const pass_data& data, gcc::context *ctxt)
130 : opt_pass (data, ctxt)
bcfddb5b 131 {
132 }
20099e35 133};
134
098f44bc 135class varpool_node;
68e3904e 136struct cgraph_node;
5cf7e051 137struct lto_symtab_encoder_d;
68e3904e 138
139/* Description of IPA pass with generate summary, write, execute, read and
140 transform stages. */
bcfddb5b 141class ipa_opt_pass_d : public opt_pass
68e3904e 142{
bcfddb5b 143public:
9c1bff7a 144 /* IPA passes can analyze function body and variable initializers
145 using this hook and produce summary. */
146 void (*generate_summary) (void);
147
148 /* This hook is used to serialize IPA summaries on disk. */
eab36a5a 149 void (*write_summary) (void);
68e3904e 150
ddc90d88 151 /* This hook is used to deserialize IPA summaries from disk. */
9c1bff7a 152 void (*read_summary) (void);
ddc90d88 153
154 /* This hook is used to serialize IPA optimization summaries on disk. */
eab36a5a 155 void (*write_optimization_summary) (void);
ddc90d88 156
157 /* This hook is used to deserialize IPA summaries from disk. */
158 void (*read_optimization_summary) (void);
159
90464c8b 160 /* Hook to convert gimple stmt uids into true gimple statements. The second
161 parameter is an array of statements indexed by their uid. */
42acab1c 162 void (*stmt_fixup) (struct cgraph_node *, gimple **);
90464c8b 163
68e3904e 164 /* Results of interprocedural propagation of an IPA pass is applied to
165 function body via this hook. */
166 unsigned int function_transform_todo_flags_start;
167 unsigned int (*function_transform) (struct cgraph_node *);
098f44bc 168 void (*variable_transform) (varpool_node *);
bcfddb5b 169
170protected:
9af5ce0c 171 ipa_opt_pass_d (const pass_data& data, gcc::context *ctxt,
172 void (*generate_summary) (void),
173 void (*write_summary) (void),
174 void (*read_summary) (void),
175 void (*write_optimization_summary) (void),
176 void (*read_optimization_summary) (void),
42acab1c 177 void (*stmt_fixup) (struct cgraph_node *, gimple **),
9af5ce0c 178 unsigned int function_transform_todo_flags_start,
179 unsigned int (*function_transform) (struct cgraph_node *),
098f44bc 180 void (*variable_transform) (varpool_node *))
9af5ce0c 181 : opt_pass (data, ctxt),
182 generate_summary (generate_summary),
183 write_summary (write_summary),
184 read_summary (read_summary),
185 write_optimization_summary (write_optimization_summary),
186 read_optimization_summary (read_optimization_summary),
187 stmt_fixup (stmt_fixup),
188 function_transform_todo_flags_start (function_transform_todo_flags_start),
189 function_transform (function_transform),
190 variable_transform (variable_transform)
bcfddb5b 191 {
192 }
68e3904e 193};
194
195/* Description of simple IPA pass. Simple IPA passes have just one execute
20099e35 196 hook. */
bcfddb5b 197class simple_ipa_opt_pass : public opt_pass
20099e35 198{
bcfddb5b 199protected:
9af5ce0c 200 simple_ipa_opt_pass (const pass_data& data, gcc::context *ctxt)
201 : opt_pass (data, ctxt)
bcfddb5b 202 {
203 }
0f9005dd 204};
205
4ee9c684 206/* Pass properties. */
207#define PROP_gimple_any (1 << 0) /* entire gimple grammar */
208#define PROP_gimple_lcf (1 << 1) /* lowered control flow */
209#define PROP_gimple_leh (1 << 2) /* lowered eh */
210#define PROP_cfg (1 << 3)
b1b7c0c4 211#define PROP_ssa (1 << 5)
212#define PROP_no_crit_edges (1 << 6)
213#define PROP_rtl (1 << 7)
2f8eb909 214#define PROP_gimple_lomp (1 << 8) /* lowered OpenMP directives */
215#define PROP_cfglayout (1 << 9) /* cfglayout mode on RTL */
7b76dcb9 216#define PROP_gimple_lcx (1 << 10) /* lowered complex */
79f958cb 217#define PROP_loops (1 << 11) /* preserve loop structures */
7c3b431d 218#define PROP_gimple_lvec (1 << 12) /* lowered vector */
8917c50b 219#define PROP_gimple_eomp (1 << 13) /* no OpenMP directives */
82fc0e0a 220#define PROP_gimple_lva (1 << 14) /* No va_arg internal function. */
a153e7b3 221#define PROP_gimple_opt_math (1 << 15) /* Disable canonicalization
222 of math functions; the
223 current choices have
224 been optimized. */
bab6706a 225#define PROP_gimple_lomp_dev (1 << 16) /* done omp_device_lower */
8c4f9b73 226#define PROP_rtl_split_insns (1 << 17) /* RTL has insns split. */
5290ebdb 227
228#define PROP_trees \
6354626c 229 (PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh | PROP_gimple_lomp)
4ee9c684 230
231/* To-do flags. */
533c15bc 232#define TODO_do_not_ggc_collect (1 << 1)
88dbf20f 233#define TODO_cleanup_cfg (1 << 5)
2bdae241 234#define TODO_verify_il (1 << 6)
18841b0c 235#define TODO_dump_symtab (1 << 7)
f37a5008 236#define TODO_remove_functions (1 << 8)
4ae20857 237#define TODO_rebuild_frequencies (1 << 9)
88dbf20f 238
239/* To-do flags for calls to update_ssa. */
240
241/* Update the SSA form inserting PHI nodes for newly exposed symbols
242 and virtual names marked for updating. When updating real names,
243 only insert PHI nodes for a real name O_j in blocks reached by all
244 the new and old definitions for O_j. If the iterated dominance
245 frontier for O_j is not pruned, we may end up inserting PHI nodes
246 in blocks that have one or more edges with no incoming definition
247 for O_j. This would lead to uninitialized warnings for O_j's
248 symbol. */
0806b508 249#define TODO_update_ssa (1 << 11)
88dbf20f 250
251/* Update the SSA form without inserting any new PHI nodes at all.
252 This is used by passes that have either inserted all the PHI nodes
253 themselves or passes that need only to patch use-def and def-def
254 chains for virtuals (e.g., DCE). */
0806b508 255#define TODO_update_ssa_no_phi (1 << 12)
88dbf20f 256
442e3cb9 257/* Insert PHI nodes everywhere they are needed. No pruning of the
88dbf20f 258 IDF is done. This is used by passes that need the PHI nodes for
259 O_j even if it means that some arguments will come from the default
e01f9f1f 260 definition of O_j's symbol.
48e1416a 261
88dbf20f 262 WARNING: If you need to use this flag, chances are that your pass
263 may be doing something wrong. Inserting PHI nodes for an old name
264 where not all edges carry a new replacement may lead to silent
265 codegen errors or spurious uninitialized warnings. */
0806b508 266#define TODO_update_ssa_full_phi (1 << 13)
88dbf20f 267
268/* Passes that update the SSA form on their own may want to delegate
269 the updating of virtual names to the generic updater. Since FUD
270 chains are easier to maintain, this simplifies the work they need
271 to do. NOTE: If this flag is used, any OLD->NEW mappings for real
272 names are explicitly destroyed and only the symbols marked for
273 renaming are processed. */
0806b508 274#define TODO_update_ssa_only_virtuals (1 << 14)
88dbf20f 275
db22d3cc 276/* Some passes leave unused local variables that can be removed from
edb7afe8 277 cfun->local_decls. This reduces the size of dump files
278 and the memory footprint for VAR_DECLs. */
0806b508 279#define TODO_remove_unused_locals (1 << 15)
db22d3cc 280
3072d30e 281/* Call df_finish at the end of the pass. This is done after all of
282 the dumpers have been allowed to run so that they have access to
283 the instance before it is destroyed. */
0806b508 284#define TODO_df_finish (1 << 17)
3072d30e 285
314966f4 286/* Call df_verify at the end of the pass if checking is enabled. */
0806b508 287#define TODO_df_verify (1 << 18)
314966f4 288
7e0311ae 289/* Internally used for the first instance of a pass. */
0806b508 290#define TODO_mark_first_instance (1 << 19)
7e0311ae 291
b1b7c0c4 292/* Rebuild aliasing info. */
dd277d48 293#define TODO_rebuild_alias (1 << 20)
294
295/* Rebuild the addressable-vars bitmap and do register promotion. */
296#define TODO_update_address_taken (1 << 21)
b1b7c0c4 297
a15d5ede 298/* Rebuild the callgraph edges. */
299#define TODO_rebuild_cgraph_edges (1 << 22)
300
bf3a27b8 301/* Release function body and stop pass manager. */
302#define TODO_discard_function (1 << 23)
303
315a45ed 304/* Internally used in execute_function_todo(). */
88dbf20f 305#define TODO_update_ssa_any \
306 (TODO_update_ssa \
307 | TODO_update_ssa_no_phi \
308 | TODO_update_ssa_full_phi \
309 | TODO_update_ssa_only_virtuals)
4ee9c684 310
8b88439e 311#define TODO_verify_all TODO_verify_il
4ee9c684 312
3efe62a1 313
314/* Register pass info. */
315
316enum pass_positioning_ops
317{
318 PASS_POS_INSERT_AFTER, /* Insert after the reference pass. */
319 PASS_POS_INSERT_BEFORE, /* Insert before the reference pass. */
320 PASS_POS_REPLACE /* Replace the reference pass. */
321};
322
323struct register_pass_info
324{
b23e5d49 325 opt_pass *pass; /* New pass to register. */
3efe62a1 326 const char *reference_pass_name; /* Name of the reference pass for hooking
327 up the new pass. */
328 int ref_pass_instance_number; /* Insert the pass at the specified
329 instance number of the reference pass.
330 Do it for every instance if it is 0. */
331 enum pass_positioning_ops pos_op; /* how to insert the new pass. */
332};
333
b3521e4b 334/* Registers a new pass. Either fill out the register_pass_info or specify
335 the individual parameters. The pass object is expected to have been
336 allocated using operator new and the pass manager takes the ownership of
337 the pass object. */
338extern void register_pass (register_pass_info *);
339extern void register_pass (opt_pass* pass, pass_positioning_ops pos,
340 const char* ref_pass_name, int ref_pass_inst_number);
341
058a1b7a 342extern simple_ipa_opt_pass *make_pass_ipa_chkp_versioning (gcc::context *ctxt);
312322ab 343extern simple_ipa_opt_pass *make_pass_ipa_chkp_early_produce_thunks (gcc::context *ctxt);
058a1b7a 344extern simple_ipa_opt_pass *make_pass_ipa_chkp_produce_thunks (gcc::context *ctxt);
345extern gimple_opt_pass *make_pass_chkp (gcc::context *ctxt);
346extern gimple_opt_pass *make_pass_chkp_opt (gcc::context *ctxt);
cbe8bda8 347extern gimple_opt_pass *make_pass_asan (gcc::context *ctxt);
348extern gimple_opt_pass *make_pass_asan_O0 (gcc::context *ctxt);
349extern gimple_opt_pass *make_pass_tsan (gcc::context *ctxt);
350extern gimple_opt_pass *make_pass_tsan_O0 (gcc::context *ctxt);
d29e939c 351extern gimple_opt_pass *make_pass_sancov (gcc::context *ctxt);
352extern gimple_opt_pass *make_pass_sancov_O0 (gcc::context *ctxt);
cbe8bda8 353extern gimple_opt_pass *make_pass_lower_cf (gcc::context *ctxt);
354extern gimple_opt_pass *make_pass_refactor_eh (gcc::context *ctxt);
355extern gimple_opt_pass *make_pass_lower_eh (gcc::context *ctxt);
356extern gimple_opt_pass *make_pass_lower_eh_dispatch (gcc::context *ctxt);
357extern gimple_opt_pass *make_pass_lower_resx (gcc::context *ctxt);
358extern gimple_opt_pass *make_pass_build_cfg (gcc::context *ctxt);
359extern gimple_opt_pass *make_pass_early_tree_profile (gcc::context *ctxt);
360extern gimple_opt_pass *make_pass_cleanup_eh (gcc::context *ctxt);
361extern gimple_opt_pass *make_pass_sra (gcc::context *ctxt);
362extern gimple_opt_pass *make_pass_sra_early (gcc::context *ctxt);
363extern gimple_opt_pass *make_pass_early_ipa_sra (gcc::context *ctxt);
364extern gimple_opt_pass *make_pass_tail_recursion (gcc::context *ctxt);
365extern gimple_opt_pass *make_pass_tail_calls (gcc::context *ctxt);
bf8e217d 366extern gimple_opt_pass *make_pass_fix_loops (gcc::context *ctxt);
cbe8bda8 367extern gimple_opt_pass *make_pass_tree_loop (gcc::context *ctxt);
ef3f2b6f 368extern gimple_opt_pass *make_pass_tree_no_loop (gcc::context *ctxt);
cbe8bda8 369extern gimple_opt_pass *make_pass_tree_loop_init (gcc::context *ctxt);
370extern gimple_opt_pass *make_pass_lim (gcc::context *ctxt);
371extern gimple_opt_pass *make_pass_tree_unswitch (gcc::context *ctxt);
92a2a716 372extern gimple_opt_pass *make_pass_loop_split (gcc::context *ctxt);
cbe8bda8 373extern gimple_opt_pass *make_pass_predcom (gcc::context *ctxt);
374extern gimple_opt_pass *make_pass_iv_canon (gcc::context *ctxt);
375extern gimple_opt_pass *make_pass_scev_cprop (gcc::context *ctxt);
376extern gimple_opt_pass *make_pass_empty_loop (gcc::context *ctxt);
cbe8bda8 377extern gimple_opt_pass *make_pass_graphite (gcc::context *ctxt);
378extern gimple_opt_pass *make_pass_graphite_transforms (gcc::context *ctxt);
379extern gimple_opt_pass *make_pass_if_conversion (gcc::context *ctxt);
380extern gimple_opt_pass *make_pass_loop_distribution (gcc::context *ctxt);
381extern gimple_opt_pass *make_pass_vectorize (gcc::context *ctxt);
9918db44 382extern gimple_opt_pass *make_pass_simduid_cleanup (gcc::context *ctxt);
cbe8bda8 383extern gimple_opt_pass *make_pass_slp_vectorize (gcc::context *ctxt);
384extern gimple_opt_pass *make_pass_complete_unroll (gcc::context *ctxt);
385extern gimple_opt_pass *make_pass_complete_unrolli (gcc::context *ctxt);
386extern gimple_opt_pass *make_pass_parallelize_loops (gcc::context *ctxt);
387extern gimple_opt_pass *make_pass_loop_prefetch (gcc::context *ctxt);
388extern gimple_opt_pass *make_pass_iv_optimize (gcc::context *ctxt);
389extern gimple_opt_pass *make_pass_tree_loop_done (gcc::context *ctxt);
390extern gimple_opt_pass *make_pass_ch (gcc::context *ctxt);
e7f9a223 391extern gimple_opt_pass *make_pass_ch_vect (gcc::context *ctxt);
cbe8bda8 392extern gimple_opt_pass *make_pass_ccp (gcc::context *ctxt);
b0e3fe96 393extern gimple_opt_pass *make_pass_split_paths (gcc::context *ctxt);
cbe8bda8 394extern gimple_opt_pass *make_pass_phi_only_cprop (gcc::context *ctxt);
395extern gimple_opt_pass *make_pass_build_ssa (gcc::context *ctxt);
396extern gimple_opt_pass *make_pass_build_alias (gcc::context *ctxt);
397extern gimple_opt_pass *make_pass_build_ealias (gcc::context *ctxt);
398extern gimple_opt_pass *make_pass_dominator (gcc::context *ctxt);
399extern gimple_opt_pass *make_pass_dce (gcc::context *ctxt);
cbe8bda8 400extern gimple_opt_pass *make_pass_cd_dce (gcc::context *ctxt);
401extern gimple_opt_pass *make_pass_call_cdce (gcc::context *ctxt);
402extern gimple_opt_pass *make_pass_merge_phi (gcc::context *ctxt);
372172fe 403extern gimple_opt_pass *make_pass_thread_jumps (gcc::context *ctxt);
a18b7a33 404extern gimple_opt_pass *make_pass_early_thread_jumps (gcc::context *ctxt);
cbe8bda8 405extern gimple_opt_pass *make_pass_split_crit_edges (gcc::context *ctxt);
07d294f7 406extern gimple_opt_pass *make_pass_laddress (gcc::context *ctxt);
cbe8bda8 407extern gimple_opt_pass *make_pass_pre (gcc::context *ctxt);
51385f30 408extern unsigned int tail_merge_optimize (unsigned int);
cbe8bda8 409extern gimple_opt_pass *make_pass_profile (gcc::context *ctxt);
410extern gimple_opt_pass *make_pass_strip_predict_hints (gcc::context *ctxt);
411extern gimple_opt_pass *make_pass_lower_complex_O0 (gcc::context *ctxt);
412extern gimple_opt_pass *make_pass_lower_complex (gcc::context *ctxt);
1d5640e3 413extern gimple_opt_pass *make_pass_lower_switch (gcc::context *ctxt);
cbe8bda8 414extern gimple_opt_pass *make_pass_lower_vector (gcc::context *ctxt);
415extern gimple_opt_pass *make_pass_lower_vector_ssa (gcc::context *ctxt);
416extern gimple_opt_pass *make_pass_lower_omp (gcc::context *ctxt);
417extern gimple_opt_pass *make_pass_diagnose_omp_blocks (gcc::context *ctxt);
418extern gimple_opt_pass *make_pass_expand_omp (gcc::context *ctxt);
8917c50b 419extern gimple_opt_pass *make_pass_expand_omp_ssa (gcc::context *ctxt);
c0998828 420extern gimple_opt_pass *make_pass_omp_target_link (gcc::context *ctxt);
0bb0f256 421extern gimple_opt_pass *make_pass_oacc_device_lower (gcc::context *ctxt);
bab6706a 422extern gimple_opt_pass *make_pass_omp_device_lower (gcc::context *ctxt);
cbe8bda8 423extern gimple_opt_pass *make_pass_object_sizes (gcc::context *ctxt);
424extern gimple_opt_pass *make_pass_strlen (gcc::context *ctxt);
425extern gimple_opt_pass *make_pass_fold_builtins (gcc::context *ctxt);
184fac50 426extern gimple_opt_pass *make_pass_post_ipa_warn (gcc::context *ctxt);
cbe8bda8 427extern gimple_opt_pass *make_pass_stdarg (gcc::context *ctxt);
428extern gimple_opt_pass *make_pass_early_warn_uninitialized (gcc::context *ctxt);
429extern gimple_opt_pass *make_pass_late_warn_uninitialized (gcc::context *ctxt);
430extern gimple_opt_pass *make_pass_cse_reciprocals (gcc::context *ctxt);
431extern gimple_opt_pass *make_pass_cse_sincos (gcc::context *ctxt);
432extern gimple_opt_pass *make_pass_optimize_bswap (gcc::context *ctxt);
3d3e04ac 433extern gimple_opt_pass *make_pass_store_merging (gcc::context *ctxt);
cbe8bda8 434extern gimple_opt_pass *make_pass_optimize_widening_mul (gcc::context *ctxt);
435extern gimple_opt_pass *make_pass_warn_function_return (gcc::context *ctxt);
436extern gimple_opt_pass *make_pass_warn_function_noreturn (gcc::context *ctxt);
437extern gimple_opt_pass *make_pass_cselim (gcc::context *ctxt);
438extern gimple_opt_pass *make_pass_phiopt (gcc::context *ctxt);
439extern gimple_opt_pass *make_pass_forwprop (gcc::context *ctxt);
440extern gimple_opt_pass *make_pass_phiprop (gcc::context *ctxt);
441extern gimple_opt_pass *make_pass_tree_ifcombine (gcc::context *ctxt);
442extern gimple_opt_pass *make_pass_dse (gcc::context *ctxt);
443extern gimple_opt_pass *make_pass_nrv (gcc::context *ctxt);
444extern gimple_opt_pass *make_pass_rename_ssa_copies (gcc::context *ctxt);
445extern gimple_opt_pass *make_pass_sink_code (gcc::context *ctxt);
446extern gimple_opt_pass *make_pass_fre (gcc::context *ctxt);
447extern gimple_opt_pass *make_pass_check_data_deps (gcc::context *ctxt);
448extern gimple_opt_pass *make_pass_copy_prop (gcc::context *ctxt);
db242b6d 449extern gimple_opt_pass *make_pass_isolate_erroneous_paths (gcc::context *ctxt);
6e93da1b 450extern gimple_opt_pass *make_pass_early_vrp (gcc::context *ctxt);
cbe8bda8 451extern gimple_opt_pass *make_pass_vrp (gcc::context *ctxt);
452extern gimple_opt_pass *make_pass_uncprop (gcc::context *ctxt);
453extern gimple_opt_pass *make_pass_return_slot (gcc::context *ctxt);
454extern gimple_opt_pass *make_pass_reassoc (gcc::context *ctxt);
455extern gimple_opt_pass *make_pass_rebuild_cgraph_edges (gcc::context *ctxt);
456extern gimple_opt_pass *make_pass_remove_cgraph_callee_edges (gcc::context
457 *ctxt);
458extern gimple_opt_pass *make_pass_build_cgraph_edges (gcc::context *ctxt);
459extern gimple_opt_pass *make_pass_local_pure_const (gcc::context *ctxt);
73594827 460extern gimple_opt_pass *make_pass_nothrow (gcc::context *ctxt);
cbe8bda8 461extern gimple_opt_pass *make_pass_tracer (gcc::context *ctxt);
462extern gimple_opt_pass *make_pass_warn_unused_result (gcc::context *ctxt);
463extern gimple_opt_pass *make_pass_diagnose_tm_blocks (gcc::context *ctxt);
464extern gimple_opt_pass *make_pass_lower_tm (gcc::context *ctxt);
465extern gimple_opt_pass *make_pass_tm_init (gcc::context *ctxt);
466extern gimple_opt_pass *make_pass_tm_mark (gcc::context *ctxt);
467extern gimple_opt_pass *make_pass_tm_memopt (gcc::context *ctxt);
468extern gimple_opt_pass *make_pass_tm_edges (gcc::context *ctxt);
469extern gimple_opt_pass *make_pass_split_functions (gcc::context *ctxt);
470extern gimple_opt_pass *make_pass_feedback_split_functions (gcc::context *ctxt);
471extern gimple_opt_pass *make_pass_strength_reduction (gcc::context *ctxt);
b710ec85 472extern gimple_opt_pass *make_pass_vtable_verify (gcc::context *ctxt);
19b928d9 473extern gimple_opt_pass *make_pass_ubsan (gcc::context *ctxt);
474extern gimple_opt_pass *make_pass_sanopt (gcc::context *ctxt);
3abdee23 475extern gimple_opt_pass *make_pass_oacc_kernels (gcc::context *ctxt);
f71e6ee5 476extern simple_ipa_opt_pass *make_pass_ipa_oacc (gcc::context *ctxt);
477extern simple_ipa_opt_pass *make_pass_ipa_oacc_kernels (gcc::context *ctxt);
56686608 478extern gimple_opt_pass *make_pass_gen_hsail (gcc::context *ctxt);
7675e968 479extern gimple_opt_pass *make_pass_warn_nonnull_compare (gcc::context *ctxt);
b9833bfd 480extern gimple_opt_pass *make_pass_sprintf_length (gcc::context *ctxt);
da6cf191 481extern gimple_opt_pass *make_pass_walloca (gcc::context *ctxt);
4ee9c684 482
3dec5460 483/* IPA Passes */
cbe8bda8 484extern simple_ipa_opt_pass *make_pass_ipa_lower_emutls (gcc::context *ctxt);
485extern simple_ipa_opt_pass
486 *make_pass_ipa_function_and_variable_visibility (gcc::context *ctxt);
487extern simple_ipa_opt_pass *make_pass_ipa_tree_profile (gcc::context *ctxt);
94bed7c3 488extern simple_ipa_opt_pass *make_pass_ipa_auto_profile (gcc::context *ctxt);
cbe8bda8 489
058a1b7a 490extern simple_ipa_opt_pass *make_pass_build_ssa_passes (gcc::context *ctxt);
491extern simple_ipa_opt_pass *make_pass_chkp_instrumentation_passes (gcc::context *ctxt);
492extern simple_ipa_opt_pass *make_pass_local_optimization_passes (gcc::context *ctxt);
cbe8bda8 493
494extern ipa_opt_pass_d *make_pass_ipa_whole_program_visibility (gcc::context
495 *ctxt);
cbe8bda8 496extern simple_ipa_opt_pass *make_pass_ipa_increase_alignment (gcc::context
497 *ctxt);
a2da7d8a 498extern ipa_opt_pass_d *make_pass_ipa_fn_summary (gcc::context *ctxt);
cbe8bda8 499extern ipa_opt_pass_d *make_pass_ipa_inline (gcc::context *ctxt);
500extern simple_ipa_opt_pass *make_pass_ipa_free_lang_data (gcc::context *ctxt);
1297cbcd 501extern simple_ipa_opt_pass *make_pass_ipa_free_fn_summary (gcc::context *ctxt);
cbe8bda8 502extern ipa_opt_pass_d *make_pass_ipa_cp (gcc::context *ctxt);
52200d03 503extern ipa_opt_pass_d *make_pass_ipa_icf (gcc::context *ctxt);
84f6cc40 504extern ipa_opt_pass_d *make_pass_ipa_devirt (gcc::context *ctxt);
cbe8bda8 505extern ipa_opt_pass_d *make_pass_ipa_reference (gcc::context *ctxt);
56686608 506extern ipa_opt_pass_d *make_pass_ipa_hsa (gcc::context *ctxt);
cbe8bda8 507extern ipa_opt_pass_d *make_pass_ipa_pure_const (gcc::context *ctxt);
508extern simple_ipa_opt_pass *make_pass_ipa_pta (gcc::context *ctxt);
cbe8bda8 509extern simple_ipa_opt_pass *make_pass_ipa_tm (gcc::context *ctxt);
ab50af2a 510extern simple_ipa_opt_pass *make_pass_target_clone (gcc::context *ctxt);
511extern simple_ipa_opt_pass *make_pass_dispatcher_calls (gcc::context *ctxt);
d09768a4 512extern simple_ipa_opt_pass *make_pass_omp_simd_clone (gcc::context *ctxt);
cbe8bda8 513extern ipa_opt_pass_d *make_pass_ipa_profile (gcc::context *ctxt);
514extern ipa_opt_pass_d *make_pass_ipa_cdtor_merge (gcc::context *ctxt);
3f1f2be0 515extern ipa_opt_pass_d *make_pass_ipa_single_use (gcc::context *ctxt);
cf8b23bb 516extern ipa_opt_pass_d *make_pass_ipa_comdats (gcc::context *ctxt);
b35a87b1 517extern simple_ipa_opt_pass *make_pass_materialize_all_clones (gcc::context *
518 ctxt);
cbe8bda8 519
520extern gimple_opt_pass *make_pass_cleanup_cfg_post_optimizing (gcc::context
521 *ctxt);
cbe8bda8 522extern gimple_opt_pass *make_pass_fixup_cfg (gcc::context *ctxt);
7fc2f613 523extern gimple_opt_pass *make_pass_backprop (gcc::context *ctxt);
cbe8bda8 524
525extern rtl_opt_pass *make_pass_expand (gcc::context *ctxt);
526extern rtl_opt_pass *make_pass_instantiate_virtual_regs (gcc::context *ctxt);
527extern rtl_opt_pass *make_pass_rtl_fwprop (gcc::context *ctxt);
528extern rtl_opt_pass *make_pass_rtl_fwprop_addr (gcc::context *ctxt);
529extern rtl_opt_pass *make_pass_jump (gcc::context *ctxt);
530extern rtl_opt_pass *make_pass_jump2 (gcc::context *ctxt);
531extern rtl_opt_pass *make_pass_lower_subreg (gcc::context *ctxt);
532extern rtl_opt_pass *make_pass_cse (gcc::context *ctxt);
533extern rtl_opt_pass *make_pass_fast_rtl_dce (gcc::context *ctxt);
534extern rtl_opt_pass *make_pass_ud_rtl_dce (gcc::context *ctxt);
535extern rtl_opt_pass *make_pass_rtl_dce (gcc::context *ctxt);
536extern rtl_opt_pass *make_pass_rtl_dse1 (gcc::context *ctxt);
537extern rtl_opt_pass *make_pass_rtl_dse2 (gcc::context *ctxt);
538extern rtl_opt_pass *make_pass_rtl_dse3 (gcc::context *ctxt);
539extern rtl_opt_pass *make_pass_rtl_cprop (gcc::context *ctxt);
540extern rtl_opt_pass *make_pass_rtl_pre (gcc::context *ctxt);
541extern rtl_opt_pass *make_pass_rtl_hoist (gcc::context *ctxt);
542extern rtl_opt_pass *make_pass_rtl_store_motion (gcc::context *ctxt);
543extern rtl_opt_pass *make_pass_cse_after_global_opts (gcc::context *ctxt);
544extern rtl_opt_pass *make_pass_rtl_ifcvt (gcc::context *ctxt);
545
546extern rtl_opt_pass *make_pass_into_cfg_layout_mode (gcc::context *ctxt);
547extern rtl_opt_pass *make_pass_outof_cfg_layout_mode (gcc::context *ctxt);
548
549extern rtl_opt_pass *make_pass_loop2 (gcc::context *ctxt);
550extern rtl_opt_pass *make_pass_rtl_loop_init (gcc::context *ctxt);
551extern rtl_opt_pass *make_pass_rtl_move_loop_invariants (gcc::context *ctxt);
c836de3f 552extern rtl_opt_pass *make_pass_rtl_unroll_loops (gcc::context *ctxt);
cbe8bda8 553extern rtl_opt_pass *make_pass_rtl_doloop (gcc::context *ctxt);
554extern rtl_opt_pass *make_pass_rtl_loop_done (gcc::context *ctxt);
555
556extern rtl_opt_pass *make_pass_web (gcc::context *ctxt);
557extern rtl_opt_pass *make_pass_cse2 (gcc::context *ctxt);
558extern rtl_opt_pass *make_pass_df_initialize_opt (gcc::context *ctxt);
559extern rtl_opt_pass *make_pass_df_initialize_no_opt (gcc::context *ctxt);
560extern rtl_opt_pass *make_pass_reginfo_init (gcc::context *ctxt);
561extern rtl_opt_pass *make_pass_inc_dec (gcc::context *ctxt);
562extern rtl_opt_pass *make_pass_stack_ptr_mod (gcc::context *ctxt);
563extern rtl_opt_pass *make_pass_initialize_regs (gcc::context *ctxt);
564extern rtl_opt_pass *make_pass_combine (gcc::context *ctxt);
565extern rtl_opt_pass *make_pass_if_after_combine (gcc::context *ctxt);
566extern rtl_opt_pass *make_pass_ree (gcc::context *ctxt);
567extern rtl_opt_pass *make_pass_partition_blocks (gcc::context *ctxt);
568extern rtl_opt_pass *make_pass_match_asm_constraints (gcc::context *ctxt);
cbe8bda8 569extern rtl_opt_pass *make_pass_split_all_insns (gcc::context *ctxt);
570extern rtl_opt_pass *make_pass_fast_rtl_byte_dce (gcc::context *ctxt);
571extern rtl_opt_pass *make_pass_lower_subreg2 (gcc::context *ctxt);
572extern rtl_opt_pass *make_pass_mode_switching (gcc::context *ctxt);
573extern rtl_opt_pass *make_pass_sms (gcc::context *ctxt);
574extern rtl_opt_pass *make_pass_sched (gcc::context *ctxt);
57a8bf1b 575extern rtl_opt_pass *make_pass_live_range_shrinkage (gcc::context *ctxt);
cbe8bda8 576extern rtl_opt_pass *make_pass_ira (gcc::context *ctxt);
577extern rtl_opt_pass *make_pass_reload (gcc::context *ctxt);
578extern rtl_opt_pass *make_pass_clean_state (gcc::context *ctxt);
579extern rtl_opt_pass *make_pass_branch_prob (gcc::context *ctxt);
580extern rtl_opt_pass *make_pass_value_profile_transformations (gcc::context
581 *ctxt);
582extern rtl_opt_pass *make_pass_postreload_cse (gcc::context *ctxt);
583extern rtl_opt_pass *make_pass_gcse2 (gcc::context *ctxt);
584extern rtl_opt_pass *make_pass_split_after_reload (gcc::context *ctxt);
585extern rtl_opt_pass *make_pass_branch_target_load_optimize1 (gcc::context
586 *ctxt);
587extern rtl_opt_pass *make_pass_thread_prologue_and_epilogue (gcc::context
588 *ctxt);
589extern rtl_opt_pass *make_pass_stack_adjustments (gcc::context *ctxt);
012ad66c 590extern rtl_opt_pass *make_pass_sched_fusion (gcc::context *ctxt);
cbe8bda8 591extern rtl_opt_pass *make_pass_peephole2 (gcc::context *ctxt);
592extern rtl_opt_pass *make_pass_if_after_reload (gcc::context *ctxt);
593extern rtl_opt_pass *make_pass_regrename (gcc::context *ctxt);
594extern rtl_opt_pass *make_pass_cprop_hardreg (gcc::context *ctxt);
595extern rtl_opt_pass *make_pass_reorder_blocks (gcc::context *ctxt);
596extern rtl_opt_pass *make_pass_branch_target_load_optimize2 (gcc::context
597 *ctxt);
598extern rtl_opt_pass *make_pass_leaf_regs (gcc::context *ctxt);
599extern rtl_opt_pass *make_pass_split_before_sched2 (gcc::context *ctxt);
600extern rtl_opt_pass *make_pass_compare_elim_after_reload (gcc::context *ctxt);
601extern rtl_opt_pass *make_pass_sched2 (gcc::context *ctxt);
602extern rtl_opt_pass *make_pass_stack_regs (gcc::context *ctxt);
603extern rtl_opt_pass *make_pass_stack_regs_run (gcc::context *ctxt);
604extern rtl_opt_pass *make_pass_df_finish (gcc::context *ctxt);
605extern rtl_opt_pass *make_pass_compute_alignments (gcc::context *ctxt);
606extern rtl_opt_pass *make_pass_duplicate_computed_gotos (gcc::context *ctxt);
607extern rtl_opt_pass *make_pass_variable_tracking (gcc::context *ctxt);
608extern rtl_opt_pass *make_pass_free_cfg (gcc::context *ctxt);
609extern rtl_opt_pass *make_pass_machine_reorg (gcc::context *ctxt);
610extern rtl_opt_pass *make_pass_cleanup_barriers (gcc::context *ctxt);
611extern rtl_opt_pass *make_pass_delay_slots (gcc::context *ctxt);
612extern rtl_opt_pass *make_pass_split_for_shorten_branches (gcc::context *ctxt);
613extern rtl_opt_pass *make_pass_split_before_regstack (gcc::context *ctxt);
614extern rtl_opt_pass *make_pass_convert_to_eh_region_ranges (gcc::context *ctxt);
615extern rtl_opt_pass *make_pass_shorten_branches (gcc::context *ctxt);
616extern rtl_opt_pass *make_pass_set_nothrow_function_flags (gcc::context *ctxt);
617extern rtl_opt_pass *make_pass_dwarf2_frame (gcc::context *ctxt);
618extern rtl_opt_pass *make_pass_final (gcc::context *ctxt);
619extern rtl_opt_pass *make_pass_rtl_seqabstr (gcc::context *ctxt);
620extern gimple_opt_pass *make_pass_release_ssa_names (gcc::context *ctxt);
621extern gimple_opt_pass *make_pass_early_inline (gcc::context *ctxt);
a2da7d8a 622extern gimple_opt_pass *make_pass_local_fn_summary (gcc::context *ctxt);
cbe8bda8 623extern gimple_opt_pass *make_pass_update_address_taken (gcc::context *ctxt);
624extern gimple_opt_pass *make_pass_convert_switch (gcc::context *ctxt);
82fc0e0a 625extern gimple_opt_pass *make_pass_lower_vaarg (gcc::context *ctxt);
77fce4cd 626
9659d177 627/* Current optimization pass. */
b23e5d49 628extern opt_pass *current_pass;
9659d177 629
b23e5d49 630extern bool execute_one_pass (opt_pass *);
3538ae0d 631extern void execute_pass_list (function *, opt_pass *);
b23e5d49 632extern void execute_ipa_pass_list (opt_pass *);
633extern void execute_ipa_summary_passes (ipa_opt_pass_d *);
7bfefa9d 634extern void execute_all_ipa_transforms (void);
42acab1c 635extern void execute_all_ipa_stmt_fixups (struct cgraph_node *, gimple **);
b23e5d49 636extern bool pass_init_dump_file (opt_pass *);
637extern void pass_fini_dump_file (opt_pass *);
54fae019 638extern void emergency_dump_function (void);
7bfefa9d 639
3072d30e 640extern void print_current_pass (FILE *);
641extern void debug_pass (void);
9d65fe51 642extern void ipa_write_summaries (void);
5cf7e051 643extern void ipa_write_optimization_summaries (struct lto_symtab_encoder_d *);
7bfefa9d 644extern void ipa_read_summaries (void);
ddc90d88 645extern void ipa_read_optimization_summaries (void);
b23e5d49 646extern void register_one_dump_file (opt_pass *);
b5cebd44 647extern bool function_called_by_processed_nodes_p (void);
f1e2a033 648
c9036234 649/* Declare for plugins. */
3538ae0d 650extern void do_per_function_toporder (void (*) (function *, void *), void *);
c9036234 651
c3087ce0 652extern void disable_pass (const char *);
653extern void enable_pass (const char *);
ec4791a8 654extern void dump_passes (void);
c3087ce0 655
4ee9c684 656#endif /* GCC_TREE_PASS_H */