]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-pass.h
[testsuite] Add missing dg-require-effective-target label_values
[thirdparty/gcc.git] / gcc / tree-pass.h
CommitLineData
4ee9c684 1/* Definitions for describing one tree-ssa optimization pass.
fbd26352 2 Copyright (C) 2004-2019 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. */
54e7de93 50 optgroup_flags_t optinfo_flags;
c7875731 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
cbe8bda8 342extern gimple_opt_pass *make_pass_asan (gcc::context *ctxt);
343extern gimple_opt_pass *make_pass_asan_O0 (gcc::context *ctxt);
344extern gimple_opt_pass *make_pass_tsan (gcc::context *ctxt);
345extern gimple_opt_pass *make_pass_tsan_O0 (gcc::context *ctxt);
d29e939c 346extern gimple_opt_pass *make_pass_sancov (gcc::context *ctxt);
347extern gimple_opt_pass *make_pass_sancov_O0 (gcc::context *ctxt);
cbe8bda8 348extern gimple_opt_pass *make_pass_lower_cf (gcc::context *ctxt);
349extern gimple_opt_pass *make_pass_refactor_eh (gcc::context *ctxt);
350extern gimple_opt_pass *make_pass_lower_eh (gcc::context *ctxt);
351extern gimple_opt_pass *make_pass_lower_eh_dispatch (gcc::context *ctxt);
352extern gimple_opt_pass *make_pass_lower_resx (gcc::context *ctxt);
353extern gimple_opt_pass *make_pass_build_cfg (gcc::context *ctxt);
354extern gimple_opt_pass *make_pass_early_tree_profile (gcc::context *ctxt);
355extern gimple_opt_pass *make_pass_cleanup_eh (gcc::context *ctxt);
356extern gimple_opt_pass *make_pass_sra (gcc::context *ctxt);
357extern gimple_opt_pass *make_pass_sra_early (gcc::context *ctxt);
358extern gimple_opt_pass *make_pass_early_ipa_sra (gcc::context *ctxt);
359extern gimple_opt_pass *make_pass_tail_recursion (gcc::context *ctxt);
360extern gimple_opt_pass *make_pass_tail_calls (gcc::context *ctxt);
bf8e217d 361extern gimple_opt_pass *make_pass_fix_loops (gcc::context *ctxt);
cbe8bda8 362extern gimple_opt_pass *make_pass_tree_loop (gcc::context *ctxt);
ef3f2b6f 363extern gimple_opt_pass *make_pass_tree_no_loop (gcc::context *ctxt);
cbe8bda8 364extern gimple_opt_pass *make_pass_tree_loop_init (gcc::context *ctxt);
9435b515 365extern gimple_opt_pass *make_pass_loop_versioning (gcc::context *ctxt);
cbe8bda8 366extern gimple_opt_pass *make_pass_lim (gcc::context *ctxt);
5051abaf 367extern gimple_opt_pass *make_pass_linterchange (gcc::context *ctxt);
cbe8bda8 368extern gimple_opt_pass *make_pass_tree_unswitch (gcc::context *ctxt);
92a2a716 369extern gimple_opt_pass *make_pass_loop_split (gcc::context *ctxt);
baf1c4a6 370extern gimple_opt_pass *make_pass_loop_jam (gcc::context *ctxt);
cbe8bda8 371extern gimple_opt_pass *make_pass_predcom (gcc::context *ctxt);
372extern gimple_opt_pass *make_pass_iv_canon (gcc::context *ctxt);
373extern gimple_opt_pass *make_pass_scev_cprop (gcc::context *ctxt);
374extern gimple_opt_pass *make_pass_empty_loop (gcc::context *ctxt);
cbe8bda8 375extern gimple_opt_pass *make_pass_graphite (gcc::context *ctxt);
376extern gimple_opt_pass *make_pass_graphite_transforms (gcc::context *ctxt);
377extern gimple_opt_pass *make_pass_if_conversion (gcc::context *ctxt);
378extern gimple_opt_pass *make_pass_loop_distribution (gcc::context *ctxt);
379extern gimple_opt_pass *make_pass_vectorize (gcc::context *ctxt);
9918db44 380extern gimple_opt_pass *make_pass_simduid_cleanup (gcc::context *ctxt);
cbe8bda8 381extern gimple_opt_pass *make_pass_slp_vectorize (gcc::context *ctxt);
382extern gimple_opt_pass *make_pass_complete_unroll (gcc::context *ctxt);
383extern gimple_opt_pass *make_pass_complete_unrolli (gcc::context *ctxt);
384extern gimple_opt_pass *make_pass_parallelize_loops (gcc::context *ctxt);
385extern gimple_opt_pass *make_pass_loop_prefetch (gcc::context *ctxt);
386extern gimple_opt_pass *make_pass_iv_optimize (gcc::context *ctxt);
387extern gimple_opt_pass *make_pass_tree_loop_done (gcc::context *ctxt);
388extern gimple_opt_pass *make_pass_ch (gcc::context *ctxt);
e7f9a223 389extern gimple_opt_pass *make_pass_ch_vect (gcc::context *ctxt);
cbe8bda8 390extern gimple_opt_pass *make_pass_ccp (gcc::context *ctxt);
b0e3fe96 391extern gimple_opt_pass *make_pass_split_paths (gcc::context *ctxt);
cbe8bda8 392extern gimple_opt_pass *make_pass_build_ssa (gcc::context *ctxt);
393extern gimple_opt_pass *make_pass_build_alias (gcc::context *ctxt);
394extern gimple_opt_pass *make_pass_build_ealias (gcc::context *ctxt);
395extern gimple_opt_pass *make_pass_dominator (gcc::context *ctxt);
396extern gimple_opt_pass *make_pass_dce (gcc::context *ctxt);
cbe8bda8 397extern gimple_opt_pass *make_pass_cd_dce (gcc::context *ctxt);
398extern gimple_opt_pass *make_pass_call_cdce (gcc::context *ctxt);
399extern gimple_opt_pass *make_pass_merge_phi (gcc::context *ctxt);
372172fe 400extern gimple_opt_pass *make_pass_thread_jumps (gcc::context *ctxt);
a18b7a33 401extern gimple_opt_pass *make_pass_early_thread_jumps (gcc::context *ctxt);
cbe8bda8 402extern gimple_opt_pass *make_pass_split_crit_edges (gcc::context *ctxt);
07d294f7 403extern gimple_opt_pass *make_pass_laddress (gcc::context *ctxt);
cbe8bda8 404extern gimple_opt_pass *make_pass_pre (gcc::context *ctxt);
51385f30 405extern unsigned int tail_merge_optimize (unsigned int);
cbe8bda8 406extern gimple_opt_pass *make_pass_profile (gcc::context *ctxt);
407extern gimple_opt_pass *make_pass_strip_predict_hints (gcc::context *ctxt);
408extern gimple_opt_pass *make_pass_lower_complex_O0 (gcc::context *ctxt);
409extern gimple_opt_pass *make_pass_lower_complex (gcc::context *ctxt);
1d5640e3 410extern gimple_opt_pass *make_pass_lower_switch (gcc::context *ctxt);
12b322e0 411extern gimple_opt_pass *make_pass_lower_switch_O0 (gcc::context *ctxt);
cbe8bda8 412extern gimple_opt_pass *make_pass_lower_vector (gcc::context *ctxt);
413extern gimple_opt_pass *make_pass_lower_vector_ssa (gcc::context *ctxt);
414extern gimple_opt_pass *make_pass_lower_omp (gcc::context *ctxt);
415extern gimple_opt_pass *make_pass_diagnose_omp_blocks (gcc::context *ctxt);
416extern gimple_opt_pass *make_pass_expand_omp (gcc::context *ctxt);
8917c50b 417extern gimple_opt_pass *make_pass_expand_omp_ssa (gcc::context *ctxt);
c0998828 418extern gimple_opt_pass *make_pass_omp_target_link (gcc::context *ctxt);
0bb0f256 419extern gimple_opt_pass *make_pass_oacc_device_lower (gcc::context *ctxt);
bab6706a 420extern gimple_opt_pass *make_pass_omp_device_lower (gcc::context *ctxt);
cbe8bda8 421extern gimple_opt_pass *make_pass_object_sizes (gcc::context *ctxt);
422extern gimple_opt_pass *make_pass_strlen (gcc::context *ctxt);
423extern gimple_opt_pass *make_pass_fold_builtins (gcc::context *ctxt);
184fac50 424extern gimple_opt_pass *make_pass_post_ipa_warn (gcc::context *ctxt);
cbe8bda8 425extern gimple_opt_pass *make_pass_stdarg (gcc::context *ctxt);
426extern gimple_opt_pass *make_pass_early_warn_uninitialized (gcc::context *ctxt);
427extern gimple_opt_pass *make_pass_late_warn_uninitialized (gcc::context *ctxt);
428extern gimple_opt_pass *make_pass_cse_reciprocals (gcc::context *ctxt);
429extern gimple_opt_pass *make_pass_cse_sincos (gcc::context *ctxt);
430extern gimple_opt_pass *make_pass_optimize_bswap (gcc::context *ctxt);
3d3e04ac 431extern gimple_opt_pass *make_pass_store_merging (gcc::context *ctxt);
cbe8bda8 432extern gimple_opt_pass *make_pass_optimize_widening_mul (gcc::context *ctxt);
433extern gimple_opt_pass *make_pass_warn_function_return (gcc::context *ctxt);
434extern gimple_opt_pass *make_pass_warn_function_noreturn (gcc::context *ctxt);
435extern gimple_opt_pass *make_pass_cselim (gcc::context *ctxt);
436extern gimple_opt_pass *make_pass_phiopt (gcc::context *ctxt);
437extern gimple_opt_pass *make_pass_forwprop (gcc::context *ctxt);
438extern gimple_opt_pass *make_pass_phiprop (gcc::context *ctxt);
439extern gimple_opt_pass *make_pass_tree_ifcombine (gcc::context *ctxt);
440extern gimple_opt_pass *make_pass_dse (gcc::context *ctxt);
441extern gimple_opt_pass *make_pass_nrv (gcc::context *ctxt);
442extern gimple_opt_pass *make_pass_rename_ssa_copies (gcc::context *ctxt);
443extern gimple_opt_pass *make_pass_sink_code (gcc::context *ctxt);
444extern gimple_opt_pass *make_pass_fre (gcc::context *ctxt);
445extern gimple_opt_pass *make_pass_check_data_deps (gcc::context *ctxt);
446extern gimple_opt_pass *make_pass_copy_prop (gcc::context *ctxt);
db242b6d 447extern gimple_opt_pass *make_pass_isolate_erroneous_paths (gcc::context *ctxt);
6e93da1b 448extern gimple_opt_pass *make_pass_early_vrp (gcc::context *ctxt);
cbe8bda8 449extern gimple_opt_pass *make_pass_vrp (gcc::context *ctxt);
450extern gimple_opt_pass *make_pass_uncprop (gcc::context *ctxt);
451extern gimple_opt_pass *make_pass_return_slot (gcc::context *ctxt);
452extern gimple_opt_pass *make_pass_reassoc (gcc::context *ctxt);
453extern gimple_opt_pass *make_pass_rebuild_cgraph_edges (gcc::context *ctxt);
454extern gimple_opt_pass *make_pass_remove_cgraph_callee_edges (gcc::context
455 *ctxt);
456extern gimple_opt_pass *make_pass_build_cgraph_edges (gcc::context *ctxt);
457extern gimple_opt_pass *make_pass_local_pure_const (gcc::context *ctxt);
73594827 458extern gimple_opt_pass *make_pass_nothrow (gcc::context *ctxt);
cbe8bda8 459extern gimple_opt_pass *make_pass_tracer (gcc::context *ctxt);
e6a18b5a 460extern gimple_opt_pass *make_pass_warn_restrict (gcc::context *ctxt);
cbe8bda8 461extern gimple_opt_pass *make_pass_warn_unused_result (gcc::context *ctxt);
462extern gimple_opt_pass *make_pass_diagnose_tm_blocks (gcc::context *ctxt);
463extern gimple_opt_pass *make_pass_lower_tm (gcc::context *ctxt);
464extern gimple_opt_pass *make_pass_tm_init (gcc::context *ctxt);
465extern gimple_opt_pass *make_pass_tm_mark (gcc::context *ctxt);
466extern gimple_opt_pass *make_pass_tm_memopt (gcc::context *ctxt);
467extern gimple_opt_pass *make_pass_tm_edges (gcc::context *ctxt);
468extern gimple_opt_pass *make_pass_split_functions (gcc::context *ctxt);
469extern gimple_opt_pass *make_pass_feedback_split_functions (gcc::context *ctxt);
470extern gimple_opt_pass *make_pass_strength_reduction (gcc::context *ctxt);
b710ec85 471extern gimple_opt_pass *make_pass_vtable_verify (gcc::context *ctxt);
19b928d9 472extern gimple_opt_pass *make_pass_ubsan (gcc::context *ctxt);
473extern gimple_opt_pass *make_pass_sanopt (gcc::context *ctxt);
3abdee23 474extern gimple_opt_pass *make_pass_oacc_kernels (gcc::context *ctxt);
f71e6ee5 475extern simple_ipa_opt_pass *make_pass_ipa_oacc (gcc::context *ctxt);
476extern simple_ipa_opt_pass *make_pass_ipa_oacc_kernels (gcc::context *ctxt);
56686608 477extern gimple_opt_pass *make_pass_gen_hsail (gcc::context *ctxt);
7675e968 478extern gimple_opt_pass *make_pass_warn_nonnull_compare (gcc::context *ctxt);
b9833bfd 479extern gimple_opt_pass *make_pass_sprintf_length (gcc::context *ctxt);
da6cf191 480extern gimple_opt_pass *make_pass_walloca (gcc::context *ctxt);
4ee9c684 481
3dec5460 482/* IPA Passes */
cbe8bda8 483extern simple_ipa_opt_pass *make_pass_ipa_lower_emutls (gcc::context *ctxt);
484extern simple_ipa_opt_pass
485 *make_pass_ipa_function_and_variable_visibility (gcc::context *ctxt);
486extern simple_ipa_opt_pass *make_pass_ipa_tree_profile (gcc::context *ctxt);
94bed7c3 487extern simple_ipa_opt_pass *make_pass_ipa_auto_profile (gcc::context *ctxt);
cbe8bda8 488
058a1b7a 489extern simple_ipa_opt_pass *make_pass_build_ssa_passes (gcc::context *ctxt);
058a1b7a 490extern simple_ipa_opt_pass *make_pass_local_optimization_passes (gcc::context *ctxt);
bd9b7962 491extern simple_ipa_opt_pass *make_pass_ipa_remove_symbols (gcc::context *ctxt);
cbe8bda8 492
493extern ipa_opt_pass_d *make_pass_ipa_whole_program_visibility (gcc::context
494 *ctxt);
cbe8bda8 495extern simple_ipa_opt_pass *make_pass_ipa_increase_alignment (gcc::context
496 *ctxt);
a2da7d8a 497extern ipa_opt_pass_d *make_pass_ipa_fn_summary (gcc::context *ctxt);
cbe8bda8 498extern ipa_opt_pass_d *make_pass_ipa_inline (gcc::context *ctxt);
499extern simple_ipa_opt_pass *make_pass_ipa_free_lang_data (gcc::context *ctxt);
1297cbcd 500extern simple_ipa_opt_pass *make_pass_ipa_free_fn_summary (gcc::context *ctxt);
cbe8bda8 501extern ipa_opt_pass_d *make_pass_ipa_cp (gcc::context *ctxt);
52200d03 502extern ipa_opt_pass_d *make_pass_ipa_icf (gcc::context *ctxt);
84f6cc40 503extern ipa_opt_pass_d *make_pass_ipa_devirt (gcc::context *ctxt);
cbe8bda8 504extern ipa_opt_pass_d *make_pass_ipa_reference (gcc::context *ctxt);
56686608 505extern ipa_opt_pass_d *make_pass_ipa_hsa (gcc::context *ctxt);
cbe8bda8 506extern ipa_opt_pass_d *make_pass_ipa_pure_const (gcc::context *ctxt);
507extern simple_ipa_opt_pass *make_pass_ipa_pta (gcc::context *ctxt);
cbe8bda8 508extern simple_ipa_opt_pass *make_pass_ipa_tm (gcc::context *ctxt);
ab50af2a 509extern simple_ipa_opt_pass *make_pass_target_clone (gcc::context *ctxt);
510extern simple_ipa_opt_pass *make_pass_dispatcher_calls (gcc::context *ctxt);
d09768a4 511extern simple_ipa_opt_pass *make_pass_omp_simd_clone (gcc::context *ctxt);
cbe8bda8 512extern ipa_opt_pass_d *make_pass_ipa_profile (gcc::context *ctxt);
513extern ipa_opt_pass_d *make_pass_ipa_cdtor_merge (gcc::context *ctxt);
3f1f2be0 514extern ipa_opt_pass_d *make_pass_ipa_single_use (gcc::context *ctxt);
cf8b23bb 515extern ipa_opt_pass_d *make_pass_ipa_comdats (gcc::context *ctxt);
b35a87b1 516extern simple_ipa_opt_pass *make_pass_materialize_all_clones (gcc::context *
517 ctxt);
cbe8bda8 518
519extern gimple_opt_pass *make_pass_cleanup_cfg_post_optimizing (gcc::context
520 *ctxt);
cbe8bda8 521extern gimple_opt_pass *make_pass_fixup_cfg (gcc::context *ctxt);
7fc2f613 522extern gimple_opt_pass *make_pass_backprop (gcc::context *ctxt);
cbe8bda8 523
524extern rtl_opt_pass *make_pass_expand (gcc::context *ctxt);
525extern rtl_opt_pass *make_pass_instantiate_virtual_regs (gcc::context *ctxt);
526extern rtl_opt_pass *make_pass_rtl_fwprop (gcc::context *ctxt);
527extern rtl_opt_pass *make_pass_rtl_fwprop_addr (gcc::context *ctxt);
528extern rtl_opt_pass *make_pass_jump (gcc::context *ctxt);
529extern rtl_opt_pass *make_pass_jump2 (gcc::context *ctxt);
530extern rtl_opt_pass *make_pass_lower_subreg (gcc::context *ctxt);
531extern rtl_opt_pass *make_pass_cse (gcc::context *ctxt);
532extern rtl_opt_pass *make_pass_fast_rtl_dce (gcc::context *ctxt);
533extern rtl_opt_pass *make_pass_ud_rtl_dce (gcc::context *ctxt);
534extern rtl_opt_pass *make_pass_rtl_dce (gcc::context *ctxt);
535extern rtl_opt_pass *make_pass_rtl_dse1 (gcc::context *ctxt);
536extern rtl_opt_pass *make_pass_rtl_dse2 (gcc::context *ctxt);
537extern rtl_opt_pass *make_pass_rtl_dse3 (gcc::context *ctxt);
538extern rtl_opt_pass *make_pass_rtl_cprop (gcc::context *ctxt);
539extern rtl_opt_pass *make_pass_rtl_pre (gcc::context *ctxt);
540extern rtl_opt_pass *make_pass_rtl_hoist (gcc::context *ctxt);
541extern rtl_opt_pass *make_pass_rtl_store_motion (gcc::context *ctxt);
542extern rtl_opt_pass *make_pass_cse_after_global_opts (gcc::context *ctxt);
543extern rtl_opt_pass *make_pass_rtl_ifcvt (gcc::context *ctxt);
544
545extern rtl_opt_pass *make_pass_into_cfg_layout_mode (gcc::context *ctxt);
546extern rtl_opt_pass *make_pass_outof_cfg_layout_mode (gcc::context *ctxt);
547
548extern rtl_opt_pass *make_pass_loop2 (gcc::context *ctxt);
549extern rtl_opt_pass *make_pass_rtl_loop_init (gcc::context *ctxt);
550extern rtl_opt_pass *make_pass_rtl_move_loop_invariants (gcc::context *ctxt);
c836de3f 551extern rtl_opt_pass *make_pass_rtl_unroll_loops (gcc::context *ctxt);
cbe8bda8 552extern rtl_opt_pass *make_pass_rtl_doloop (gcc::context *ctxt);
553extern rtl_opt_pass *make_pass_rtl_loop_done (gcc::context *ctxt);
554
555extern rtl_opt_pass *make_pass_web (gcc::context *ctxt);
556extern rtl_opt_pass *make_pass_cse2 (gcc::context *ctxt);
557extern rtl_opt_pass *make_pass_df_initialize_opt (gcc::context *ctxt);
558extern rtl_opt_pass *make_pass_df_initialize_no_opt (gcc::context *ctxt);
559extern rtl_opt_pass *make_pass_reginfo_init (gcc::context *ctxt);
560extern rtl_opt_pass *make_pass_inc_dec (gcc::context *ctxt);
561extern rtl_opt_pass *make_pass_stack_ptr_mod (gcc::context *ctxt);
562extern rtl_opt_pass *make_pass_initialize_regs (gcc::context *ctxt);
563extern rtl_opt_pass *make_pass_combine (gcc::context *ctxt);
564extern rtl_opt_pass *make_pass_if_after_combine (gcc::context *ctxt);
565extern rtl_opt_pass *make_pass_ree (gcc::context *ctxt);
566extern rtl_opt_pass *make_pass_partition_blocks (gcc::context *ctxt);
567extern rtl_opt_pass *make_pass_match_asm_constraints (gcc::context *ctxt);
cbe8bda8 568extern rtl_opt_pass *make_pass_split_all_insns (gcc::context *ctxt);
569extern rtl_opt_pass *make_pass_fast_rtl_byte_dce (gcc::context *ctxt);
570extern rtl_opt_pass *make_pass_lower_subreg2 (gcc::context *ctxt);
571extern rtl_opt_pass *make_pass_mode_switching (gcc::context *ctxt);
572extern rtl_opt_pass *make_pass_sms (gcc::context *ctxt);
573extern rtl_opt_pass *make_pass_sched (gcc::context *ctxt);
57a8bf1b 574extern rtl_opt_pass *make_pass_live_range_shrinkage (gcc::context *ctxt);
62958b22 575extern rtl_opt_pass *make_pass_early_remat (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);
6463091b 582extern rtl_opt_pass *make_pass_postreload_jump (gcc::context *ctxt);
cbe8bda8 583extern rtl_opt_pass *make_pass_postreload_cse (gcc::context *ctxt);
584extern rtl_opt_pass *make_pass_gcse2 (gcc::context *ctxt);
585extern rtl_opt_pass *make_pass_split_after_reload (gcc::context *ctxt);
586extern rtl_opt_pass *make_pass_branch_target_load_optimize1 (gcc::context
587 *ctxt);
588extern rtl_opt_pass *make_pass_thread_prologue_and_epilogue (gcc::context
589 *ctxt);
590extern rtl_opt_pass *make_pass_stack_adjustments (gcc::context *ctxt);
012ad66c 591extern rtl_opt_pass *make_pass_sched_fusion (gcc::context *ctxt);
cbe8bda8 592extern rtl_opt_pass *make_pass_peephole2 (gcc::context *ctxt);
593extern rtl_opt_pass *make_pass_if_after_reload (gcc::context *ctxt);
594extern rtl_opt_pass *make_pass_regrename (gcc::context *ctxt);
595extern rtl_opt_pass *make_pass_cprop_hardreg (gcc::context *ctxt);
596extern rtl_opt_pass *make_pass_reorder_blocks (gcc::context *ctxt);
597extern rtl_opt_pass *make_pass_branch_target_load_optimize2 (gcc::context
598 *ctxt);
599extern rtl_opt_pass *make_pass_leaf_regs (gcc::context *ctxt);
600extern rtl_opt_pass *make_pass_split_before_sched2 (gcc::context *ctxt);
601extern rtl_opt_pass *make_pass_compare_elim_after_reload (gcc::context *ctxt);
602extern rtl_opt_pass *make_pass_sched2 (gcc::context *ctxt);
603extern rtl_opt_pass *make_pass_stack_regs (gcc::context *ctxt);
604extern rtl_opt_pass *make_pass_stack_regs_run (gcc::context *ctxt);
605extern rtl_opt_pass *make_pass_df_finish (gcc::context *ctxt);
606extern rtl_opt_pass *make_pass_compute_alignments (gcc::context *ctxt);
607extern rtl_opt_pass *make_pass_duplicate_computed_gotos (gcc::context *ctxt);
608extern rtl_opt_pass *make_pass_variable_tracking (gcc::context *ctxt);
609extern rtl_opt_pass *make_pass_free_cfg (gcc::context *ctxt);
610extern rtl_opt_pass *make_pass_machine_reorg (gcc::context *ctxt);
611extern rtl_opt_pass *make_pass_cleanup_barriers (gcc::context *ctxt);
612extern rtl_opt_pass *make_pass_delay_slots (gcc::context *ctxt);
613extern rtl_opt_pass *make_pass_split_for_shorten_branches (gcc::context *ctxt);
614extern rtl_opt_pass *make_pass_split_before_regstack (gcc::context *ctxt);
615extern rtl_opt_pass *make_pass_convert_to_eh_region_ranges (gcc::context *ctxt);
616extern rtl_opt_pass *make_pass_shorten_branches (gcc::context *ctxt);
617extern rtl_opt_pass *make_pass_set_nothrow_function_flags (gcc::context *ctxt);
618extern rtl_opt_pass *make_pass_dwarf2_frame (gcc::context *ctxt);
619extern rtl_opt_pass *make_pass_final (gcc::context *ctxt);
620extern rtl_opt_pass *make_pass_rtl_seqabstr (gcc::context *ctxt);
621extern gimple_opt_pass *make_pass_release_ssa_names (gcc::context *ctxt);
622extern gimple_opt_pass *make_pass_early_inline (gcc::context *ctxt);
a2da7d8a 623extern gimple_opt_pass *make_pass_local_fn_summary (gcc::context *ctxt);
cbe8bda8 624extern gimple_opt_pass *make_pass_update_address_taken (gcc::context *ctxt);
625extern gimple_opt_pass *make_pass_convert_switch (gcc::context *ctxt);
82fc0e0a 626extern gimple_opt_pass *make_pass_lower_vaarg (gcc::context *ctxt);
77fce4cd 627
9659d177 628/* Current optimization pass. */
b23e5d49 629extern opt_pass *current_pass;
9659d177 630
b23e5d49 631extern bool execute_one_pass (opt_pass *);
3538ae0d 632extern void execute_pass_list (function *, opt_pass *);
b23e5d49 633extern void execute_ipa_pass_list (opt_pass *);
634extern void execute_ipa_summary_passes (ipa_opt_pass_d *);
7bfefa9d 635extern void execute_all_ipa_transforms (void);
42acab1c 636extern void execute_all_ipa_stmt_fixups (struct cgraph_node *, gimple **);
b23e5d49 637extern bool pass_init_dump_file (opt_pass *);
638extern void pass_fini_dump_file (opt_pass *);
54fae019 639extern void emergency_dump_function (void);
7bfefa9d 640
3072d30e 641extern void print_current_pass (FILE *);
642extern void debug_pass (void);
9d65fe51 643extern void ipa_write_summaries (void);
5cf7e051 644extern void ipa_write_optimization_summaries (struct lto_symtab_encoder_d *);
7bfefa9d 645extern void ipa_read_summaries (void);
ddc90d88 646extern void ipa_read_optimization_summaries (void);
b23e5d49 647extern void register_one_dump_file (opt_pass *);
b5cebd44 648extern bool function_called_by_processed_nodes_p (void);
f1e2a033 649
c9036234 650/* Declare for plugins. */
3538ae0d 651extern void do_per_function_toporder (void (*) (function *, void *), void *);
c9036234 652
c3087ce0 653extern void disable_pass (const char *);
654extern void enable_pass (const char *);
ec4791a8 655extern void dump_passes (void);
c3087ce0 656
4ee9c684 657#endif /* GCC_TREE_PASS_H */