Branch data Line data Source code
1 : : /* Definitions for describing one tree-ssa optimization pass.
2 : : Copyright (C) 2004-2024 Free Software Foundation, Inc.
3 : : Contributed by Richard Henderson <rth@redhat.com>
4 : :
5 : : This file is part of GCC.
6 : :
7 : : GCC is free software; you can redistribute it and/or modify
8 : : it under the terms of the GNU General Public License as published by
9 : : the Free Software Foundation; either version 3, or (at your option)
10 : : any later version.
11 : :
12 : : GCC is distributed in the hope that it will be useful,
13 : : but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 : : GNU General Public License for more details.
16 : :
17 : : You should have received a copy of the GNU General Public License
18 : : along with GCC; see the file COPYING3. If not see
19 : : <http://www.gnu.org/licenses/>. */
20 : :
21 : :
22 : : #ifndef GCC_TREE_PASS_H
23 : : #define GCC_TREE_PASS_H 1
24 : :
25 : : #include "timevar.h"
26 : : #include "dumpfile.h"
27 : :
28 : : struct function;
29 : :
30 : : /* Optimization pass type. */
31 : : enum opt_pass_type
32 : : {
33 : : GIMPLE_PASS,
34 : : RTL_PASS,
35 : : SIMPLE_IPA_PASS,
36 : : IPA_PASS
37 : : };
38 : :
39 : : /* Metadata for a pass, non-varying across all instances of a pass. */
40 : : struct pass_data
41 : : {
42 : : /* Optimization pass type. */
43 : : enum opt_pass_type type;
44 : :
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. */
47 : : const char *name;
48 : :
49 : : /* The -fopt-info optimization group flags as defined in dumpfile.h. */
50 : : optgroup_flags_t optinfo_flags;
51 : :
52 : : /* The timevar id associated with this pass. */
53 : : /* ??? Ideally would be dynamically assigned. */
54 : : timevar_id_t tv_id;
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;
64 : : };
65 : :
66 : : namespace 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. */
73 : : class opt_pass : public pass_data
74 : : {
75 : : public:
76 : 757424 : 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 ();
86 : : virtual void set_pass_param (unsigned int, bool);
87 : :
88 : : /* This pass and all sub-passes are executed only if the function returns
89 : : true. The default implementation returns true. */
90 : : virtual bool gate (function *fun);
91 : :
92 : : /* This is the code to run. If this is not overridden, then there should
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. */
96 : : virtual unsigned int execute (function *fun);
97 : :
98 : : protected:
99 : : opt_pass (const pass_data&, gcc::context *);
100 : :
101 : : public:
102 : : /* A list of sub-passes to run, dependent on gate predicate. */
103 : : opt_pass *sub;
104 : :
105 : : /* Next in the list of passes to run, independent of gate predicate. */
106 : : opt_pass *next;
107 : :
108 : : /* Static pass number, used as a fragment of the dump file name. */
109 : : int static_pass_number;
110 : :
111 : : protected:
112 : : gcc::context *m_ctxt;
113 : : };
114 : :
115 : : /* Description of GIMPLE pass. */
116 : 757398 : class gimple_opt_pass : public opt_pass
117 : : {
118 : : protected:
119 : 69468316 : gimple_opt_pass (const pass_data& data, gcc::context *ctxt)
120 : 69468316 : : opt_pass (data, ctxt)
121 : : {
122 : : }
123 : : };
124 : :
125 : : /* Description of RTL pass. */
126 : : class rtl_opt_pass : public opt_pass
127 : : {
128 : : protected:
129 : 28571632 : rtl_opt_pass (const pass_data& data, gcc::context *ctxt)
130 : 28571632 : : opt_pass (data, ctxt)
131 : : {
132 : : }
133 : : };
134 : :
135 : : struct varpool_node;
136 : : struct cgraph_node;
137 : : struct lto_symtab_encoder_d;
138 : :
139 : : /* Description of IPA pass with generate summary, write, execute, read and
140 : : transform stages. */
141 : : class ipa_opt_pass_d : public opt_pass
142 : : {
143 : : public:
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. */
149 : : void (*write_summary) (void);
150 : :
151 : : /* This hook is used to deserialize IPA summaries from disk. */
152 : : void (*read_summary) (void);
153 : :
154 : : /* This hook is used to serialize IPA optimization summaries on disk. */
155 : : void (*write_optimization_summary) (void);
156 : :
157 : : /* This hook is used to deserialize IPA summaries from disk. */
158 : : void (*read_optimization_summary) (void);
159 : :
160 : : /* Hook to convert gimple stmt uids into true gimple statements. The second
161 : : parameter is an array of statements indexed by their uid. */
162 : : void (*stmt_fixup) (struct cgraph_node *, gimple **);
163 : :
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 *);
168 : : void (*variable_transform) (varpool_node *);
169 : :
170 : : protected:
171 : 4481824 : 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),
177 : : void (*stmt_fixup) (struct cgraph_node *, gimple **),
178 : : unsigned int function_transform_todo_flags_start,
179 : : unsigned int (*function_transform) (struct cgraph_node *),
180 : : void (*variable_transform) (varpool_node *))
181 : 4481824 : : opt_pass (data, ctxt),
182 : 4481824 : generate_summary (generate_summary),
183 : 4481824 : write_summary (write_summary),
184 : 4481824 : read_summary (read_summary),
185 : 4481824 : write_optimization_summary (write_optimization_summary),
186 : 4481824 : read_optimization_summary (read_optimization_summary),
187 : 4481824 : stmt_fixup (stmt_fixup),
188 : 4481824 : function_transform_todo_flags_start (function_transform_todo_flags_start),
189 : 4481824 : function_transform (function_transform),
190 : 4481824 : variable_transform (variable_transform)
191 : : {
192 : : }
193 : : };
194 : :
195 : : /* Description of simple IPA pass. Simple IPA passes have just one execute
196 : : hook. */
197 : : class simple_ipa_opt_pass : public opt_pass
198 : : {
199 : : protected:
200 : 5602280 : simple_ipa_opt_pass (const pass_data& data, gcc::context *ctxt)
201 : 5602280 : : opt_pass (data, ctxt)
202 : : {
203 : : }
204 : : };
205 : :
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)
211 : : #define PROP_objsz (1 << 4) /* object sizes computed */
212 : : #define PROP_ssa (1 << 5)
213 : : #define PROP_no_crit_edges (1 << 6)
214 : : #define PROP_rtl (1 << 7)
215 : : #define PROP_gimple_lomp (1 << 8) /* lowered OpenMP directives */
216 : : #define PROP_cfglayout (1 << 9) /* cfglayout mode on RTL */
217 : : #define PROP_gimple_lcx (1 << 10) /* lowered complex */
218 : : #define PROP_loops (1 << 11) /* preserve loop structures */
219 : : #define PROP_gimple_lvec (1 << 12) /* lowered vector */
220 : : #define PROP_gimple_eomp (1 << 13) /* no OpenMP directives */
221 : : #define PROP_gimple_lva (1 << 14) /* No va_arg internal function. */
222 : : #define PROP_gimple_opt_math (1 << 15) /* Disable canonicalization
223 : : of math functions; the
224 : : current choices have
225 : : been optimized. */
226 : : #define PROP_gimple_lomp_dev (1 << 16) /* done omp_device_lower */
227 : : #define PROP_rtl_split_insns (1 << 17) /* RTL has insns split. */
228 : : #define PROP_loop_opts_done (1 << 18) /* SSA loop optimizations
229 : : have completed. */
230 : : #define PROP_assumptions_done (1 << 19) /* Assume function kept
231 : : around. */
232 : : #define PROP_gimple_lbitint (1 << 20) /* lowered large _BitInt */
233 : :
234 : : #define PROP_gimple \
235 : : (PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh | PROP_gimple_lomp)
236 : :
237 : : /* To-do flags. */
238 : : #define TODO_do_not_ggc_collect (1 << 1)
239 : : #define TODO_cleanup_cfg (1 << 5)
240 : : #define TODO_verify_il (1 << 6)
241 : : #define TODO_dump_symtab (1 << 7)
242 : : #define TODO_remove_functions (1 << 8)
243 : :
244 : : /* To-do flags for calls to update_ssa. */
245 : :
246 : : /* Update the SSA form inserting PHI nodes for newly exposed symbols
247 : : and virtual names marked for updating. When updating real names,
248 : : only insert PHI nodes for a real name O_j in blocks reached by all
249 : : the new and old definitions for O_j. If the iterated dominance
250 : : frontier for O_j is not pruned, we may end up inserting PHI nodes
251 : : in blocks that have one or more edges with no incoming definition
252 : : for O_j. This would lead to uninitialized warnings for O_j's
253 : : symbol. */
254 : : #define TODO_update_ssa (1 << 11)
255 : :
256 : : /* Update the SSA form without inserting any new PHI nodes at all.
257 : : This is used by passes that have either inserted all the PHI nodes
258 : : themselves or passes that need only to patch use-def and def-def
259 : : chains for virtuals (e.g., DCE). */
260 : : #define TODO_update_ssa_no_phi (1 << 12)
261 : :
262 : : /* Insert PHI nodes everywhere they are needed. No pruning of the
263 : : IDF is done. This is used by passes that need the PHI nodes for
264 : : O_j even if it means that some arguments will come from the default
265 : : definition of O_j's symbol.
266 : :
267 : : WARNING: If you need to use this flag, chances are that your pass
268 : : may be doing something wrong. Inserting PHI nodes for an old name
269 : : where not all edges carry a new replacement may lead to silent
270 : : codegen errors or spurious uninitialized warnings. */
271 : : #define TODO_update_ssa_full_phi (1 << 13)
272 : :
273 : : /* Passes that update the SSA form on their own may want to delegate
274 : : the updating of virtual names to the generic updater. Since FUD
275 : : chains are easier to maintain, this simplifies the work they need
276 : : to do. NOTE: If this flag is used, any OLD->NEW mappings for real
277 : : names are explicitly destroyed and only the symbols marked for
278 : : renaming are processed. */
279 : : #define TODO_update_ssa_only_virtuals (1 << 14)
280 : :
281 : : /* Some passes leave unused local variables that can be removed from
282 : : cfun->local_decls. This reduces the size of dump files
283 : : and the memory footprint for VAR_DECLs. */
284 : : #define TODO_remove_unused_locals (1 << 15)
285 : :
286 : : /* Call df_finish at the end of the pass. This is done after all of
287 : : the dumpers have been allowed to run so that they have access to
288 : : the instance before it is destroyed. */
289 : : #define TODO_df_finish (1 << 17)
290 : :
291 : : /* Call df_verify at the end of the pass if checking is enabled. */
292 : : #define TODO_df_verify (1 << 18)
293 : :
294 : : /* Internally used for the first instance of a pass. */
295 : : #define TODO_mark_first_instance (1 << 19)
296 : :
297 : : /* Rebuild aliasing info. */
298 : : #define TODO_rebuild_alias (1 << 20)
299 : :
300 : : /* Rebuild the addressable-vars bitmap and do register promotion. */
301 : : #define TODO_update_address_taken (1 << 21)
302 : :
303 : : /* Rebuild the callgraph edges. */
304 : : #define TODO_rebuild_cgraph_edges (1 << 22)
305 : :
306 : : /* Release function body (unless assumption function)
307 : : and stop pass manager. */
308 : : #define TODO_discard_function (1 << 23)
309 : :
310 : : /* Internally used in execute_function_todo(). */
311 : : #define TODO_update_ssa_any \
312 : : (TODO_update_ssa \
313 : : | TODO_update_ssa_no_phi \
314 : : | TODO_update_ssa_full_phi \
315 : : | TODO_update_ssa_only_virtuals)
316 : :
317 : : #define TODO_verify_all TODO_verify_il
318 : :
319 : : /* To-do flags for pending_TODOs. */
320 : :
321 : : /* Tell the next scalar cleanup pass that there is
322 : : work for it to do. */
323 : : #define PENDING_TODO_force_next_scalar_cleanup (1 << 1)
324 : :
325 : : /* Register pass info. */
326 : :
327 : : enum pass_positioning_ops
328 : : {
329 : : PASS_POS_INSERT_AFTER, /* Insert after the reference pass. */
330 : : PASS_POS_INSERT_BEFORE, /* Insert before the reference pass. */
331 : : PASS_POS_REPLACE /* Replace the reference pass. */
332 : : };
333 : :
334 : : struct register_pass_info
335 : : {
336 : : opt_pass *pass; /* New pass to register. */
337 : : const char *reference_pass_name; /* Name of the reference pass for hooking
338 : : up the new pass. */
339 : : int ref_pass_instance_number; /* Insert the pass at the specified
340 : : instance number of the reference pass.
341 : : Do it for every instance if it is 0. */
342 : : enum pass_positioning_ops pos_op; /* how to insert the new pass. */
343 : : };
344 : :
345 : : /* Registers a new pass. Either fill out the register_pass_info or specify
346 : : the individual parameters. The pass object is expected to have been
347 : : allocated using operator new and the pass manager takes the ownership of
348 : : the pass object. */
349 : : extern void register_pass (register_pass_info *);
350 : : extern void register_pass (opt_pass* pass, pass_positioning_ops pos,
351 : : const char* ref_pass_name, int ref_pass_inst_number);
352 : :
353 : : extern gimple_opt_pass *make_pass_asan (gcc::context *ctxt);
354 : : extern gimple_opt_pass *make_pass_asan_O0 (gcc::context *ctxt);
355 : : extern gimple_opt_pass *make_pass_tsan (gcc::context *ctxt);
356 : : extern gimple_opt_pass *make_pass_tsan_O0 (gcc::context *ctxt);
357 : : extern gimple_opt_pass *make_pass_sancov (gcc::context *ctxt);
358 : : extern gimple_opt_pass *make_pass_sancov_O0 (gcc::context *ctxt);
359 : : extern gimple_opt_pass *make_pass_lower_cf (gcc::context *ctxt);
360 : : extern gimple_opt_pass *make_pass_refactor_eh (gcc::context *ctxt);
361 : : extern gimple_opt_pass *make_pass_lower_eh (gcc::context *ctxt);
362 : : extern gimple_opt_pass *make_pass_lower_eh_dispatch (gcc::context *ctxt);
363 : : extern gimple_opt_pass *make_pass_lower_resx (gcc::context *ctxt);
364 : : extern gimple_opt_pass *make_pass_build_cfg (gcc::context *ctxt);
365 : : extern gimple_opt_pass *make_pass_early_tree_profile (gcc::context *ctxt);
366 : : extern gimple_opt_pass *make_pass_cleanup_eh (gcc::context *ctxt);
367 : : extern gimple_opt_pass *make_pass_sra (gcc::context *ctxt);
368 : : extern gimple_opt_pass *make_pass_sra_early (gcc::context *ctxt);
369 : : extern gimple_opt_pass *make_pass_tail_recursion (gcc::context *ctxt);
370 : : extern gimple_opt_pass *make_pass_tail_calls (gcc::context *ctxt);
371 : : extern gimple_opt_pass *make_pass_musttail (gcc::context *ctxt);
372 : : extern gimple_opt_pass *make_pass_fix_loops (gcc::context *ctxt);
373 : : extern gimple_opt_pass *make_pass_tree_loop (gcc::context *ctxt);
374 : : extern gimple_opt_pass *make_pass_tree_no_loop (gcc::context *ctxt);
375 : : extern gimple_opt_pass *make_pass_tree_loop_init (gcc::context *ctxt);
376 : : extern gimple_opt_pass *make_pass_loop_versioning (gcc::context *ctxt);
377 : : extern gimple_opt_pass *make_pass_lim (gcc::context *ctxt);
378 : : extern gimple_opt_pass *make_pass_linterchange (gcc::context *ctxt);
379 : : extern gimple_opt_pass *make_pass_tree_unswitch (gcc::context *ctxt);
380 : : extern gimple_opt_pass *make_pass_loop_split (gcc::context *ctxt);
381 : : extern gimple_opt_pass *make_pass_loop_jam (gcc::context *ctxt);
382 : : extern gimple_opt_pass *make_pass_predcom (gcc::context *ctxt);
383 : : extern gimple_opt_pass *make_pass_iv_canon (gcc::context *ctxt);
384 : : extern gimple_opt_pass *make_pass_scev_cprop (gcc::context *ctxt);
385 : : extern gimple_opt_pass *make_pass_empty_loop (gcc::context *ctxt);
386 : : extern gimple_opt_pass *make_pass_graphite (gcc::context *ctxt);
387 : : extern gimple_opt_pass *make_pass_graphite_transforms (gcc::context *ctxt);
388 : : extern gimple_opt_pass *make_pass_if_conversion (gcc::context *ctxt);
389 : : extern gimple_opt_pass *make_pass_if_to_switch (gcc::context *ctxt);
390 : : extern gimple_opt_pass *make_pass_loop_distribution (gcc::context *ctxt);
391 : : extern gimple_opt_pass *make_pass_crc_optimization (gcc::context *ctxt);
392 : : extern gimple_opt_pass *make_pass_vectorize (gcc::context *ctxt);
393 : : extern gimple_opt_pass *make_pass_simduid_cleanup (gcc::context *ctxt);
394 : : extern gimple_opt_pass *make_pass_slp_vectorize (gcc::context *ctxt);
395 : : extern gimple_opt_pass *make_pass_complete_unroll (gcc::context *ctxt);
396 : : extern gimple_opt_pass *make_pass_complete_unrolli (gcc::context *ctxt);
397 : : extern gimple_opt_pass *make_pass_pre_slp_scalar_cleanup (gcc::context *ctxt);
398 : : extern gimple_opt_pass *make_pass_parallelize_loops (gcc::context *ctxt);
399 : : extern gimple_opt_pass *make_pass_loop_prefetch (gcc::context *ctxt);
400 : : extern gimple_opt_pass *make_pass_iv_optimize (gcc::context *ctxt);
401 : : extern gimple_opt_pass *make_pass_tree_loop_done (gcc::context *ctxt);
402 : : extern gimple_opt_pass *make_pass_ch (gcc::context *ctxt);
403 : : extern gimple_opt_pass *make_pass_ch_vect (gcc::context *ctxt);
404 : : extern gimple_opt_pass *make_pass_sccopy (gcc::context *ctxt);
405 : : extern gimple_opt_pass *make_pass_ccp (gcc::context *ctxt);
406 : : extern gimple_opt_pass *make_pass_split_paths (gcc::context *ctxt);
407 : : extern gimple_opt_pass *make_pass_build_ssa (gcc::context *ctxt);
408 : : extern gimple_opt_pass *make_pass_build_alias (gcc::context *ctxt);
409 : : extern gimple_opt_pass *make_pass_build_ealias (gcc::context *ctxt);
410 : : extern gimple_opt_pass *make_pass_dominator (gcc::context *ctxt);
411 : : extern gimple_opt_pass *make_pass_dce (gcc::context *ctxt);
412 : : extern gimple_opt_pass *make_pass_cd_dce (gcc::context *ctxt);
413 : : extern gimple_opt_pass *make_pass_call_cdce (gcc::context *ctxt);
414 : : extern gimple_opt_pass *make_pass_merge_phi (gcc::context *ctxt);
415 : : extern gimple_opt_pass *make_pass_thread_jumps (gcc::context *ctxt);
416 : : extern gimple_opt_pass *make_pass_thread_jumps_full (gcc::context *ctxt);
417 : : extern gimple_opt_pass *make_pass_early_thread_jumps (gcc::context *ctxt);
418 : : extern gimple_opt_pass *make_pass_split_crit_edges (gcc::context *ctxt);
419 : : extern gimple_opt_pass *make_pass_laddress (gcc::context *ctxt);
420 : : extern gimple_opt_pass *make_pass_pre (gcc::context *ctxt);
421 : : extern unsigned int tail_merge_optimize (bool);
422 : : extern gimple_opt_pass *make_pass_profile (gcc::context *ctxt);
423 : : extern gimple_opt_pass *make_pass_strip_predict_hints (gcc::context *ctxt);
424 : : extern gimple_opt_pass *make_pass_rebuild_frequencies (gcc::context *ctxt);
425 : : extern gimple_opt_pass *make_pass_lower_complex_O0 (gcc::context *ctxt);
426 : : extern gimple_opt_pass *make_pass_lower_complex (gcc::context *ctxt);
427 : : extern gimple_opt_pass *make_pass_lower_bitint_O0 (gcc::context *ctxt);
428 : : extern gimple_opt_pass *make_pass_lower_bitint (gcc::context *ctxt);
429 : : extern gimple_opt_pass *make_pass_lower_switch (gcc::context *ctxt);
430 : : extern gimple_opt_pass *make_pass_lower_switch_O0 (gcc::context *ctxt);
431 : : extern gimple_opt_pass *make_pass_lower_vector (gcc::context *ctxt);
432 : : extern gimple_opt_pass *make_pass_lower_vector_ssa (gcc::context *ctxt);
433 : : extern gimple_opt_pass *make_pass_omp_oacc_kernels_decompose (gcc::context *ctxt);
434 : : extern gimple_opt_pass *make_pass_lower_omp (gcc::context *ctxt);
435 : : extern gimple_opt_pass *make_pass_diagnose_omp_blocks (gcc::context *ctxt);
436 : : extern gimple_opt_pass *make_pass_expand_omp (gcc::context *ctxt);
437 : : extern gimple_opt_pass *make_pass_expand_omp_ssa (gcc::context *ctxt);
438 : : extern gimple_opt_pass *make_pass_omp_target_link (gcc::context *ctxt);
439 : : extern gimple_opt_pass *make_pass_oacc_loop_designation (gcc::context *ctxt);
440 : : extern gimple_opt_pass *make_pass_omp_oacc_neuter_broadcast (gcc::context *ctxt);
441 : : extern gimple_opt_pass *make_pass_oacc_device_lower (gcc::context *ctxt);
442 : : extern gimple_opt_pass *make_pass_omp_device_lower (gcc::context *ctxt);
443 : : extern gimple_opt_pass *make_pass_object_sizes (gcc::context *ctxt);
444 : : extern gimple_opt_pass *make_pass_early_object_sizes (gcc::context *ctxt);
445 : : extern gimple_opt_pass *make_pass_warn_access (gcc::context *ctxt);
446 : : extern gimple_opt_pass *make_pass_warn_printf (gcc::context *ctxt);
447 : : extern gimple_opt_pass *make_pass_warn_recursion (gcc::context *ctxt);
448 : : extern gimple_opt_pass *make_pass_strlen (gcc::context *ctxt);
449 : : extern gimple_opt_pass *make_pass_fold_builtins (gcc::context *ctxt);
450 : : extern gimple_opt_pass *make_pass_post_ipa_warn (gcc::context *ctxt);
451 : : extern gimple_opt_pass *make_pass_stdarg (gcc::context *ctxt);
452 : : extern gimple_opt_pass *make_pass_early_warn_uninitialized (gcc::context *ctxt);
453 : : extern gimple_opt_pass *make_pass_late_warn_uninitialized (gcc::context *ctxt);
454 : : extern gimple_opt_pass *make_pass_cse_reciprocals (gcc::context *ctxt);
455 : : extern gimple_opt_pass *make_pass_cse_sincos (gcc::context *ctxt);
456 : : extern gimple_opt_pass *make_pass_expand_pow (gcc::context *ctxt);
457 : : extern gimple_opt_pass *make_pass_optimize_bswap (gcc::context *ctxt);
458 : : extern gimple_opt_pass *make_pass_store_merging (gcc::context *ctxt);
459 : : extern gimple_opt_pass *make_pass_optimize_widening_mul (gcc::context *ctxt);
460 : : extern gimple_opt_pass *make_pass_warn_function_return (gcc::context *ctxt);
461 : : extern gimple_opt_pass *make_pass_warn_function_noreturn (gcc::context *ctxt);
462 : : extern gimple_opt_pass *make_pass_cselim (gcc::context *ctxt);
463 : : extern gimple_opt_pass *make_pass_phiopt (gcc::context *ctxt);
464 : : extern gimple_opt_pass *make_pass_forwprop (gcc::context *ctxt);
465 : : extern gimple_opt_pass *make_pass_phiprop (gcc::context *ctxt);
466 : : extern gimple_opt_pass *make_pass_tree_ifcombine (gcc::context *ctxt);
467 : : extern gimple_opt_pass *make_pass_dse (gcc::context *ctxt);
468 : : extern gimple_opt_pass *make_pass_nrv (gcc::context *ctxt);
469 : : extern gimple_opt_pass *make_pass_rename_ssa_copies (gcc::context *ctxt);
470 : : extern gimple_opt_pass *make_pass_sink_code (gcc::context *ctxt);
471 : : extern gimple_opt_pass *make_pass_fre (gcc::context *ctxt);
472 : : extern gimple_opt_pass *make_pass_check_data_deps (gcc::context *ctxt);
473 : : extern gimple_opt_pass *make_pass_copy_prop (gcc::context *ctxt);
474 : : extern gimple_opt_pass *make_pass_isolate_erroneous_paths (gcc::context *ctxt);
475 : : extern gimple_opt_pass *make_pass_array_bounds (gcc::context *ctxt);
476 : : extern gimple_opt_pass *make_pass_early_vrp (gcc::context *ctxt);
477 : : extern gimple_opt_pass *make_pass_fast_vrp (gcc::context *ctxt);
478 : : extern gimple_opt_pass *make_pass_vrp (gcc::context *ctxt);
479 : : extern gimple_opt_pass *make_pass_assumptions (gcc::context *ctxt);
480 : : extern gimple_opt_pass *make_pass_uncprop (gcc::context *ctxt);
481 : : extern gimple_opt_pass *make_pass_return_slot (gcc::context *ctxt);
482 : : extern gimple_opt_pass *make_pass_reassoc (gcc::context *ctxt);
483 : : extern gimple_opt_pass *make_pass_rebuild_cgraph_edges (gcc::context *ctxt);
484 : : extern gimple_opt_pass *make_pass_remove_cgraph_callee_edges (gcc::context
485 : : *ctxt);
486 : : extern gimple_opt_pass *make_pass_build_cgraph_edges (gcc::context *ctxt);
487 : : extern gimple_opt_pass *make_pass_local_pure_const (gcc::context *ctxt);
488 : : extern gimple_opt_pass *make_pass_nothrow (gcc::context *ctxt);
489 : : extern gimple_opt_pass *make_pass_tracer (gcc::context *ctxt);
490 : : extern gimple_opt_pass *make_pass_warn_restrict (gcc::context *ctxt);
491 : : extern gimple_opt_pass *make_pass_warn_unused_result (gcc::context *ctxt);
492 : : extern gimple_opt_pass *make_pass_diagnose_tm_blocks (gcc::context *ctxt);
493 : : extern gimple_opt_pass *make_pass_lower_tm (gcc::context *ctxt);
494 : : extern gimple_opt_pass *make_pass_tm_init (gcc::context *ctxt);
495 : : extern gimple_opt_pass *make_pass_tm_mark (gcc::context *ctxt);
496 : : extern gimple_opt_pass *make_pass_tm_memopt (gcc::context *ctxt);
497 : : extern gimple_opt_pass *make_pass_tm_edges (gcc::context *ctxt);
498 : : extern gimple_opt_pass *make_pass_split_functions (gcc::context *ctxt);
499 : : extern gimple_opt_pass *make_pass_feedback_split_functions (gcc::context *ctxt);
500 : : extern gimple_opt_pass *make_pass_strength_reduction (gcc::context *ctxt);
501 : : extern gimple_opt_pass *make_pass_vtable_verify (gcc::context *ctxt);
502 : : extern gimple_opt_pass *make_pass_ubsan (gcc::context *ctxt);
503 : : extern gimple_opt_pass *make_pass_sanopt (gcc::context *ctxt);
504 : : extern gimple_opt_pass *make_pass_oacc_kernels (gcc::context *ctxt);
505 : : extern simple_ipa_opt_pass *make_pass_ipa_oacc (gcc::context *ctxt);
506 : : extern simple_ipa_opt_pass *make_pass_ipa_oacc_kernels (gcc::context *ctxt);
507 : : extern gimple_opt_pass *make_pass_warn_nonnull_compare (gcc::context *ctxt);
508 : : extern gimple_opt_pass *make_pass_sprintf_length (gcc::context *ctxt);
509 : : extern gimple_opt_pass *make_pass_walloca (gcc::context *ctxt);
510 : : extern gimple_opt_pass *make_pass_modref (gcc::context *ctxt);
511 : : extern gimple_opt_pass *make_pass_coroutine_lower_builtins (gcc::context *ctxt);
512 : : extern gimple_opt_pass *make_pass_coroutine_early_expand_ifns (gcc::context *ctxt);
513 : : extern gimple_opt_pass *make_pass_adjust_alignment (gcc::context *ctxt);
514 : :
515 : : /* IPA Passes */
516 : : extern simple_ipa_opt_pass *make_pass_ipa_lower_emutls (gcc::context *ctxt);
517 : : extern simple_ipa_opt_pass *make_pass_ipa_function_and_variable_visibility (gcc::context *ctxt);
518 : : extern simple_ipa_opt_pass *make_pass_ipa_strub_mode (gcc::context *ctxt);
519 : : extern simple_ipa_opt_pass *make_pass_ipa_strub (gcc::context *ctxt);
520 : : extern simple_ipa_opt_pass *make_pass_ipa_tree_profile (gcc::context *ctxt);
521 : : extern simple_ipa_opt_pass *make_pass_ipa_auto_profile (gcc::context *ctxt);
522 : :
523 : : extern simple_ipa_opt_pass *make_pass_build_ssa_passes (gcc::context *ctxt);
524 : : extern simple_ipa_opt_pass *make_pass_local_optimization_passes (gcc::context *ctxt);
525 : : extern simple_ipa_opt_pass *make_pass_ipa_remove_symbols (gcc::context *ctxt);
526 : :
527 : : extern ipa_opt_pass_d *make_pass_analyzer (gcc::context *ctxt);
528 : : extern ipa_opt_pass_d *make_pass_ipa_whole_program_visibility (gcc::context
529 : : *ctxt);
530 : : extern simple_ipa_opt_pass *make_pass_ipa_increase_alignment (gcc::context
531 : : *ctxt);
532 : : extern ipa_opt_pass_d *make_pass_ipa_fn_summary (gcc::context *ctxt);
533 : : extern ipa_opt_pass_d *make_pass_ipa_inline (gcc::context *ctxt);
534 : : extern simple_ipa_opt_pass *make_pass_ipa_free_lang_data (gcc::context *ctxt);
535 : : extern simple_ipa_opt_pass *make_pass_ipa_free_fn_summary (gcc::context *ctxt);
536 : : extern ipa_opt_pass_d *make_pass_ipa_cp (gcc::context *ctxt);
537 : : extern ipa_opt_pass_d *make_pass_ipa_sra (gcc::context *ctxt);
538 : : extern ipa_opt_pass_d *make_pass_ipa_icf (gcc::context *ctxt);
539 : : extern ipa_opt_pass_d *make_pass_ipa_devirt (gcc::context *ctxt);
540 : : extern ipa_opt_pass_d *make_pass_ipa_odr (gcc::context *ctxt);
541 : : extern ipa_opt_pass_d *make_pass_ipa_reference (gcc::context *ctxt);
542 : : extern ipa_opt_pass_d *make_pass_ipa_pure_const (gcc::context *ctxt);
543 : : extern simple_ipa_opt_pass *make_pass_ipa_pta (gcc::context *ctxt);
544 : : extern simple_ipa_opt_pass *make_pass_ipa_tm (gcc::context *ctxt);
545 : : extern simple_ipa_opt_pass *make_pass_target_clone (gcc::context *ctxt);
546 : : extern simple_ipa_opt_pass *make_pass_dispatcher_calls (gcc::context *ctxt);
547 : : extern simple_ipa_opt_pass *make_pass_omp_simd_clone (gcc::context *ctxt);
548 : : extern ipa_opt_pass_d *make_pass_ipa_profile (gcc::context *ctxt);
549 : : extern ipa_opt_pass_d *make_pass_ipa_cdtor_merge (gcc::context *ctxt);
550 : : extern ipa_opt_pass_d *make_pass_ipa_single_use (gcc::context *ctxt);
551 : : extern ipa_opt_pass_d *make_pass_ipa_comdats (gcc::context *ctxt);
552 : : extern ipa_opt_pass_d *make_pass_ipa_modref (gcc::context *ctxt);
553 : :
554 : : extern gimple_opt_pass *make_pass_cleanup_cfg_post_optimizing (gcc::context
555 : : *ctxt);
556 : : extern gimple_opt_pass *make_pass_fixup_cfg (gcc::context *ctxt);
557 : : extern gimple_opt_pass *make_pass_backprop (gcc::context *ctxt);
558 : :
559 : : extern rtl_opt_pass *make_pass_expand (gcc::context *ctxt);
560 : : extern rtl_opt_pass *make_pass_instantiate_virtual_regs (gcc::context *ctxt);
561 : : extern rtl_opt_pass *make_pass_rtl_fwprop (gcc::context *ctxt);
562 : : extern rtl_opt_pass *make_pass_rtl_fwprop_addr (gcc::context *ctxt);
563 : : extern rtl_opt_pass *make_pass_jump (gcc::context *ctxt);
564 : : extern rtl_opt_pass *make_pass_jump2 (gcc::context *ctxt);
565 : : extern rtl_opt_pass *make_pass_lower_subreg (gcc::context *ctxt);
566 : : extern rtl_opt_pass *make_pass_cse (gcc::context *ctxt);
567 : : extern rtl_opt_pass *make_pass_fast_rtl_dce (gcc::context *ctxt);
568 : : extern rtl_opt_pass *make_pass_ud_rtl_dce (gcc::context *ctxt);
569 : : extern rtl_opt_pass *make_pass_rtl_dce (gcc::context *ctxt);
570 : : extern rtl_opt_pass *make_pass_rtl_dse1 (gcc::context *ctxt);
571 : : extern rtl_opt_pass *make_pass_rtl_dse2 (gcc::context *ctxt);
572 : : extern rtl_opt_pass *make_pass_rtl_dse3 (gcc::context *ctxt);
573 : : extern rtl_opt_pass *make_pass_rtl_cprop (gcc::context *ctxt);
574 : : extern rtl_opt_pass *make_pass_rtl_pre (gcc::context *ctxt);
575 : : extern rtl_opt_pass *make_pass_rtl_hoist (gcc::context *ctxt);
576 : : extern rtl_opt_pass *make_pass_rtl_avoid_store_forwarding (gcc::context *ctxt);
577 : : extern rtl_opt_pass *make_pass_rtl_store_motion (gcc::context *ctxt);
578 : : extern rtl_opt_pass *make_pass_cse_after_global_opts (gcc::context *ctxt);
579 : : extern rtl_opt_pass *make_pass_rtl_ifcvt (gcc::context *ctxt);
580 : :
581 : : extern rtl_opt_pass *make_pass_into_cfg_layout_mode (gcc::context *ctxt);
582 : : extern rtl_opt_pass *make_pass_outof_cfg_layout_mode (gcc::context *ctxt);
583 : :
584 : : extern rtl_opt_pass *make_pass_loop2 (gcc::context *ctxt);
585 : : extern rtl_opt_pass *make_pass_rtl_loop_init (gcc::context *ctxt);
586 : : extern rtl_opt_pass *make_pass_rtl_move_loop_invariants (gcc::context *ctxt);
587 : : extern rtl_opt_pass *make_pass_rtl_unroll_loops (gcc::context *ctxt);
588 : : extern rtl_opt_pass *make_pass_rtl_doloop (gcc::context *ctxt);
589 : : extern rtl_opt_pass *make_pass_rtl_loop_done (gcc::context *ctxt);
590 : :
591 : : extern rtl_opt_pass *make_pass_lower_subreg2 (gcc::context *ctxt);
592 : : extern rtl_opt_pass *make_pass_web (gcc::context *ctxt);
593 : : extern rtl_opt_pass *make_pass_cse2 (gcc::context *ctxt);
594 : : extern rtl_opt_pass *make_pass_df_initialize_opt (gcc::context *ctxt);
595 : : extern rtl_opt_pass *make_pass_df_initialize_no_opt (gcc::context *ctxt);
596 : : extern rtl_opt_pass *make_pass_reginfo_init (gcc::context *ctxt);
597 : : extern rtl_opt_pass *make_pass_inc_dec (gcc::context *ctxt);
598 : : extern rtl_opt_pass *make_pass_stack_ptr_mod (gcc::context *ctxt);
599 : : extern rtl_opt_pass *make_pass_initialize_regs (gcc::context *ctxt);
600 : : extern rtl_opt_pass *make_pass_ext_dce (gcc::context *ctxt);
601 : : extern rtl_opt_pass *make_pass_combine (gcc::context *ctxt);
602 : : extern rtl_opt_pass *make_pass_if_after_combine (gcc::context *ctxt);
603 : : extern rtl_opt_pass *make_pass_jump_after_combine (gcc::context *ctxt);
604 : : extern rtl_opt_pass *make_pass_ree (gcc::context *ctxt);
605 : : extern rtl_opt_pass *make_pass_partition_blocks (gcc::context *ctxt);
606 : : extern rtl_opt_pass *make_pass_match_asm_constraints (gcc::context *ctxt);
607 : : extern rtl_opt_pass *make_pass_split_all_insns (gcc::context *ctxt);
608 : : extern rtl_opt_pass *make_pass_fast_rtl_byte_dce (gcc::context *ctxt);
609 : : extern rtl_opt_pass *make_pass_lower_subreg3 (gcc::context *ctxt);
610 : : extern rtl_opt_pass *make_pass_mode_switching (gcc::context *ctxt);
611 : : extern rtl_opt_pass *make_pass_sms (gcc::context *ctxt);
612 : : extern rtl_opt_pass *make_pass_sched (gcc::context *ctxt);
613 : : extern rtl_opt_pass *make_pass_live_range_shrinkage (gcc::context *ctxt);
614 : : extern rtl_opt_pass *make_pass_early_remat (gcc::context *ctxt);
615 : : extern rtl_opt_pass *make_pass_ira (gcc::context *ctxt);
616 : : extern rtl_opt_pass *make_pass_reload (gcc::context *ctxt);
617 : : extern rtl_opt_pass *make_pass_clean_state (gcc::context *ctxt);
618 : : extern rtl_opt_pass *make_pass_branch_prob (gcc::context *ctxt);
619 : : extern rtl_opt_pass *make_pass_value_profile_transformations (gcc::context
620 : : *ctxt);
621 : : extern rtl_opt_pass *make_pass_postreload_cse (gcc::context *ctxt);
622 : : extern rtl_opt_pass *make_pass_late_combine (gcc::context *ctxt);
623 : : extern rtl_opt_pass *make_pass_gcse2 (gcc::context *ctxt);
624 : : extern rtl_opt_pass *make_pass_split_after_reload (gcc::context *ctxt);
625 : : extern rtl_opt_pass *make_pass_thread_prologue_and_epilogue (gcc::context
626 : : *ctxt);
627 : : extern rtl_opt_pass *make_pass_late_thread_prologue_and_epilogue (gcc::context
628 : : *ctxt);
629 : : extern rtl_opt_pass *make_pass_zero_call_used_regs (gcc::context *ctxt);
630 : : extern rtl_opt_pass *make_pass_stack_adjustments (gcc::context *ctxt);
631 : : extern rtl_opt_pass *make_pass_sched_fusion (gcc::context *ctxt);
632 : : extern rtl_opt_pass *make_pass_peephole2 (gcc::context *ctxt);
633 : : extern rtl_opt_pass *make_pass_if_after_reload (gcc::context *ctxt);
634 : : extern rtl_opt_pass *make_pass_regrename (gcc::context *ctxt);
635 : : extern rtl_opt_pass *make_pass_fold_mem_offsets (gcc::context *ctxt);
636 : : extern rtl_opt_pass *make_pass_cprop_hardreg (gcc::context *ctxt);
637 : : extern rtl_opt_pass *make_pass_reorder_blocks (gcc::context *ctxt);
638 : : extern rtl_opt_pass *make_pass_leaf_regs (gcc::context *ctxt);
639 : : extern rtl_opt_pass *make_pass_split_before_sched2 (gcc::context *ctxt);
640 : : extern rtl_opt_pass *make_pass_compare_elim_after_reload (gcc::context *ctxt);
641 : : extern rtl_opt_pass *make_pass_sched2 (gcc::context *ctxt);
642 : : extern rtl_opt_pass *make_pass_stack_regs (gcc::context *ctxt);
643 : : extern rtl_opt_pass *make_pass_stack_regs_run (gcc::context *ctxt);
644 : : extern rtl_opt_pass *make_pass_df_finish (gcc::context *ctxt);
645 : : extern rtl_opt_pass *make_pass_compute_alignments (gcc::context *ctxt);
646 : : extern rtl_opt_pass *make_pass_duplicate_computed_gotos (gcc::context *ctxt);
647 : : extern rtl_opt_pass *make_pass_variable_tracking (gcc::context *ctxt);
648 : : extern rtl_opt_pass *make_pass_free_cfg (gcc::context *ctxt);
649 : : extern rtl_opt_pass *make_pass_machine_reorg (gcc::context *ctxt);
650 : : extern rtl_opt_pass *make_pass_cleanup_barriers (gcc::context *ctxt);
651 : : extern rtl_opt_pass *make_pass_delay_slots (gcc::context *ctxt);
652 : : extern rtl_opt_pass *make_pass_split_for_shorten_branches (gcc::context *ctxt);
653 : : extern rtl_opt_pass *make_pass_split_before_regstack (gcc::context *ctxt);
654 : : extern rtl_opt_pass *make_pass_convert_to_eh_region_ranges (gcc::context *ctxt);
655 : : extern rtl_opt_pass *make_pass_shorten_branches (gcc::context *ctxt);
656 : : extern rtl_opt_pass *make_pass_set_nothrow_function_flags (gcc::context *ctxt);
657 : : extern rtl_opt_pass *make_pass_dwarf2_frame (gcc::context *ctxt);
658 : : extern rtl_opt_pass *make_pass_final (gcc::context *ctxt);
659 : : extern rtl_opt_pass *make_pass_rtl_seqabstr (gcc::context *ctxt);
660 : : extern gimple_opt_pass *make_pass_release_ssa_names (gcc::context *ctxt);
661 : : extern gimple_opt_pass *make_pass_early_inline (gcc::context *ctxt);
662 : : extern gimple_opt_pass *make_pass_local_fn_summary (gcc::context *ctxt);
663 : : extern gimple_opt_pass *make_pass_update_address_taken (gcc::context *ctxt);
664 : : extern gimple_opt_pass *make_pass_convert_switch (gcc::context *ctxt);
665 : : extern gimple_opt_pass *make_pass_lower_vaarg (gcc::context *ctxt);
666 : : extern gimple_opt_pass *make_pass_gimple_isel (gcc::context *ctxt);
667 : : extern gimple_opt_pass *make_pass_harden_compares (gcc::context *ctxt);
668 : : extern gimple_opt_pass *make_pass_harden_conditional_branches (gcc::context
669 : : *ctxt);
670 : : extern gimple_opt_pass *make_pass_harden_control_flow_redundancy (gcc::context
671 : : *ctxt);
672 : :
673 : : /* Current optimization pass. */
674 : : extern opt_pass *current_pass;
675 : :
676 : : extern bool execute_one_pass (opt_pass *);
677 : : extern void execute_pass_list (function *, opt_pass *);
678 : : extern void execute_ipa_pass_list (opt_pass *);
679 : : extern void execute_ipa_summary_passes (ipa_opt_pass_d *);
680 : : extern void execute_all_ipa_transforms (bool);
681 : : extern void execute_all_ipa_stmt_fixups (struct cgraph_node *, gimple **);
682 : : extern bool pass_init_dump_file (opt_pass *);
683 : : extern void pass_fini_dump_file (opt_pass *);
684 : : extern void emergency_dump_function (void);
685 : :
686 : : extern void print_current_pass (FILE *);
687 : : extern void debug_pass (void);
688 : : extern void ipa_write_summaries (void);
689 : : extern void ipa_write_optimization_summaries (struct lto_symtab_encoder_d *,
690 : : bool);
691 : : extern void ipa_read_summaries (void);
692 : : extern void ipa_read_optimization_summaries (void);
693 : : extern void register_one_dump_file (opt_pass *);
694 : : extern bool function_called_by_processed_nodes_p (void);
695 : :
696 : : /* Declare for plugins. */
697 : : extern void do_per_function_toporder (void (*) (function *, void *), void *);
698 : :
699 : : extern void disable_pass (const char *);
700 : : extern void enable_pass (const char *);
701 : : extern void dump_passes (void);
702 : :
703 : : #endif /* GCC_TREE_PASS_H */
|