Line data Source code
1 : /* Definitions for describing one tree-ssa optimization pass.
2 : Copyright (C) 2004-2026 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 769890 : 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 769863 : class gimple_opt_pass : public opt_pass
117 : {
118 : protected:
119 70573378 : gimple_opt_pass (const pass_data& data, gcc::context *ctxt)
120 70573378 : : 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 30286536 : rtl_opt_pass (const pass_data& data, gcc::context *ctxt)
130 30286536 : : 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 5428718 : 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 5428718 : : opt_pass (data, ctxt),
182 5428718 : generate_summary (generate_summary),
183 5428718 : write_summary (write_summary),
184 5428718 : read_summary (read_summary),
185 5428718 : write_optimization_summary (write_optimization_summary),
186 5428718 : read_optimization_summary (read_optimization_summary),
187 5428718 : stmt_fixup (stmt_fixup),
188 5428718 : function_transform_todo_flags_start (function_transform_todo_flags_start),
189 5428718 : function_transform (function_transform),
190 5428718 : 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 6285884 : simple_ipa_opt_pass (const pass_data& data, gcc::context *ctxt)
201 6285884 : : 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 : #define PROP_last_full_fold (1 << 21) /* Start of last forwprop. */
234 :
235 : #define PROP_gimple \
236 : (PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh | PROP_gimple_lomp)
237 :
238 : /* To-do flags. */
239 : /* Note (1ul << 31) is reserved for TODO_verify_il. */
240 : #define TODO_do_not_ggc_collect (1 << 1)
241 : #define TODO_cleanup_cfg (1 << 5)
242 : #define TODO_dump_symtab (1 << 7)
243 : #define TODO_remove_functions (1 << 8)
244 :
245 : /* To-do flags for calls to update_ssa. */
246 :
247 : /* Update the SSA form inserting PHI nodes for newly exposed symbols
248 : and virtual names marked for updating. When updating real names,
249 : only insert PHI nodes for a real name O_j in blocks reached by all
250 : the new and old definitions for O_j. If the iterated dominance
251 : frontier for O_j is not pruned, we may end up inserting PHI nodes
252 : in blocks that have one or more edges with no incoming definition
253 : for O_j. This would lead to uninitialized warnings for O_j's
254 : symbol. */
255 : #define TODO_update_ssa (1 << 11)
256 :
257 : /* Update the SSA form without inserting any new PHI nodes at all.
258 : This is used by passes that have either inserted all the PHI nodes
259 : themselves or passes that need only to patch use-def and def-def
260 : chains for virtuals (e.g., DCE). */
261 : #define TODO_update_ssa_no_phi (1 << 12)
262 :
263 : /* Insert PHI nodes everywhere they are needed. No pruning of the
264 : IDF is done. This is used by passes that need the PHI nodes for
265 : O_j even if it means that some arguments will come from the default
266 : definition of O_j's symbol.
267 :
268 : WARNING: If you need to use this flag, chances are that your pass
269 : may be doing something wrong. Inserting PHI nodes for an old name
270 : where not all edges carry a new replacement may lead to silent
271 : codegen errors or spurious uninitialized warnings. */
272 : #define TODO_update_ssa_full_phi (1 << 13)
273 :
274 : /* Passes that update the SSA form on their own may want to delegate
275 : the updating of virtual names to the generic updater. Since FUD
276 : chains are easier to maintain, this simplifies the work they need
277 : to do. NOTE: If this flag is used, any OLD->NEW mappings for real
278 : names are explicitly destroyed and only the symbols marked for
279 : renaming are processed. */
280 : #define TODO_update_ssa_only_virtuals (1 << 14)
281 :
282 : /* Some passes leave unused local variables that can be removed from
283 : cfun->local_decls. This reduces the size of dump files
284 : and the memory footprint for VAR_DECLs. */
285 : #define TODO_remove_unused_locals (1 << 15)
286 :
287 : /* Call df_finish at the end of the pass. This is done after all of
288 : the dumpers have been allowed to run so that they have access to
289 : the instance before it is destroyed. */
290 : #define TODO_df_finish (1 << 17)
291 :
292 : /* Call df_verify at the end of the pass if checking is enabled. */
293 : #define TODO_df_verify (1 << 18)
294 :
295 : /* Internally used for the first instance of a pass. */
296 : #define TODO_mark_first_instance (1 << 19)
297 :
298 : /* Rebuild aliasing info. */
299 : #define TODO_rebuild_alias (1 << 20)
300 :
301 : /* Rebuild the addressable-vars bitmap and do register promotion. */
302 : #define TODO_update_address_taken (1 << 21)
303 :
304 : /* Rebuild the callgraph edges. */
305 : #define TODO_rebuild_cgraph_edges (1 << 22)
306 :
307 : /* Release function body (unless assumption function)
308 : and stop pass manager. */
309 : #define TODO_discard_function (1 << 23)
310 :
311 : /* (1ul << 31) is reserved for TODO_verify_il. */
312 :
313 : /* Internally used in execute_function_todo(). */
314 : #define TODO_update_ssa_any \
315 : (TODO_update_ssa \
316 : | TODO_update_ssa_no_phi \
317 : | TODO_update_ssa_full_phi \
318 : | TODO_update_ssa_only_virtuals)
319 :
320 : /* To-do flags for pending_TODOs. */
321 :
322 : /* Tell the next scalar cleanup pass that there is
323 : work for it to do. */
324 : #define PENDING_TODO_force_next_scalar_cleanup (1 << 1)
325 :
326 : /* Register pass info. */
327 :
328 : enum pass_positioning_ops
329 : {
330 : PASS_POS_INSERT_AFTER, /* Insert after the reference pass. */
331 : PASS_POS_INSERT_BEFORE, /* Insert before the reference pass. */
332 : PASS_POS_REPLACE /* Replace the reference pass. */
333 : };
334 :
335 : struct register_pass_info
336 : {
337 : opt_pass *pass; /* New pass to register. */
338 : const char *reference_pass_name; /* Name of the reference pass for hooking
339 : up the new pass. */
340 : int ref_pass_instance_number; /* Insert the pass at the specified
341 : instance number of the reference pass.
342 : Do it for every instance if it is 0. */
343 : enum pass_positioning_ops pos_op; /* how to insert the new pass. */
344 : };
345 :
346 : /* Registers a new pass. Either fill out the register_pass_info or specify
347 : the individual parameters. The pass object is expected to have been
348 : allocated using operator new and the pass manager takes the ownership of
349 : the pass object. */
350 : extern void register_pass (register_pass_info *);
351 : extern void register_pass (opt_pass* pass, pass_positioning_ops pos,
352 : const char* ref_pass_name, int ref_pass_inst_number);
353 :
354 : extern gimple_opt_pass *make_pass_asan (gcc::context *ctxt);
355 : extern gimple_opt_pass *make_pass_asan_O0 (gcc::context *ctxt);
356 : extern gimple_opt_pass *make_pass_tsan (gcc::context *ctxt);
357 : extern gimple_opt_pass *make_pass_tsan_O0 (gcc::context *ctxt);
358 : extern gimple_opt_pass *make_pass_sancov (gcc::context *ctxt);
359 : extern gimple_opt_pass *make_pass_sancov_O0 (gcc::context *ctxt);
360 : extern gimple_opt_pass *make_pass_lower_cf (gcc::context *ctxt);
361 : extern gimple_opt_pass *make_pass_refactor_eh (gcc::context *ctxt);
362 : extern gimple_opt_pass *make_pass_lower_eh (gcc::context *ctxt);
363 : extern gimple_opt_pass *make_pass_lower_eh_dispatch (gcc::context *ctxt);
364 : extern gimple_opt_pass *make_pass_lower_resx (gcc::context *ctxt);
365 : extern gimple_opt_pass *make_pass_build_cfg (gcc::context *ctxt);
366 : extern gimple_opt_pass *make_pass_early_tree_profile (gcc::context *ctxt);
367 : extern gimple_opt_pass *make_pass_cleanup_eh (gcc::context *ctxt);
368 : extern gimple_opt_pass *make_pass_sra (gcc::context *ctxt);
369 : extern gimple_opt_pass *make_pass_sra_early (gcc::context *ctxt);
370 : extern gimple_opt_pass *make_pass_tail_recursion (gcc::context *ctxt);
371 : extern gimple_opt_pass *make_pass_tail_calls (gcc::context *ctxt);
372 : extern gimple_opt_pass *make_pass_musttail (gcc::context *ctxt);
373 : extern gimple_opt_pass *make_pass_fix_loops (gcc::context *ctxt);
374 : extern gimple_opt_pass *make_pass_tree_loop (gcc::context *ctxt);
375 : extern gimple_opt_pass *make_pass_tree_no_loop (gcc::context *ctxt);
376 : extern gimple_opt_pass *make_pass_tree_loop_init (gcc::context *ctxt);
377 : extern gimple_opt_pass *make_pass_loop_versioning (gcc::context *ctxt);
378 : extern gimple_opt_pass *make_pass_lim (gcc::context *ctxt);
379 : extern gimple_opt_pass *make_pass_linterchange (gcc::context *ctxt);
380 : extern gimple_opt_pass *make_pass_tree_unswitch (gcc::context *ctxt);
381 : extern gimple_opt_pass *make_pass_loop_split (gcc::context *ctxt);
382 : extern gimple_opt_pass *make_pass_loop_jam (gcc::context *ctxt);
383 : extern gimple_opt_pass *make_pass_predcom (gcc::context *ctxt);
384 : extern gimple_opt_pass *make_pass_iv_canon (gcc::context *ctxt);
385 : extern gimple_opt_pass *make_pass_scev_cprop (gcc::context *ctxt);
386 : extern gimple_opt_pass *make_pass_empty_loop (gcc::context *ctxt);
387 : extern gimple_opt_pass *make_pass_graphite (gcc::context *ctxt);
388 : extern gimple_opt_pass *make_pass_graphite_transforms (gcc::context *ctxt);
389 : extern gimple_opt_pass *make_pass_if_conversion (gcc::context *ctxt);
390 : extern gimple_opt_pass *make_pass_if_to_switch (gcc::context *ctxt);
391 : extern gimple_opt_pass *make_pass_loop_distribution (gcc::context *ctxt);
392 : extern gimple_opt_pass *make_pass_crc_optimization (gcc::context *ctxt);
393 : extern gimple_opt_pass *make_pass_vectorize (gcc::context *ctxt);
394 : extern gimple_opt_pass *make_pass_simduid_cleanup (gcc::context *ctxt);
395 : extern gimple_opt_pass *make_pass_slp_vectorize (gcc::context *ctxt);
396 : extern gimple_opt_pass *make_pass_complete_unroll (gcc::context *ctxt);
397 : extern gimple_opt_pass *make_pass_complete_unrolli (gcc::context *ctxt);
398 : extern gimple_opt_pass *make_pass_pre_slp_scalar_cleanup (gcc::context *ctxt);
399 : extern gimple_opt_pass *make_pass_parallelize_loops (gcc::context *ctxt);
400 : extern gimple_opt_pass *make_pass_loop_prefetch (gcc::context *ctxt);
401 : extern gimple_opt_pass *make_pass_iv_optimize (gcc::context *ctxt);
402 : extern gimple_opt_pass *make_pass_tree_loop_done (gcc::context *ctxt);
403 : extern gimple_opt_pass *make_pass_ch (gcc::context *ctxt);
404 : extern gimple_opt_pass *make_pass_ch_vect (gcc::context *ctxt);
405 : extern gimple_opt_pass *make_pass_sccopy (gcc::context *ctxt);
406 : extern gimple_opt_pass *make_pass_ccp (gcc::context *ctxt);
407 : extern gimple_opt_pass *make_pass_split_paths (gcc::context *ctxt);
408 : extern gimple_opt_pass *make_pass_build_ssa (gcc::context *ctxt);
409 : extern gimple_opt_pass *make_pass_build_alias (gcc::context *ctxt);
410 : extern gimple_opt_pass *make_pass_build_ealias (gcc::context *ctxt);
411 : extern gimple_opt_pass *make_pass_dominator (gcc::context *ctxt);
412 : extern gimple_opt_pass *make_pass_dce (gcc::context *ctxt);
413 : extern gimple_opt_pass *make_pass_cd_dce (gcc::context *ctxt);
414 : extern gimple_opt_pass *make_pass_call_cdce (gcc::context *ctxt);
415 : extern gimple_opt_pass *make_pass_merge_phi (gcc::context *ctxt);
416 : extern gimple_opt_pass *make_pass_thread_jumps (gcc::context *ctxt);
417 : extern gimple_opt_pass *make_pass_thread_jumps_full (gcc::context *ctxt);
418 : extern gimple_opt_pass *make_pass_early_thread_jumps (gcc::context *ctxt);
419 : extern gimple_opt_pass *make_pass_split_crit_edges (gcc::context *ctxt);
420 : extern gimple_opt_pass *make_pass_laddress (gcc::context *ctxt);
421 : extern gimple_opt_pass *make_pass_pre (gcc::context *ctxt);
422 : extern unsigned int tail_merge_optimize (bool);
423 : extern gimple_opt_pass *make_pass_profile (gcc::context *ctxt);
424 : extern gimple_opt_pass *make_pass_strip_predict_hints (gcc::context *ctxt);
425 : extern gimple_opt_pass *make_pass_rebuild_frequencies (gcc::context *ctxt);
426 : extern gimple_opt_pass *make_pass_lower_complex_O0 (gcc::context *ctxt);
427 : extern gimple_opt_pass *make_pass_lower_complex (gcc::context *ctxt);
428 : extern gimple_opt_pass *make_pass_lower_bitint_O0 (gcc::context *ctxt);
429 : extern gimple_opt_pass *make_pass_lower_bitint (gcc::context *ctxt);
430 : extern gimple_opt_pass *make_pass_lower_switch (gcc::context *ctxt);
431 : extern gimple_opt_pass *make_pass_lower_switch_O0 (gcc::context *ctxt);
432 : extern gimple_opt_pass *make_pass_lower_vector (gcc::context *ctxt);
433 : extern gimple_opt_pass *make_pass_lower_vector_ssa (gcc::context *ctxt);
434 : extern gimple_opt_pass *make_pass_omp_oacc_kernels_decompose (gcc::context *ctxt);
435 : extern gimple_opt_pass *make_pass_lower_omp (gcc::context *ctxt);
436 : extern gimple_opt_pass *make_pass_diagnose_omp_blocks (gcc::context *ctxt);
437 : extern gimple_opt_pass *make_pass_expand_omp (gcc::context *ctxt);
438 : extern gimple_opt_pass *make_pass_expand_omp_ssa (gcc::context *ctxt);
439 : extern gimple_opt_pass *make_pass_omp_target_link (gcc::context *ctxt);
440 : extern gimple_opt_pass *make_pass_oacc_loop_designation (gcc::context *ctxt);
441 : extern gimple_opt_pass *make_pass_omp_oacc_neuter_broadcast (gcc::context *ctxt);
442 : extern gimple_opt_pass *make_pass_oacc_device_lower (gcc::context *ctxt);
443 : extern gimple_opt_pass *make_pass_omp_device_lower (gcc::context *ctxt);
444 : extern gimple_opt_pass *make_pass_object_sizes (gcc::context *ctxt);
445 : extern gimple_opt_pass *make_pass_early_object_sizes (gcc::context *ctxt);
446 : extern gimple_opt_pass *make_pass_warn_access (gcc::context *ctxt);
447 : extern gimple_opt_pass *make_pass_warn_printf (gcc::context *ctxt);
448 : extern gimple_opt_pass *make_pass_warn_recursion (gcc::context *ctxt);
449 : extern gimple_opt_pass *make_pass_strlen (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 : extern simple_ipa_opt_pass *make_pass_ipa_auto_profile_offline
523 : (gcc::context *ctxt);
524 :
525 : extern simple_ipa_opt_pass *make_pass_build_ssa_passes (gcc::context *ctxt);
526 : extern simple_ipa_opt_pass *make_pass_local_optimization_passes (gcc::context *ctxt);
527 : extern simple_ipa_opt_pass *make_pass_ipa_remove_symbols (gcc::context *ctxt);
528 :
529 : extern ipa_opt_pass_d *make_pass_analyzer (gcc::context *ctxt);
530 : extern ipa_opt_pass_d *make_pass_ipa_asm_lgen (gcc::context *ctxt);
531 : extern ipa_opt_pass_d *make_pass_ipa_asm_wpa (gcc::context *ctxt);
532 : extern ipa_opt_pass_d *make_pass_ipa_whole_program_visibility (gcc::context
533 : *ctxt);
534 : extern simple_ipa_opt_pass *make_pass_ipa_increase_alignment (gcc::context
535 : *ctxt);
536 : extern ipa_opt_pass_d *make_pass_ipa_fn_summary (gcc::context *ctxt);
537 : extern ipa_opt_pass_d *make_pass_ipa_inline (gcc::context *ctxt);
538 : extern simple_ipa_opt_pass *make_pass_ipa_free_lang_data (gcc::context *ctxt);
539 : extern simple_ipa_opt_pass *make_pass_ipa_free_fn_summary (gcc::context *ctxt);
540 : extern ipa_opt_pass_d *make_pass_ipa_cp (gcc::context *ctxt);
541 : extern ipa_opt_pass_d *make_pass_ipa_sra (gcc::context *ctxt);
542 : extern ipa_opt_pass_d *make_pass_ipa_icf (gcc::context *ctxt);
543 : extern ipa_opt_pass_d *make_pass_ipa_devirt (gcc::context *ctxt);
544 : extern ipa_opt_pass_d *make_pass_ipa_odr (gcc::context *ctxt);
545 : extern ipa_opt_pass_d *make_pass_ipa_reference (gcc::context *ctxt);
546 : extern ipa_opt_pass_d *make_pass_ipa_pure_const (gcc::context *ctxt);
547 : extern simple_ipa_opt_pass *make_pass_ipa_pta (gcc::context *ctxt);
548 : extern simple_ipa_opt_pass *make_pass_ipa_tm (gcc::context *ctxt);
549 : extern simple_ipa_opt_pass *make_pass_target_clone (gcc::context *ctxt);
550 : extern simple_ipa_opt_pass *make_pass_dispatcher_calls (gcc::context *ctxt);
551 : extern simple_ipa_opt_pass *make_pass_omp_simd_clone (gcc::context *ctxt);
552 : extern ipa_opt_pass_d *make_pass_ipa_profile (gcc::context *ctxt);
553 : extern ipa_opt_pass_d *make_pass_ipa_cdtor_merge (gcc::context *ctxt);
554 : extern ipa_opt_pass_d *make_pass_ipa_single_use (gcc::context *ctxt);
555 : extern ipa_opt_pass_d *make_pass_ipa_comdats (gcc::context *ctxt);
556 : extern ipa_opt_pass_d *make_pass_ipa_modref (gcc::context *ctxt);
557 : extern ipa_opt_pass_d *make_pass_ipa_locality_cloning (gcc::context *ctxt);
558 :
559 : extern gimple_opt_pass *make_pass_cleanup_cfg_post_optimizing (gcc::context
560 : *ctxt);
561 : extern gimple_opt_pass *make_pass_fixup_cfg (gcc::context *ctxt);
562 : extern gimple_opt_pass *make_pass_backprop (gcc::context *ctxt);
563 :
564 : extern rtl_opt_pass *make_pass_expand (gcc::context *ctxt);
565 : extern rtl_opt_pass *make_pass_instantiate_virtual_regs (gcc::context *ctxt);
566 : extern rtl_opt_pass *make_pass_rtl_fwprop (gcc::context *ctxt);
567 : extern rtl_opt_pass *make_pass_rtl_fwprop_addr (gcc::context *ctxt);
568 : extern rtl_opt_pass *make_pass_jump (gcc::context *ctxt);
569 : extern rtl_opt_pass *make_pass_jump2 (gcc::context *ctxt);
570 : extern rtl_opt_pass *make_pass_lower_subreg (gcc::context *ctxt);
571 : extern rtl_opt_pass *make_pass_cse (gcc::context *ctxt);
572 : extern rtl_opt_pass *make_pass_fast_rtl_dce (gcc::context *ctxt);
573 : extern rtl_opt_pass *make_pass_ud_rtl_dce (gcc::context *ctxt);
574 : extern rtl_opt_pass *make_pass_rtl_dce (gcc::context *ctxt);
575 : extern rtl_opt_pass *make_pass_rtl_dse1 (gcc::context *ctxt);
576 : extern rtl_opt_pass *make_pass_rtl_dse2 (gcc::context *ctxt);
577 : extern rtl_opt_pass *make_pass_rtl_dse3 (gcc::context *ctxt);
578 : extern rtl_opt_pass *make_pass_rtl_cprop (gcc::context *ctxt);
579 : extern rtl_opt_pass *make_pass_rtl_pre (gcc::context *ctxt);
580 : extern rtl_opt_pass *make_pass_rtl_hoist (gcc::context *ctxt);
581 : extern rtl_opt_pass *make_pass_hardreg_pre (gcc::context *ctxt);
582 : extern rtl_opt_pass *make_pass_rtl_avoid_store_forwarding (gcc::context *ctxt);
583 : extern rtl_opt_pass *make_pass_rtl_store_motion (gcc::context *ctxt);
584 : extern rtl_opt_pass *make_pass_cse_after_global_opts (gcc::context *ctxt);
585 : extern rtl_opt_pass *make_pass_rtl_ifcvt (gcc::context *ctxt);
586 :
587 : extern rtl_opt_pass *make_pass_into_cfg_layout_mode (gcc::context *ctxt);
588 : extern rtl_opt_pass *make_pass_outof_cfg_layout_mode (gcc::context *ctxt);
589 :
590 : extern rtl_opt_pass *make_pass_loop2 (gcc::context *ctxt);
591 : extern rtl_opt_pass *make_pass_rtl_loop_init (gcc::context *ctxt);
592 : extern rtl_opt_pass *make_pass_rtl_move_loop_invariants (gcc::context *ctxt);
593 : extern rtl_opt_pass *make_pass_rtl_unroll_loops (gcc::context *ctxt);
594 : extern rtl_opt_pass *make_pass_rtl_doloop (gcc::context *ctxt);
595 : extern rtl_opt_pass *make_pass_rtl_loop_done (gcc::context *ctxt);
596 :
597 : extern rtl_opt_pass *make_pass_lower_subreg2 (gcc::context *ctxt);
598 : extern rtl_opt_pass *make_pass_web (gcc::context *ctxt);
599 : extern rtl_opt_pass *make_pass_cse2 (gcc::context *ctxt);
600 : extern rtl_opt_pass *make_pass_df_initialize_opt (gcc::context *ctxt);
601 : extern rtl_opt_pass *make_pass_df_initialize_no_opt (gcc::context *ctxt);
602 : extern rtl_opt_pass *make_pass_reginfo_init (gcc::context *ctxt);
603 : extern rtl_opt_pass *make_pass_inc_dec (gcc::context *ctxt);
604 : extern rtl_opt_pass *make_pass_stack_ptr_mod (gcc::context *ctxt);
605 : extern rtl_opt_pass *make_pass_initialize_regs (gcc::context *ctxt);
606 : extern rtl_opt_pass *make_pass_ext_dce (gcc::context *ctxt);
607 : extern rtl_opt_pass *make_pass_combine (gcc::context *ctxt);
608 : extern rtl_opt_pass *make_pass_if_after_combine (gcc::context *ctxt);
609 : extern rtl_opt_pass *make_pass_jump_after_combine (gcc::context *ctxt);
610 : extern rtl_opt_pass *make_pass_ree (gcc::context *ctxt);
611 : extern rtl_opt_pass *make_pass_partition_blocks (gcc::context *ctxt);
612 : extern rtl_opt_pass *make_pass_match_asm_constraints (gcc::context *ctxt);
613 : extern rtl_opt_pass *make_pass_split_all_insns (gcc::context *ctxt);
614 : extern rtl_opt_pass *make_pass_fast_rtl_byte_dce (gcc::context *ctxt);
615 : extern rtl_opt_pass *make_pass_lower_subreg3 (gcc::context *ctxt);
616 : extern rtl_opt_pass *make_pass_mode_switching (gcc::context *ctxt);
617 : extern rtl_opt_pass *make_pass_sms (gcc::context *ctxt);
618 : extern rtl_opt_pass *make_pass_sched (gcc::context *ctxt);
619 : extern rtl_opt_pass *make_pass_live_range_shrinkage (gcc::context *ctxt);
620 : extern rtl_opt_pass *make_pass_early_remat (gcc::context *ctxt);
621 : extern rtl_opt_pass *make_pass_ira (gcc::context *ctxt);
622 : extern rtl_opt_pass *make_pass_reload (gcc::context *ctxt);
623 : extern rtl_opt_pass *make_pass_clean_state (gcc::context *ctxt);
624 : extern rtl_opt_pass *make_pass_branch_prob (gcc::context *ctxt);
625 : extern rtl_opt_pass *make_pass_value_profile_transformations (gcc::context
626 : *ctxt);
627 : extern rtl_opt_pass *make_pass_postreload_cse (gcc::context *ctxt);
628 : extern rtl_opt_pass *make_pass_late_combine (gcc::context *ctxt);
629 : extern rtl_opt_pass *make_pass_dep_fusion (gcc::context *ctxt);
630 : extern rtl_opt_pass *make_pass_gcse2 (gcc::context *ctxt);
631 : extern rtl_opt_pass *make_pass_split_after_reload (gcc::context *ctxt);
632 : extern rtl_opt_pass *make_pass_thread_prologue_and_epilogue (gcc::context
633 : *ctxt);
634 : extern rtl_opt_pass *make_pass_late_thread_prologue_and_epilogue (gcc::context
635 : *ctxt);
636 : extern rtl_opt_pass *make_pass_zero_call_used_regs (gcc::context *ctxt);
637 : extern rtl_opt_pass *make_pass_stack_adjustments (gcc::context *ctxt);
638 : extern rtl_opt_pass *make_pass_sched_fusion (gcc::context *ctxt);
639 : extern rtl_opt_pass *make_pass_peephole2 (gcc::context *ctxt);
640 : extern rtl_opt_pass *make_pass_if_after_reload (gcc::context *ctxt);
641 : extern rtl_opt_pass *make_pass_regrename (gcc::context *ctxt);
642 : extern rtl_opt_pass *make_pass_fold_mem_offsets (gcc::context *ctxt);
643 : extern rtl_opt_pass *make_pass_cprop_hardreg (gcc::context *ctxt);
644 : extern rtl_opt_pass *make_pass_reorder_blocks (gcc::context *ctxt);
645 : extern rtl_opt_pass *make_pass_leaf_regs (gcc::context *ctxt);
646 : extern rtl_opt_pass *make_pass_split_before_sched2 (gcc::context *ctxt);
647 : extern rtl_opt_pass *make_pass_compare_elim_after_reload (gcc::context *ctxt);
648 : extern rtl_opt_pass *make_pass_sched2 (gcc::context *ctxt);
649 : extern rtl_opt_pass *make_pass_stack_regs (gcc::context *ctxt);
650 : extern rtl_opt_pass *make_pass_stack_regs_run (gcc::context *ctxt);
651 : extern rtl_opt_pass *make_pass_df_finish (gcc::context *ctxt);
652 : extern rtl_opt_pass *make_pass_compute_alignments (gcc::context *ctxt);
653 : extern rtl_opt_pass *make_pass_duplicate_computed_gotos (gcc::context *ctxt);
654 : extern rtl_opt_pass *make_pass_variable_tracking (gcc::context *ctxt);
655 : extern rtl_opt_pass *make_pass_free_cfg (gcc::context *ctxt);
656 : extern rtl_opt_pass *make_pass_machine_reorg (gcc::context *ctxt);
657 : extern rtl_opt_pass *make_pass_cleanup_barriers (gcc::context *ctxt);
658 : extern rtl_opt_pass *make_pass_delay_slots (gcc::context *ctxt);
659 : extern rtl_opt_pass *make_pass_split_for_shorten_branches (gcc::context *ctxt);
660 : extern rtl_opt_pass *make_pass_split_before_regstack (gcc::context *ctxt);
661 : extern rtl_opt_pass *make_pass_convert_to_eh_region_ranges (gcc::context *ctxt);
662 : extern rtl_opt_pass *make_pass_shorten_branches (gcc::context *ctxt);
663 : extern rtl_opt_pass *make_pass_set_nothrow_function_flags (gcc::context *ctxt);
664 : extern rtl_opt_pass *make_pass_dwarf2_frame (gcc::context *ctxt);
665 : extern rtl_opt_pass *make_pass_final (gcc::context *ctxt);
666 : extern rtl_opt_pass *make_pass_rtl_seqabstr (gcc::context *ctxt);
667 : extern gimple_opt_pass *make_pass_release_ssa_names (gcc::context *ctxt);
668 : extern gimple_opt_pass *make_pass_early_inline (gcc::context *ctxt);
669 : extern gimple_opt_pass *make_pass_local_fn_summary (gcc::context *ctxt);
670 : extern gimple_opt_pass *make_pass_update_address_taken (gcc::context *ctxt);
671 : extern gimple_opt_pass *make_pass_convert_switch (gcc::context *ctxt);
672 : extern gimple_opt_pass *make_pass_lower_vaarg (gcc::context *ctxt);
673 : extern gimple_opt_pass *make_pass_gimple_isel (gcc::context *ctxt);
674 : extern gimple_opt_pass *make_pass_harden_compares (gcc::context *ctxt);
675 : extern gimple_opt_pass *make_pass_harden_conditional_branches (gcc::context
676 : *ctxt);
677 : extern gimple_opt_pass *make_pass_harden_control_flow_redundancy (gcc::context
678 : *ctxt);
679 :
680 : /* Current optimization pass. */
681 : extern opt_pass *current_pass;
682 :
683 : extern bool execute_one_pass (opt_pass *);
684 : extern void execute_pass_list (function *, opt_pass *);
685 : extern void execute_ipa_pass_list (opt_pass *);
686 : extern void execute_ipa_summary_passes (ipa_opt_pass_d *);
687 : extern void execute_all_ipa_transforms (bool);
688 : extern void execute_all_ipa_stmt_fixups (struct cgraph_node *, gimple **);
689 : extern bool pass_init_dump_file (opt_pass *);
690 : extern void pass_fini_dump_file (opt_pass *);
691 : extern void emergency_dump_function (void);
692 :
693 : extern void print_current_pass (FILE *);
694 : extern void debug_pass (void);
695 : extern void ipa_write_summaries (void);
696 : extern void ipa_write_optimization_summaries (struct lto_symtab_encoder_d *,
697 : bool);
698 : extern void ipa_read_summaries (void);
699 : extern void ipa_read_optimization_summaries (void);
700 : extern void register_one_dump_file (opt_pass *);
701 : extern bool function_called_by_processed_nodes_p (void);
702 :
703 : /* Declare for plugins. */
704 : extern void do_per_function_toporder (void (*) (function *, void *), void *);
705 :
706 : extern void disable_pass (const char *);
707 : extern void enable_pass (const char *);
708 : extern void dump_passes (void);
709 :
710 : #endif /* GCC_TREE_PASS_H */
|