]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-pass.h
fix PR68343: disable fuse-*.c tests for isl 0.14 or earlier
[thirdparty/gcc.git] / gcc / tree-pass.h
CommitLineData
6de9cd9a 1/* Definitions for describing one tree-ssa optimization pass.
818ab71a 2 Copyright (C) 2004-2016 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
1a3d085c
TS
28struct function;
29
24b97832
ILT
30/* Optimization pass type. */
31enum opt_pass_type
32{
33 GIMPLE_PASS,
34 RTL_PASS,
35 SIMPLE_IPA_PASS,
36 IPA_PASS
37};
38
f7695dbf
DM
39/* Metadata for a pass, non-varying across all instances of a pass. */
40struct pass_data
6de9cd9a 41{
8ddbbcae 42 /* Optimization pass type. */
24b97832
ILT
43 enum opt_pass_type type;
44
8e352cd3
BS
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. */
6de9cd9a
DN
47 const char *name;
48
2b4e6bf1
SS
49 /* The -fopt-info optimization group flags as defined in dumpfile.h. */
50 unsigned int optinfo_flags;
51
6de9cd9a
DN
52 /* The timevar id associated with this pass. */
53 /* ??? Ideally would be dynamically assigned. */
7072a650 54 timevar_id_t tv_id;
6de9cd9a
DN
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;
8ddbbcae
JH
64};
65
f7695dbf
DM
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. */
6cd4d135 73class opt_pass : public pass_data
f7695dbf
DM
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 ();
b0c77505 86 virtual void set_pass_param (unsigned int, bool);
f7695dbf 87
0481253d
TS
88 /* This pass and all sub-passes are executed only if the function returns
89 true. The default implementation returns true. */
1a3d085c 90 virtual bool gate (function *fun);
f7695dbf 91
558d2559 92 /* This is the code to run. If this is not overridden, then there should
f7695dbf
DM
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. */
be55bfe6 96 virtual unsigned int execute (function *fun);
f7695dbf
DM
97
98protected:
c3284718 99 opt_pass (const pass_data&, gcc::context *);
f7695dbf
DM
100
101public:
102 /* A list of sub-passes to run, dependent on gate predicate. */
6a5ac314 103 opt_pass *sub;
f7695dbf
DM
104
105 /* Next in the list of passes to run, independent of gate predicate. */
6a5ac314 106 opt_pass *next;
f7695dbf
DM
107
108 /* Static pass number, used as a fragment of the dump file name. */
109 int static_pass_number;
110
9d5879a6
AH
111 /* When a given dump file is being initialized, this flag is set to
112 true if the corresponding TDF_graph dump file has also been
113 initialized. */
114 bool graph_dump_initialized;
115
f7695dbf 116protected:
65d3284b 117 gcc::context *m_ctxt;
f7695dbf
DM
118};
119
17653c00 120/* Description of GIMPLE pass. */
f7695dbf 121class gimple_opt_pass : public opt_pass
8ddbbcae 122{
f7695dbf 123protected:
c3284718
RS
124 gimple_opt_pass (const pass_data& data, gcc::context *ctxt)
125 : opt_pass (data, ctxt)
f7695dbf
DM
126 {
127 }
8ddbbcae 128};
9f8628ba 129
fa10beec 130/* Description of RTL pass. */
f7695dbf 131class rtl_opt_pass : public opt_pass
8ddbbcae 132{
f7695dbf 133protected:
c3284718
RS
134 rtl_opt_pass (const pass_data& data, gcc::context *ctxt)
135 : opt_pass (data, ctxt)
f7695dbf
DM
136 {
137 }
8ddbbcae
JH
138};
139
2c8326a5 140class varpool_node;
17653c00 141struct cgraph_node;
7b99cca4 142struct lto_symtab_encoder_d;
17653c00
JH
143
144/* Description of IPA pass with generate summary, write, execute, read and
145 transform stages. */
f7695dbf 146class ipa_opt_pass_d : public opt_pass
17653c00 147{
f7695dbf 148public:
1920df6c
KZ
149 /* IPA passes can analyze function body and variable initializers
150 using this hook and produce summary. */
151 void (*generate_summary) (void);
152
153 /* This hook is used to serialize IPA summaries on disk. */
f27c1867 154 void (*write_summary) (void);
17653c00 155
e792884f 156 /* This hook is used to deserialize IPA summaries from disk. */
1920df6c 157 void (*read_summary) (void);
e792884f
JH
158
159 /* This hook is used to serialize IPA optimization summaries on disk. */
f27c1867 160 void (*write_optimization_summary) (void);
e792884f
JH
161
162 /* This hook is used to deserialize IPA summaries from disk. */
163 void (*read_optimization_summary) (void);
164
2c5721d9
MJ
165 /* Hook to convert gimple stmt uids into true gimple statements. The second
166 parameter is an array of statements indexed by their uid. */
355fe088 167 void (*stmt_fixup) (struct cgraph_node *, gimple **);
2c5721d9 168
17653c00
JH
169 /* Results of interprocedural propagation of an IPA pass is applied to
170 function body via this hook. */
171 unsigned int function_transform_todo_flags_start;
172 unsigned int (*function_transform) (struct cgraph_node *);
2c8326a5 173 void (*variable_transform) (varpool_node *);
f7695dbf
DM
174
175protected:
c3284718
RS
176 ipa_opt_pass_d (const pass_data& data, gcc::context *ctxt,
177 void (*generate_summary) (void),
178 void (*write_summary) (void),
179 void (*read_summary) (void),
180 void (*write_optimization_summary) (void),
181 void (*read_optimization_summary) (void),
355fe088 182 void (*stmt_fixup) (struct cgraph_node *, gimple **),
c3284718
RS
183 unsigned int function_transform_todo_flags_start,
184 unsigned int (*function_transform) (struct cgraph_node *),
2c8326a5 185 void (*variable_transform) (varpool_node *))
c3284718
RS
186 : opt_pass (data, ctxt),
187 generate_summary (generate_summary),
188 write_summary (write_summary),
189 read_summary (read_summary),
190 write_optimization_summary (write_optimization_summary),
191 read_optimization_summary (read_optimization_summary),
192 stmt_fixup (stmt_fixup),
193 function_transform_todo_flags_start (function_transform_todo_flags_start),
194 function_transform (function_transform),
195 variable_transform (variable_transform)
f7695dbf
DM
196 {
197 }
17653c00
JH
198};
199
200/* Description of simple IPA pass. Simple IPA passes have just one execute
8ddbbcae 201 hook. */
f7695dbf 202class simple_ipa_opt_pass : public opt_pass
8ddbbcae 203{
f7695dbf 204protected:
c3284718
RS
205 simple_ipa_opt_pass (const pass_data& data, gcc::context *ctxt)
206 : opt_pass (data, ctxt)
f7695dbf
DM
207 {
208 }
9f8628ba
PB
209};
210
6de9cd9a
DN
211/* Pass properties. */
212#define PROP_gimple_any (1 << 0) /* entire gimple grammar */
213#define PROP_gimple_lcf (1 << 1) /* lowered control flow */
214#define PROP_gimple_leh (1 << 2) /* lowered eh */
215#define PROP_cfg (1 << 3)
7b0e48fb
DB
216#define PROP_ssa (1 << 5)
217#define PROP_no_crit_edges (1 << 6)
218#define PROP_rtl (1 << 7)
4effdf02
RG
219#define PROP_gimple_lomp (1 << 8) /* lowered OpenMP directives */
220#define PROP_cfglayout (1 << 9) /* cfglayout mode on RTL */
688a482d 221#define PROP_gimple_lcx (1 << 10) /* lowered complex */
7d776ee2 222#define PROP_loops (1 << 11) /* preserve loop structures */
6f37411d 223#define PROP_gimple_lvec (1 << 12) /* lowered vector */
18751894 224#define PROP_gimple_eomp (1 << 13) /* no OpenMP directives */
f8e89441 225#define PROP_gimple_lva (1 << 14) /* No va_arg internal function. */
53f3cd25
RS
226#define PROP_gimple_opt_math (1 << 15) /* Disable canonicalization
227 of math functions; the
228 current choices have
229 been optimized. */
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)
0bca51f0 236#define TODO_cleanup_cfg (1 << 5)
9ba5fb43 237#define TODO_verify_il (1 << 6)
8f940ee6 238#define TODO_dump_symtab (1 << 7)
f4b3ca72 239#define TODO_remove_functions (1 << 8)
45a80bb9 240#define TODO_rebuild_frequencies (1 << 9)
0bca51f0
DN
241
242/* To-do flags for calls to update_ssa. */
243
244/* Update the SSA form inserting PHI nodes for newly exposed symbols
245 and virtual names marked for updating. When updating real names,
246 only insert PHI nodes for a real name O_j in blocks reached by all
247 the new and old definitions for O_j. If the iterated dominance
248 frontier for O_j is not pruned, we may end up inserting PHI nodes
249 in blocks that have one or more edges with no incoming definition
250 for O_j. This would lead to uninitialized warnings for O_j's
251 symbol. */
a36b8a1e 252#define TODO_update_ssa (1 << 11)
0bca51f0
DN
253
254/* Update the SSA form without inserting any new PHI nodes at all.
255 This is used by passes that have either inserted all the PHI nodes
256 themselves or passes that need only to patch use-def and def-def
257 chains for virtuals (e.g., DCE). */
a36b8a1e 258#define TODO_update_ssa_no_phi (1 << 12)
0bca51f0 259
0fa2e4df 260/* Insert PHI nodes everywhere they are needed. No pruning of the
0bca51f0
DN
261 IDF is done. This is used by passes that need the PHI nodes for
262 O_j even if it means that some arguments will come from the default
b305e3da 263 definition of O_j's symbol.
b8698a0f 264
0bca51f0
DN
265 WARNING: If you need to use this flag, chances are that your pass
266 may be doing something wrong. Inserting PHI nodes for an old name
267 where not all edges carry a new replacement may lead to silent
268 codegen errors or spurious uninitialized warnings. */
a36b8a1e 269#define TODO_update_ssa_full_phi (1 << 13)
0bca51f0
DN
270
271/* Passes that update the SSA form on their own may want to delegate
272 the updating of virtual names to the generic updater. Since FUD
273 chains are easier to maintain, this simplifies the work they need
274 to do. NOTE: If this flag is used, any OLD->NEW mappings for real
275 names are explicitly destroyed and only the symbols marked for
276 renaming are processed. */
a36b8a1e 277#define TODO_update_ssa_only_virtuals (1 << 14)
0bca51f0 278
3f519b35 279/* Some passes leave unused local variables that can be removed from
cb91fab0
JH
280 cfun->local_decls. This reduces the size of dump files
281 and the memory footprint for VAR_DECLs. */
a36b8a1e 282#define TODO_remove_unused_locals (1 << 15)
3f519b35 283
6fb5fa3c
DB
284/* Call df_finish at the end of the pass. This is done after all of
285 the dumpers have been allowed to run so that they have access to
286 the instance before it is destroyed. */
a36b8a1e 287#define TODO_df_finish (1 << 17)
6fb5fa3c 288
0d475361 289/* Call df_verify at the end of the pass if checking is enabled. */
a36b8a1e 290#define TODO_df_verify (1 << 18)
0d475361 291
b02b9b53 292/* Internally used for the first instance of a pass. */
a36b8a1e 293#define TODO_mark_first_instance (1 << 19)
b02b9b53 294
7b0e48fb 295/* Rebuild aliasing info. */
5006671f
RG
296#define TODO_rebuild_alias (1 << 20)
297
298/* Rebuild the addressable-vars bitmap and do register promotion. */
299#define TODO_update_address_taken (1 << 21)
7b0e48fb 300
cf9712cc
JH
301/* Rebuild the callgraph edges. */
302#define TODO_rebuild_cgraph_edges (1 << 22)
303
be373510
ML
304/* Release function body and stop pass manager. */
305#define TODO_discard_function (1 << 23)
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 313
3bea341f 314#define TODO_verify_all TODO_verify_il
6de9cd9a 315
b80b0fd9
ST
316
317/* Register pass info. */
318
319enum pass_positioning_ops
320{
321 PASS_POS_INSERT_AFTER, /* Insert after the reference pass. */
322 PASS_POS_INSERT_BEFORE, /* Insert before the reference pass. */
323 PASS_POS_REPLACE /* Replace the reference pass. */
324};
325
326struct register_pass_info
327{
6a5ac314 328 opt_pass *pass; /* New pass to register. */
b80b0fd9
ST
329 const char *reference_pass_name; /* Name of the reference pass for hooking
330 up the new pass. */
331 int ref_pass_instance_number; /* Insert the pass at the specified
332 instance number of the reference pass.
333 Do it for every instance if it is 0. */
334 enum pass_positioning_ops pos_op; /* how to insert the new pass. */
335};
336
3fa3690d
OE
337/* Registers a new pass. Either fill out the register_pass_info or specify
338 the individual parameters. The pass object is expected to have been
339 allocated using operator new and the pass manager takes the ownership of
340 the pass object. */
341extern void register_pass (register_pass_info *);
342extern void register_pass (opt_pass* pass, pass_positioning_ops pos,
343 const char* ref_pass_name, int ref_pass_inst_number);
344
d5e254e1 345extern simple_ipa_opt_pass *make_pass_ipa_chkp_versioning (gcc::context *ctxt);
c11d86b4 346extern simple_ipa_opt_pass *make_pass_ipa_chkp_early_produce_thunks (gcc::context *ctxt);
d5e254e1
IE
347extern simple_ipa_opt_pass *make_pass_ipa_chkp_produce_thunks (gcc::context *ctxt);
348extern gimple_opt_pass *make_pass_chkp (gcc::context *ctxt);
349extern gimple_opt_pass *make_pass_chkp_opt (gcc::context *ctxt);
27a4cd48
DM
350extern gimple_opt_pass *make_pass_asan (gcc::context *ctxt);
351extern gimple_opt_pass *make_pass_asan_O0 (gcc::context *ctxt);
352extern gimple_opt_pass *make_pass_tsan (gcc::context *ctxt);
353extern gimple_opt_pass *make_pass_tsan_O0 (gcc::context *ctxt);
95e7bbb8
DV
354extern gimple_opt_pass *make_pass_sancov (gcc::context *ctxt);
355extern gimple_opt_pass *make_pass_sancov_O0 (gcc::context *ctxt);
27a4cd48
DM
356extern gimple_opt_pass *make_pass_lower_cf (gcc::context *ctxt);
357extern gimple_opt_pass *make_pass_refactor_eh (gcc::context *ctxt);
358extern gimple_opt_pass *make_pass_lower_eh (gcc::context *ctxt);
359extern gimple_opt_pass *make_pass_lower_eh_dispatch (gcc::context *ctxt);
360extern gimple_opt_pass *make_pass_lower_resx (gcc::context *ctxt);
361extern gimple_opt_pass *make_pass_build_cfg (gcc::context *ctxt);
362extern gimple_opt_pass *make_pass_early_tree_profile (gcc::context *ctxt);
363extern gimple_opt_pass *make_pass_cleanup_eh (gcc::context *ctxt);
364extern gimple_opt_pass *make_pass_sra (gcc::context *ctxt);
365extern gimple_opt_pass *make_pass_sra_early (gcc::context *ctxt);
366extern gimple_opt_pass *make_pass_early_ipa_sra (gcc::context *ctxt);
367extern gimple_opt_pass *make_pass_tail_recursion (gcc::context *ctxt);
368extern gimple_opt_pass *make_pass_tail_calls (gcc::context *ctxt);
7d39012c 369extern gimple_opt_pass *make_pass_fix_loops (gcc::context *ctxt);
27a4cd48 370extern gimple_opt_pass *make_pass_tree_loop (gcc::context *ctxt);
e5d8bd8c 371extern gimple_opt_pass *make_pass_tree_no_loop (gcc::context *ctxt);
27a4cd48
DM
372extern gimple_opt_pass *make_pass_tree_loop_init (gcc::context *ctxt);
373extern gimple_opt_pass *make_pass_lim (gcc::context *ctxt);
374extern gimple_opt_pass *make_pass_tree_unswitch (gcc::context *ctxt);
375extern gimple_opt_pass *make_pass_predcom (gcc::context *ctxt);
376extern gimple_opt_pass *make_pass_iv_canon (gcc::context *ctxt);
377extern gimple_opt_pass *make_pass_scev_cprop (gcc::context *ctxt);
378extern gimple_opt_pass *make_pass_empty_loop (gcc::context *ctxt);
379extern gimple_opt_pass *make_pass_record_bounds (gcc::context *ctxt);
380extern gimple_opt_pass *make_pass_graphite (gcc::context *ctxt);
381extern gimple_opt_pass *make_pass_graphite_transforms (gcc::context *ctxt);
382extern gimple_opt_pass *make_pass_if_conversion (gcc::context *ctxt);
383extern gimple_opt_pass *make_pass_loop_distribution (gcc::context *ctxt);
384extern gimple_opt_pass *make_pass_vectorize (gcc::context *ctxt);
8c8b9f32 385extern gimple_opt_pass *make_pass_simduid_cleanup (gcc::context *ctxt);
27a4cd48
DM
386extern gimple_opt_pass *make_pass_slp_vectorize (gcc::context *ctxt);
387extern gimple_opt_pass *make_pass_complete_unroll (gcc::context *ctxt);
388extern gimple_opt_pass *make_pass_complete_unrolli (gcc::context *ctxt);
389extern gimple_opt_pass *make_pass_parallelize_loops (gcc::context *ctxt);
390extern gimple_opt_pass *make_pass_loop_prefetch (gcc::context *ctxt);
391extern gimple_opt_pass *make_pass_iv_optimize (gcc::context *ctxt);
392extern gimple_opt_pass *make_pass_tree_loop_done (gcc::context *ctxt);
393extern gimple_opt_pass *make_pass_ch (gcc::context *ctxt);
4f9a2b4e 394extern gimple_opt_pass *make_pass_ch_vect (gcc::context *ctxt);
27a4cd48 395extern gimple_opt_pass *make_pass_ccp (gcc::context *ctxt);
8fe17e23 396extern gimple_opt_pass *make_pass_split_paths (gcc::context *ctxt);
27a4cd48
DM
397extern gimple_opt_pass *make_pass_phi_only_cprop (gcc::context *ctxt);
398extern gimple_opt_pass *make_pass_build_ssa (gcc::context *ctxt);
399extern gimple_opt_pass *make_pass_build_alias (gcc::context *ctxt);
400extern gimple_opt_pass *make_pass_build_ealias (gcc::context *ctxt);
401extern gimple_opt_pass *make_pass_dominator (gcc::context *ctxt);
402extern gimple_opt_pass *make_pass_dce (gcc::context *ctxt);
27a4cd48
DM
403extern gimple_opt_pass *make_pass_cd_dce (gcc::context *ctxt);
404extern gimple_opt_pass *make_pass_call_cdce (gcc::context *ctxt);
405extern gimple_opt_pass *make_pass_merge_phi (gcc::context *ctxt);
406extern gimple_opt_pass *make_pass_split_crit_edges (gcc::context *ctxt);
ca87c493 407extern gimple_opt_pass *make_pass_laddress (gcc::context *ctxt);
27a4cd48 408extern gimple_opt_pass *make_pass_pre (gcc::context *ctxt);
c9e93168 409extern unsigned int tail_merge_optimize (unsigned int);
27a4cd48
DM
410extern gimple_opt_pass *make_pass_profile (gcc::context *ctxt);
411extern gimple_opt_pass *make_pass_strip_predict_hints (gcc::context *ctxt);
412extern gimple_opt_pass *make_pass_lower_complex_O0 (gcc::context *ctxt);
413extern gimple_opt_pass *make_pass_lower_complex (gcc::context *ctxt);
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);
18751894 419extern gimple_opt_pass *make_pass_expand_omp_ssa (gcc::context *ctxt);
4a38b02b 420extern gimple_opt_pass *make_pass_omp_target_link (gcc::context *ctxt);
94829f87 421extern gimple_opt_pass *make_pass_oacc_device_lower (gcc::context *ctxt);
27a4cd48
DM
422extern gimple_opt_pass *make_pass_object_sizes (gcc::context *ctxt);
423extern gimple_opt_pass *make_pass_strlen (gcc::context *ctxt);
424extern gimple_opt_pass *make_pass_fold_builtins (gcc::context *ctxt);
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);
431extern gimple_opt_pass *make_pass_optimize_widening_mul (gcc::context *ctxt);
432extern gimple_opt_pass *make_pass_warn_function_return (gcc::context *ctxt);
433extern gimple_opt_pass *make_pass_warn_function_noreturn (gcc::context *ctxt);
434extern gimple_opt_pass *make_pass_cselim (gcc::context *ctxt);
435extern gimple_opt_pass *make_pass_phiopt (gcc::context *ctxt);
436extern gimple_opt_pass *make_pass_forwprop (gcc::context *ctxt);
437extern gimple_opt_pass *make_pass_phiprop (gcc::context *ctxt);
438extern gimple_opt_pass *make_pass_tree_ifcombine (gcc::context *ctxt);
439extern gimple_opt_pass *make_pass_dse (gcc::context *ctxt);
440extern gimple_opt_pass *make_pass_nrv (gcc::context *ctxt);
441extern gimple_opt_pass *make_pass_rename_ssa_copies (gcc::context *ctxt);
442extern gimple_opt_pass *make_pass_sink_code (gcc::context *ctxt);
443extern gimple_opt_pass *make_pass_fre (gcc::context *ctxt);
444extern gimple_opt_pass *make_pass_check_data_deps (gcc::context *ctxt);
445extern gimple_opt_pass *make_pass_copy_prop (gcc::context *ctxt);
8fdc414d 446extern gimple_opt_pass *make_pass_isolate_erroneous_paths (gcc::context *ctxt);
27a4cd48
DM
447extern gimple_opt_pass *make_pass_vrp (gcc::context *ctxt);
448extern gimple_opt_pass *make_pass_uncprop (gcc::context *ctxt);
449extern gimple_opt_pass *make_pass_return_slot (gcc::context *ctxt);
450extern gimple_opt_pass *make_pass_reassoc (gcc::context *ctxt);
451extern gimple_opt_pass *make_pass_rebuild_cgraph_edges (gcc::context *ctxt);
452extern gimple_opt_pass *make_pass_remove_cgraph_callee_edges (gcc::context
453 *ctxt);
454extern gimple_opt_pass *make_pass_build_cgraph_edges (gcc::context *ctxt);
455extern gimple_opt_pass *make_pass_local_pure_const (gcc::context *ctxt);
38147a2a 456extern gimple_opt_pass *make_pass_nothrow (gcc::context *ctxt);
27a4cd48
DM
457extern gimple_opt_pass *make_pass_tracer (gcc::context *ctxt);
458extern gimple_opt_pass *make_pass_warn_unused_result (gcc::context *ctxt);
459extern gimple_opt_pass *make_pass_diagnose_tm_blocks (gcc::context *ctxt);
460extern gimple_opt_pass *make_pass_lower_tm (gcc::context *ctxt);
461extern gimple_opt_pass *make_pass_tm_init (gcc::context *ctxt);
462extern gimple_opt_pass *make_pass_tm_mark (gcc::context *ctxt);
463extern gimple_opt_pass *make_pass_tm_memopt (gcc::context *ctxt);
464extern gimple_opt_pass *make_pass_tm_edges (gcc::context *ctxt);
465extern gimple_opt_pass *make_pass_split_functions (gcc::context *ctxt);
466extern gimple_opt_pass *make_pass_feedback_split_functions (gcc::context *ctxt);
467extern gimple_opt_pass *make_pass_strength_reduction (gcc::context *ctxt);
2077db1b 468extern gimple_opt_pass *make_pass_vtable_verify (gcc::context *ctxt);
b9a55b13
MP
469extern gimple_opt_pass *make_pass_ubsan (gcc::context *ctxt);
470extern gimple_opt_pass *make_pass_sanopt (gcc::context *ctxt);
896522ee 471extern gimple_opt_pass *make_pass_oacc_kernels (gcc::context *ctxt);
597a8ab9
TV
472extern simple_ipa_opt_pass *make_pass_ipa_oacc (gcc::context *ctxt);
473extern simple_ipa_opt_pass *make_pass_ipa_oacc_kernels (gcc::context *ctxt);
b2b40051 474extern gimple_opt_pass *make_pass_gen_hsail (gcc::context *ctxt);
6de9cd9a 475
012309e6 476/* IPA Passes */
27a4cd48
DM
477extern simple_ipa_opt_pass *make_pass_ipa_lower_emutls (gcc::context *ctxt);
478extern simple_ipa_opt_pass
479 *make_pass_ipa_function_and_variable_visibility (gcc::context *ctxt);
480extern simple_ipa_opt_pass *make_pass_ipa_tree_profile (gcc::context *ctxt);
be3c16c4 481extern simple_ipa_opt_pass *make_pass_ipa_auto_profile (gcc::context *ctxt);
27a4cd48 482
d5e254e1
IE
483extern simple_ipa_opt_pass *make_pass_build_ssa_passes (gcc::context *ctxt);
484extern simple_ipa_opt_pass *make_pass_chkp_instrumentation_passes (gcc::context *ctxt);
485extern simple_ipa_opt_pass *make_pass_local_optimization_passes (gcc::context *ctxt);
27a4cd48
DM
486
487extern ipa_opt_pass_d *make_pass_ipa_whole_program_visibility (gcc::context
488 *ctxt);
27a4cd48
DM
489extern simple_ipa_opt_pass *make_pass_ipa_increase_alignment (gcc::context
490 *ctxt);
491extern ipa_opt_pass_d *make_pass_ipa_inline (gcc::context *ctxt);
492extern simple_ipa_opt_pass *make_pass_ipa_free_lang_data (gcc::context *ctxt);
493extern simple_ipa_opt_pass *make_pass_ipa_free_inline_summary (gcc::context
494 *ctxt);
495extern ipa_opt_pass_d *make_pass_ipa_cp (gcc::context *ctxt);
b84d4347 496extern ipa_opt_pass_d *make_pass_ipa_icf (gcc::context *ctxt);
bbc9396b 497extern ipa_opt_pass_d *make_pass_ipa_devirt (gcc::context *ctxt);
27a4cd48 498extern ipa_opt_pass_d *make_pass_ipa_reference (gcc::context *ctxt);
b2b40051 499extern ipa_opt_pass_d *make_pass_ipa_hsa (gcc::context *ctxt);
27a4cd48
DM
500extern ipa_opt_pass_d *make_pass_ipa_pure_const (gcc::context *ctxt);
501extern simple_ipa_opt_pass *make_pass_ipa_pta (gcc::context *ctxt);
27a4cd48 502extern simple_ipa_opt_pass *make_pass_ipa_tm (gcc::context *ctxt);
3b1661a9
ES
503extern simple_ipa_opt_pass *make_pass_target_clone (gcc::context *ctxt);
504extern simple_ipa_opt_pass *make_pass_dispatcher_calls (gcc::context *ctxt);
0136f8f0 505extern simple_ipa_opt_pass *make_pass_omp_simd_clone (gcc::context *ctxt);
27a4cd48
DM
506extern ipa_opt_pass_d *make_pass_ipa_profile (gcc::context *ctxt);
507extern ipa_opt_pass_d *make_pass_ipa_cdtor_merge (gcc::context *ctxt);
eb6a09a7 508extern ipa_opt_pass_d *make_pass_ipa_single_use (gcc::context *ctxt);
a04d9035 509extern ipa_opt_pass_d *make_pass_ipa_comdats (gcc::context *ctxt);
27a4cd48
DM
510
511extern gimple_opt_pass *make_pass_cleanup_cfg_post_optimizing (gcc::context
512 *ctxt);
513extern gimple_opt_pass *make_pass_init_datastructures (gcc::context *ctxt);
514extern gimple_opt_pass *make_pass_fixup_cfg (gcc::context *ctxt);
6a75d560 515extern gimple_opt_pass *make_pass_backprop (gcc::context *ctxt);
27a4cd48
DM
516
517extern rtl_opt_pass *make_pass_expand (gcc::context *ctxt);
518extern rtl_opt_pass *make_pass_instantiate_virtual_regs (gcc::context *ctxt);
519extern rtl_opt_pass *make_pass_rtl_fwprop (gcc::context *ctxt);
520extern rtl_opt_pass *make_pass_rtl_fwprop_addr (gcc::context *ctxt);
521extern rtl_opt_pass *make_pass_jump (gcc::context *ctxt);
522extern rtl_opt_pass *make_pass_jump2 (gcc::context *ctxt);
523extern rtl_opt_pass *make_pass_lower_subreg (gcc::context *ctxt);
524extern rtl_opt_pass *make_pass_cse (gcc::context *ctxt);
525extern rtl_opt_pass *make_pass_fast_rtl_dce (gcc::context *ctxt);
526extern rtl_opt_pass *make_pass_ud_rtl_dce (gcc::context *ctxt);
527extern rtl_opt_pass *make_pass_rtl_dce (gcc::context *ctxt);
528extern rtl_opt_pass *make_pass_rtl_dse1 (gcc::context *ctxt);
529extern rtl_opt_pass *make_pass_rtl_dse2 (gcc::context *ctxt);
530extern rtl_opt_pass *make_pass_rtl_dse3 (gcc::context *ctxt);
531extern rtl_opt_pass *make_pass_rtl_cprop (gcc::context *ctxt);
532extern rtl_opt_pass *make_pass_rtl_pre (gcc::context *ctxt);
533extern rtl_opt_pass *make_pass_rtl_hoist (gcc::context *ctxt);
534extern rtl_opt_pass *make_pass_rtl_store_motion (gcc::context *ctxt);
535extern rtl_opt_pass *make_pass_cse_after_global_opts (gcc::context *ctxt);
536extern rtl_opt_pass *make_pass_rtl_ifcvt (gcc::context *ctxt);
537
538extern rtl_opt_pass *make_pass_into_cfg_layout_mode (gcc::context *ctxt);
539extern rtl_opt_pass *make_pass_outof_cfg_layout_mode (gcc::context *ctxt);
540
541extern rtl_opt_pass *make_pass_loop2 (gcc::context *ctxt);
542extern rtl_opt_pass *make_pass_rtl_loop_init (gcc::context *ctxt);
543extern rtl_opt_pass *make_pass_rtl_move_loop_invariants (gcc::context *ctxt);
f8934be7 544extern rtl_opt_pass *make_pass_rtl_unroll_loops (gcc::context *ctxt);
27a4cd48
DM
545extern rtl_opt_pass *make_pass_rtl_doloop (gcc::context *ctxt);
546extern rtl_opt_pass *make_pass_rtl_loop_done (gcc::context *ctxt);
547
548extern rtl_opt_pass *make_pass_web (gcc::context *ctxt);
549extern rtl_opt_pass *make_pass_cse2 (gcc::context *ctxt);
550extern rtl_opt_pass *make_pass_df_initialize_opt (gcc::context *ctxt);
551extern rtl_opt_pass *make_pass_df_initialize_no_opt (gcc::context *ctxt);
552extern rtl_opt_pass *make_pass_reginfo_init (gcc::context *ctxt);
553extern rtl_opt_pass *make_pass_inc_dec (gcc::context *ctxt);
554extern rtl_opt_pass *make_pass_stack_ptr_mod (gcc::context *ctxt);
555extern rtl_opt_pass *make_pass_initialize_regs (gcc::context *ctxt);
556extern rtl_opt_pass *make_pass_combine (gcc::context *ctxt);
557extern rtl_opt_pass *make_pass_if_after_combine (gcc::context *ctxt);
558extern rtl_opt_pass *make_pass_ree (gcc::context *ctxt);
559extern rtl_opt_pass *make_pass_partition_blocks (gcc::context *ctxt);
560extern rtl_opt_pass *make_pass_match_asm_constraints (gcc::context *ctxt);
27a4cd48
DM
561extern rtl_opt_pass *make_pass_split_all_insns (gcc::context *ctxt);
562extern rtl_opt_pass *make_pass_fast_rtl_byte_dce (gcc::context *ctxt);
563extern rtl_opt_pass *make_pass_lower_subreg2 (gcc::context *ctxt);
564extern rtl_opt_pass *make_pass_mode_switching (gcc::context *ctxt);
565extern rtl_opt_pass *make_pass_sms (gcc::context *ctxt);
566extern rtl_opt_pass *make_pass_sched (gcc::context *ctxt);
f20f2613 567extern rtl_opt_pass *make_pass_live_range_shrinkage (gcc::context *ctxt);
27a4cd48
DM
568extern rtl_opt_pass *make_pass_ira (gcc::context *ctxt);
569extern rtl_opt_pass *make_pass_reload (gcc::context *ctxt);
570extern rtl_opt_pass *make_pass_clean_state (gcc::context *ctxt);
571extern rtl_opt_pass *make_pass_branch_prob (gcc::context *ctxt);
572extern rtl_opt_pass *make_pass_value_profile_transformations (gcc::context
573 *ctxt);
574extern rtl_opt_pass *make_pass_postreload_cse (gcc::context *ctxt);
575extern rtl_opt_pass *make_pass_gcse2 (gcc::context *ctxt);
576extern rtl_opt_pass *make_pass_split_after_reload (gcc::context *ctxt);
577extern rtl_opt_pass *make_pass_branch_target_load_optimize1 (gcc::context
578 *ctxt);
579extern rtl_opt_pass *make_pass_thread_prologue_and_epilogue (gcc::context
580 *ctxt);
581extern rtl_opt_pass *make_pass_stack_adjustments (gcc::context *ctxt);
b16abbcb 582extern rtl_opt_pass *make_pass_sched_fusion (gcc::context *ctxt);
27a4cd48
DM
583extern rtl_opt_pass *make_pass_peephole2 (gcc::context *ctxt);
584extern rtl_opt_pass *make_pass_if_after_reload (gcc::context *ctxt);
585extern rtl_opt_pass *make_pass_regrename (gcc::context *ctxt);
586extern rtl_opt_pass *make_pass_cprop_hardreg (gcc::context *ctxt);
587extern rtl_opt_pass *make_pass_reorder_blocks (gcc::context *ctxt);
588extern rtl_opt_pass *make_pass_branch_target_load_optimize2 (gcc::context
589 *ctxt);
590extern rtl_opt_pass *make_pass_leaf_regs (gcc::context *ctxt);
591extern rtl_opt_pass *make_pass_split_before_sched2 (gcc::context *ctxt);
592extern rtl_opt_pass *make_pass_compare_elim_after_reload (gcc::context *ctxt);
593extern rtl_opt_pass *make_pass_sched2 (gcc::context *ctxt);
594extern rtl_opt_pass *make_pass_stack_regs (gcc::context *ctxt);
595extern rtl_opt_pass *make_pass_stack_regs_run (gcc::context *ctxt);
596extern rtl_opt_pass *make_pass_df_finish (gcc::context *ctxt);
597extern rtl_opt_pass *make_pass_compute_alignments (gcc::context *ctxt);
598extern rtl_opt_pass *make_pass_duplicate_computed_gotos (gcc::context *ctxt);
599extern rtl_opt_pass *make_pass_variable_tracking (gcc::context *ctxt);
600extern rtl_opt_pass *make_pass_free_cfg (gcc::context *ctxt);
601extern rtl_opt_pass *make_pass_machine_reorg (gcc::context *ctxt);
602extern rtl_opt_pass *make_pass_cleanup_barriers (gcc::context *ctxt);
603extern rtl_opt_pass *make_pass_delay_slots (gcc::context *ctxt);
604extern rtl_opt_pass *make_pass_split_for_shorten_branches (gcc::context *ctxt);
605extern rtl_opt_pass *make_pass_split_before_regstack (gcc::context *ctxt);
606extern rtl_opt_pass *make_pass_convert_to_eh_region_ranges (gcc::context *ctxt);
607extern rtl_opt_pass *make_pass_shorten_branches (gcc::context *ctxt);
608extern rtl_opt_pass *make_pass_set_nothrow_function_flags (gcc::context *ctxt);
609extern rtl_opt_pass *make_pass_dwarf2_frame (gcc::context *ctxt);
610extern rtl_opt_pass *make_pass_final (gcc::context *ctxt);
611extern rtl_opt_pass *make_pass_rtl_seqabstr (gcc::context *ctxt);
612extern gimple_opt_pass *make_pass_release_ssa_names (gcc::context *ctxt);
613extern gimple_opt_pass *make_pass_early_inline (gcc::context *ctxt);
614extern gimple_opt_pass *make_pass_inline_parameters (gcc::context *ctxt);
615extern gimple_opt_pass *make_pass_update_address_taken (gcc::context *ctxt);
616extern gimple_opt_pass *make_pass_convert_switch (gcc::context *ctxt);
f8e89441 617extern gimple_opt_pass *make_pass_lower_vaarg (gcc::context *ctxt);
ef330312 618
9fe0cb7d 619/* Current optimization pass. */
6a5ac314 620extern opt_pass *current_pass;
9fe0cb7d 621
6a5ac314 622extern bool execute_one_pass (opt_pass *);
2cbf2d95 623extern void execute_pass_list (function *, opt_pass *);
6a5ac314
OE
624extern void execute_ipa_pass_list (opt_pass *);
625extern void execute_ipa_summary_passes (ipa_opt_pass_d *);
d7f09764 626extern void execute_all_ipa_transforms (void);
355fe088 627extern void execute_all_ipa_stmt_fixups (struct cgraph_node *, gimple **);
6a5ac314
OE
628extern bool pass_init_dump_file (opt_pass *);
629extern void pass_fini_dump_file (opt_pass *);
d7f09764 630
6fb5fa3c
DB
631extern void print_current_pass (FILE *);
632extern void debug_pass (void);
837bac8c 633extern void ipa_write_summaries (void);
7b99cca4 634extern void ipa_write_optimization_summaries (struct lto_symtab_encoder_d *);
d7f09764 635extern void ipa_read_summaries (void);
e792884f 636extern void ipa_read_optimization_summaries (void);
6a5ac314 637extern void register_one_dump_file (opt_pass *);
33977f81 638extern bool function_called_by_processed_nodes_p (void);
b4861090 639
090fa0ab 640/* Declare for plugins. */
2cbf2d95 641extern void do_per_function_toporder (void (*) (function *, void *), void *);
090fa0ab 642
226c52aa
XDL
643extern void disable_pass (const char *);
644extern void enable_pass (const char *);
deced1e2 645extern void dump_passes (void);
226c52aa 646
6de9cd9a 647#endif /* GCC_TREE_PASS_H */