]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/tree-pass.h
re PR middle-end/42678 (ICE with lto1 in expand_mult, at expmed.c:3253)
[thirdparty/gcc.git] / gcc / tree-pass.h
CommitLineData
6de9cd9a 1/* Definitions for describing one tree-ssa optimization pass.
66647d44
JJ
2 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009
3 Free Software Foundation, Inc.
6de9cd9a
DN
4 Contributed by Richard Henderson <rth@redhat.com>
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
9dcd6f09 10the Free Software Foundation; either version 3, or (at your option)
6de9cd9a
DN
11any later version.
12
13GCC is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
9dcd6f09
NC
19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
6de9cd9a
DN
21
22
23#ifndef GCC_TREE_PASS_H
24#define GCC_TREE_PASS_H 1
25
7072a650 26#include "timevar.h"
ef330312
PB
27
28/* Different tree dump places. When you add new tree dump places,
29 extend the DUMP_FILES array in tree-dump.c. */
30enum tree_dump_index
31{
32 TDI_none, /* No dump */
bbbe4e7b 33 TDI_cgraph, /* dump function call graph. */
ef330312
PB
34 TDI_tu, /* dump the whole translation unit. */
35 TDI_class, /* dump class hierarchy. */
36 TDI_original, /* dump each function before optimizing it */
37 TDI_generic, /* dump each function after genericizing it */
38 TDI_nested, /* dump each function after unnesting it */
ef330312
PB
39 TDI_vcg, /* create a VCG graph file for each
40 function's flowgraph. */
41 TDI_tree_all, /* enable all the GENERIC/GIMPLE dumps. */
42 TDI_rtl_all, /* enable all the RTL dumps. */
43 TDI_ipa_all, /* enable all the IPA dumps. */
44
ef330312
PB
45 TDI_end
46};
47
48/* Bit masks to control dumping. Not all values are applicable to
49 all dumps. Add new ones at the end. When you define new
50 values, extend the DUMP_OPTIONS array in tree-dump.c */
51#define TDF_ADDRESS (1 << 0) /* dump node addresses */
52#define TDF_SLIM (1 << 1) /* don't go wild following links */
53#define TDF_RAW (1 << 2) /* don't unparse the function */
54#define TDF_DETAILS (1 << 3) /* show more detailed info about
55 each pass */
56#define TDF_STATS (1 << 4) /* dump various statistics about
57 each pass */
58#define TDF_BLOCKS (1 << 5) /* display basic block boundaries */
59#define TDF_VOPS (1 << 6) /* display virtual operands */
60#define TDF_LINENO (1 << 7) /* display statement line numbers */
61#define TDF_UID (1 << 8) /* display decl UIDs */
62
63#define TDF_TREE (1 << 9) /* is a tree dump */
64#define TDF_RTL (1 << 10) /* is a RTL dump */
65#define TDF_IPA (1 << 11) /* is an IPA dump */
66#define TDF_STMTADDR (1 << 12) /* Address of stmt. */
67
5e34206b 68#define TDF_GRAPH (1 << 13) /* a graph dump is being emitted */
38635499
DN
69#define TDF_MEMSYMS (1 << 14) /* display memory symbols in expr.
70 Implies TDF_VOPS. */
5e34206b 71
438d798f
SM
72#define TDF_DIAGNOSTIC (1 << 15) /* A dump to be put in a diagnostic
73 message. */
b8698a0f 74#define TDF_VERBOSE (1 << 16) /* A dump that uses the full tree
726a989a
RB
75 dumper to print stmts. */
76#define TDF_RHS_ONLY (1 << 17) /* a flag to only print the RHS of
77 a gimple stmt. */
394bd84d 78#define TDF_ASMNAME (1 << 18) /* display asm names of decls */
cae63f88
DN
79#define TDF_EH (1 << 19) /* display EH region number
80 holding this gimple statement. */
394bd84d 81
831b9ef8 82#define TDF_NOUID (1 << 20) /* omit UIDs from dumps. */
394bd84d 83
7072a650 84/* In tree-dump.c */
438d798f 85
bbbbb16a
ILT
86extern char *get_dump_file_name (int);
87extern int dump_enabled_p (int);
88extern int dump_initialized_p (int);
89extern FILE *dump_begin (int, int *);
90extern void dump_end (int, FILE *);
58f9752a 91extern void dump_node (const_tree, int, FILE *);
ef330312 92extern int dump_switch_p (const char *);
bbbbb16a 93extern const char *dump_flag_name (int);
ef330312 94
6de9cd9a
DN
95/* Global variables used to communicate with passes. */
96extern FILE *dump_file;
97extern int dump_flags;
9f8628ba 98extern const char *dump_file_name;
6de9cd9a 99
9f8628ba 100/* Return the dump_file_info for the given phase. */
bbbbb16a 101extern struct dump_file_info *get_dump_file_info (int);
9f8628ba 102
24b97832
ILT
103/* Optimization pass type. */
104enum opt_pass_type
105{
106 GIMPLE_PASS,
107 RTL_PASS,
108 SIMPLE_IPA_PASS,
109 IPA_PASS
110};
111
8ddbbcae
JH
112/* Describe one pass; this is the common part shared across different pass
113 types. */
114struct opt_pass
6de9cd9a 115{
8ddbbcae 116 /* Optimization pass type. */
24b97832
ILT
117 enum opt_pass_type type;
118
8e352cd3
BS
119 /* Terse name of the pass used as a fragment of the dump file
120 name. If the name starts with a star, no dump happens. */
6de9cd9a
DN
121 const char *name;
122
123 /* If non-null, this pass and all sub-passes are executed only if
124 the function returns true. */
125 bool (*gate) (void);
126
127 /* This is the code to run. If null, then there should be sub-passes
c2924966
DB
128 otherwise this pass does nothing. The return value contains
129 TODOs to execute in addition to those in TODO_flags_finish. */
130 unsigned int (*execute) (void);
6de9cd9a
DN
131
132 /* A list of sub-passes to run, dependent on gate predicate. */
8ddbbcae 133 struct opt_pass *sub;
6de9cd9a
DN
134
135 /* Next in the list of passes to run, independent of gate predicate. */
8ddbbcae 136 struct opt_pass *next;
6de9cd9a
DN
137
138 /* Static pass number, used as a fragment of the dump file name. */
b3fade83 139 int static_pass_number;
6de9cd9a
DN
140
141 /* The timevar id associated with this pass. */
142 /* ??? Ideally would be dynamically assigned. */
7072a650 143 timevar_id_t tv_id;
6de9cd9a
DN
144
145 /* Sets of properties input and output from this pass. */
146 unsigned int properties_required;
147 unsigned int properties_provided;
148 unsigned int properties_destroyed;
149
150 /* Flags indicating common sets things to do before and after. */
151 unsigned int todo_flags_start;
152 unsigned int todo_flags_finish;
8ddbbcae
JH
153};
154
17653c00 155/* Description of GIMPLE pass. */
8ddbbcae
JH
156struct gimple_opt_pass
157{
158 struct opt_pass pass;
159};
9f8628ba 160
fa10beec 161/* Description of RTL pass. */
8ddbbcae
JH
162struct rtl_opt_pass
163{
164 struct opt_pass pass;
165};
166
17653c00
JH
167struct varpool_node;
168struct cgraph_node;
fed5ae11 169struct cgraph_node_set_def;
17653c00
JH
170
171/* Description of IPA pass with generate summary, write, execute, read and
172 transform stages. */
7e5487a2 173struct ipa_opt_pass_d
17653c00
JH
174{
175 struct opt_pass pass;
176
1920df6c
KZ
177 /* IPA passes can analyze function body and variable initializers
178 using this hook and produce summary. */
179 void (*generate_summary) (void);
180
181 /* This hook is used to serialize IPA summaries on disk. */
fed5ae11 182 void (*write_summary) (struct cgraph_node_set_def *);
17653c00 183
1920df6c
KZ
184 /* For most ipa passes, the information can only be deserialized in
185 one chunk. However, function bodies are read function at a time
186 as needed so both calls are necessary. */
187 void (*read_summary) (void);
188 void (*function_read_summary) (struct cgraph_node *);
2c5721d9
MJ
189 /* Hook to convert gimple stmt uids into true gimple statements. The second
190 parameter is an array of statements indexed by their uid. */
191 void (*stmt_fixup) (struct cgraph_node *, gimple *);
192
17653c00
JH
193 /* Results of interprocedural propagation of an IPA pass is applied to
194 function body via this hook. */
195 unsigned int function_transform_todo_flags_start;
196 unsigned int (*function_transform) (struct cgraph_node *);
197 void (*variable_transform) (struct varpool_node *);
17653c00
JH
198};
199
200/* Description of simple IPA pass. Simple IPA passes have just one execute
8ddbbcae
JH
201 hook. */
202struct simple_ipa_opt_pass
203{
204 struct opt_pass pass;
9f8628ba
PB
205};
206
207/* Define a tree dump switch. */
208struct dump_file_info
209{
210 const char *suffix; /* suffix to give output file. */
211 const char *swtch; /* command line switch */
f46fe224 212 const char *glob; /* command line glob */
9f8628ba
PB
213 int flags; /* user flags */
214 int state; /* state of play */
215 int num; /* dump file number */
6de9cd9a
DN
216};
217
218/* Pass properties. */
219#define PROP_gimple_any (1 << 0) /* entire gimple grammar */
220#define PROP_gimple_lcf (1 << 1) /* lowered control flow */
221#define PROP_gimple_leh (1 << 2) /* lowered eh */
222#define PROP_cfg (1 << 3)
223#define PROP_referenced_vars (1 << 4)
7b0e48fb
DB
224#define PROP_ssa (1 << 5)
225#define PROP_no_crit_edges (1 << 6)
226#define PROP_rtl (1 << 7)
4effdf02
RG
227#define PROP_gimple_lomp (1 << 8) /* lowered OpenMP directives */
228#define PROP_cfglayout (1 << 9) /* cfglayout mode on RTL */
688a482d 229#define PROP_gimple_lcx (1 << 10) /* lowered complex */
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. */
0bca51f0
DN
235#define TODO_dump_func (1 << 0)
236#define TODO_ggc_collect (1 << 1)
b8698a0f 237#define TODO_verify_ssa (1 << 2)
0bca51f0
DN
238#define TODO_verify_flow (1 << 3)
239#define TODO_verify_stmts (1 << 4)
240#define TODO_cleanup_cfg (1 << 5)
241#define TODO_verify_loops (1 << 6)
b4861090 242#define TODO_dump_cgraph (1 << 7)
f4b3ca72 243#define TODO_remove_functions (1 << 8)
45a80bb9 244#define TODO_rebuild_frequencies (1 << 9)
a36b8a1e 245#define TODO_verify_rtl_sharing (1 << 10)
0bca51f0
DN
246
247/* To-do flags for calls to update_ssa. */
248
249/* Update the SSA form inserting PHI nodes for newly exposed symbols
250 and virtual names marked for updating. When updating real names,
251 only insert PHI nodes for a real name O_j in blocks reached by all
252 the new and old definitions for O_j. If the iterated dominance
253 frontier for O_j is not pruned, we may end up inserting PHI nodes
254 in blocks that have one or more edges with no incoming definition
255 for O_j. This would lead to uninitialized warnings for O_j's
256 symbol. */
a36b8a1e 257#define TODO_update_ssa (1 << 11)
0bca51f0
DN
258
259/* Update the SSA form without inserting any new PHI nodes at all.
260 This is used by passes that have either inserted all the PHI nodes
261 themselves or passes that need only to patch use-def and def-def
262 chains for virtuals (e.g., DCE). */
a36b8a1e 263#define TODO_update_ssa_no_phi (1 << 12)
0bca51f0 264
0fa2e4df 265/* Insert PHI nodes everywhere they are needed. No pruning of the
0bca51f0
DN
266 IDF is done. This is used by passes that need the PHI nodes for
267 O_j even if it means that some arguments will come from the default
268 definition of O_j's symbol (e.g., pass_linear_transform).
b8698a0f 269
0bca51f0
DN
270 WARNING: If you need to use this flag, chances are that your pass
271 may be doing something wrong. Inserting PHI nodes for an old name
272 where not all edges carry a new replacement may lead to silent
273 codegen errors or spurious uninitialized warnings. */
a36b8a1e 274#define TODO_update_ssa_full_phi (1 << 13)
0bca51f0
DN
275
276/* Passes that update the SSA form on their own may want to delegate
277 the updating of virtual names to the generic updater. Since FUD
278 chains are easier to maintain, this simplifies the work they need
279 to do. NOTE: If this flag is used, any OLD->NEW mappings for real
280 names are explicitly destroyed and only the symbols marked for
281 renaming are processed. */
a36b8a1e 282#define TODO_update_ssa_only_virtuals (1 << 14)
0bca51f0 283
3f519b35 284/* Some passes leave unused local variables that can be removed from
cb91fab0
JH
285 cfun->local_decls. This reduces the size of dump files
286 and the memory footprint for VAR_DECLs. */
a36b8a1e 287#define TODO_remove_unused_locals (1 << 15)
3f519b35 288
6fb5fa3c
DB
289/* Call df_finish at the end of the pass. This is done after all of
290 the dumpers have been allowed to run so that they have access to
291 the instance before it is destroyed. */
a36b8a1e 292#define TODO_df_finish (1 << 17)
6fb5fa3c 293
0d475361 294/* Call df_verify at the end of the pass if checking is enabled. */
a36b8a1e 295#define TODO_df_verify (1 << 18)
0d475361 296
b02b9b53 297/* Internally used for the first instance of a pass. */
a36b8a1e 298#define TODO_mark_first_instance (1 << 19)
b02b9b53 299
7b0e48fb 300/* Rebuild aliasing info. */
5006671f
RG
301#define TODO_rebuild_alias (1 << 20)
302
303/* Rebuild the addressable-vars bitmap and do register promotion. */
304#define TODO_update_address_taken (1 << 21)
7b0e48fb 305
4fe8e1a2 306/* Internally used in execute_function_todo(). */
0bca51f0
DN
307#define TODO_update_ssa_any \
308 (TODO_update_ssa \
309 | TODO_update_ssa_no_phi \
310 | TODO_update_ssa_full_phi \
311 | TODO_update_ssa_only_virtuals)
6de9cd9a
DN
312
313#define TODO_verify_all \
314 (TODO_verify_ssa | TODO_verify_flow | TODO_verify_stmts)
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{
328 struct opt_pass *pass; /* New pass to register. */
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
e21aff8a 337extern void tree_lowering_passes (tree decl);
b4861090 338
8ddbbcae
JH
339extern struct gimple_opt_pass pass_mudflap_1;
340extern struct gimple_opt_pass pass_mudflap_2;
8ddbbcae
JH
341extern struct gimple_opt_pass pass_lower_cf;
342extern struct gimple_opt_pass pass_refactor_eh;
343extern struct gimple_opt_pass pass_lower_eh;
1d65f45c
RH
344extern struct gimple_opt_pass pass_lower_eh_dispatch;
345extern struct gimple_opt_pass pass_lower_resx;
8ddbbcae
JH
346extern struct gimple_opt_pass pass_build_cfg;
347extern struct gimple_opt_pass pass_tree_profile;
348extern struct gimple_opt_pass pass_early_tree_profile;
349extern struct gimple_opt_pass pass_cleanup_cfg;
350extern struct gimple_opt_pass pass_referenced_vars;
a8da523f 351extern struct gimple_opt_pass pass_cleanup_eh;
6f1873a1 352extern struct gimple_opt_pass pass_fixup_cfg;
8ddbbcae
JH
353extern struct gimple_opt_pass pass_sra;
354extern struct gimple_opt_pass pass_sra_early;
07ffa034 355extern struct gimple_opt_pass pass_early_ipa_sra;
8ddbbcae
JH
356extern struct gimple_opt_pass pass_tail_recursion;
357extern struct gimple_opt_pass pass_tail_calls;
358extern struct gimple_opt_pass pass_tree_loop;
359extern struct gimple_opt_pass pass_tree_loop_init;
360extern struct gimple_opt_pass pass_lim;
361extern struct gimple_opt_pass pass_tree_unswitch;
362extern struct gimple_opt_pass pass_predcom;
363extern struct gimple_opt_pass pass_iv_canon;
364extern struct gimple_opt_pass pass_scev_cprop;
365extern struct gimple_opt_pass pass_empty_loop;
366extern struct gimple_opt_pass pass_record_bounds;
f8bf9252 367extern struct gimple_opt_pass pass_graphite_transforms;
8ddbbcae
JH
368extern struct gimple_opt_pass pass_if_conversion;
369extern struct gimple_opt_pass pass_loop_distribution;
370extern struct gimple_opt_pass pass_vectorize;
a70d6342 371extern struct gimple_opt_pass pass_slp_vectorize;
8ddbbcae 372extern struct gimple_opt_pass pass_complete_unroll;
d6e840ee 373extern struct gimple_opt_pass pass_complete_unrolli;
8ddbbcae
JH
374extern struct gimple_opt_pass pass_parallelize_loops;
375extern struct gimple_opt_pass pass_loop_prefetch;
376extern struct gimple_opt_pass pass_iv_optimize;
377extern struct gimple_opt_pass pass_tree_loop_done;
378extern struct gimple_opt_pass pass_ch;
379extern struct gimple_opt_pass pass_ccp;
380extern struct gimple_opt_pass pass_phi_only_cprop;
381extern struct gimple_opt_pass pass_build_ssa;
8ddbbcae 382extern struct gimple_opt_pass pass_build_alias;
6b8ed145 383extern struct gimple_opt_pass pass_build_ealias;
8ddbbcae
JH
384extern struct gimple_opt_pass pass_dominator;
385extern struct gimple_opt_pass pass_dce;
386extern struct gimple_opt_pass pass_dce_loop;
387extern struct gimple_opt_pass pass_cd_dce;
c2699190 388extern struct gimple_opt_pass pass_call_cdce;
8ddbbcae
JH
389extern struct gimple_opt_pass pass_merge_phi;
390extern struct gimple_opt_pass pass_split_crit_edges;
391extern struct gimple_opt_pass pass_pre;
392extern struct gimple_opt_pass pass_profile;
7299cb99 393extern struct gimple_opt_pass pass_strip_predict_hints;
8ddbbcae
JH
394extern struct gimple_opt_pass pass_lower_complex_O0;
395extern struct gimple_opt_pass pass_lower_complex;
396extern struct gimple_opt_pass pass_lower_vector;
397extern struct gimple_opt_pass pass_lower_vector_ssa;
398extern struct gimple_opt_pass pass_lower_omp;
a406865a 399extern struct gimple_opt_pass pass_diagnose_omp_blocks;
8ddbbcae
JH
400extern struct gimple_opt_pass pass_expand_omp;
401extern struct gimple_opt_pass pass_expand_omp_ssa;
402extern struct gimple_opt_pass pass_object_sizes;
403extern struct gimple_opt_pass pass_fold_builtins;
404extern struct gimple_opt_pass pass_stdarg;
405extern struct gimple_opt_pass pass_early_warn_uninitialized;
406extern struct gimple_opt_pass pass_late_warn_uninitialized;
407extern struct gimple_opt_pass pass_cse_reciprocals;
408extern struct gimple_opt_pass pass_cse_sincos;
03bd2f1a 409extern struct gimple_opt_pass pass_optimize_bswap;
8ddbbcae
JH
410extern struct gimple_opt_pass pass_warn_function_return;
411extern struct gimple_opt_pass pass_warn_function_noreturn;
412extern struct gimple_opt_pass pass_cselim;
413extern struct gimple_opt_pass pass_phiopt;
414extern struct gimple_opt_pass pass_forwprop;
415extern struct gimple_opt_pass pass_phiprop;
416extern struct gimple_opt_pass pass_tree_ifcombine;
417extern struct gimple_opt_pass pass_dse;
8ddbbcae 418extern struct gimple_opt_pass pass_nrv;
8ddbbcae 419extern struct gimple_opt_pass pass_rename_ssa_copies;
8ddbbcae
JH
420extern struct gimple_opt_pass pass_rest_of_compilation;
421extern struct gimple_opt_pass pass_sink_code;
422extern struct gimple_opt_pass pass_fre;
423extern struct gimple_opt_pass pass_linear_transform;
424extern struct gimple_opt_pass pass_check_data_deps;
425extern struct gimple_opt_pass pass_copy_prop;
8ddbbcae 426extern struct gimple_opt_pass pass_vrp;
8ddbbcae
JH
427extern struct gimple_opt_pass pass_uncprop;
428extern struct gimple_opt_pass pass_return_slot;
429extern struct gimple_opt_pass pass_reassoc;
430extern struct gimple_opt_pass pass_rebuild_cgraph_edges;
133f9369 431extern struct gimple_opt_pass pass_remove_cgraph_callee_edges;
8ddbbcae 432extern struct gimple_opt_pass pass_build_cgraph_edges;
33977f81 433extern struct gimple_opt_pass pass_local_pure_const;
5f39ad47 434extern struct gimple_opt_pass pass_tracer;
a406865a 435extern struct gimple_opt_pass pass_warn_unused_result;
6de9cd9a 436
012309e6 437/* IPA Passes */
d7f09764
DN
438extern struct simple_ipa_opt_pass pass_ipa_function_and_variable_visibility;
439extern struct simple_ipa_opt_pass pass_ipa_early_inline;
440
441extern struct simple_ipa_opt_pass pass_early_local_passes;
442
b20996ff 443extern struct ipa_opt_pass_d pass_ipa_whole_program_visibility;
d7f09764
DN
444extern struct ipa_opt_pass_d pass_ipa_lto_gimple_out;
445extern struct simple_ipa_opt_pass pass_ipa_increase_alignment;
446extern struct simple_ipa_opt_pass pass_ipa_matrix_reorg;
7e5487a2 447extern struct ipa_opt_pass_d pass_ipa_inline;
4537ec0c 448extern struct simple_ipa_opt_pass pass_ipa_free_lang_data;
7e5487a2
ILT
449extern struct ipa_opt_pass_d pass_ipa_cp;
450extern struct ipa_opt_pass_d pass_ipa_reference;
451extern struct ipa_opt_pass_d pass_ipa_pure_const;
8ddbbcae
JH
452extern struct simple_ipa_opt_pass pass_ipa_type_escape;
453extern struct simple_ipa_opt_pass pass_ipa_pta;
454extern struct simple_ipa_opt_pass pass_ipa_struct_reorg;
d7f09764
DN
455extern struct ipa_opt_pass_d pass_ipa_lto_wpa_fixup;
456extern struct ipa_opt_pass_d pass_ipa_lto_finish_out;
8ddbbcae
JH
457
458extern struct gimple_opt_pass pass_all_optimizations;
459extern struct gimple_opt_pass pass_cleanup_cfg_post_optimizing;
8ddbbcae
JH
460extern struct gimple_opt_pass pass_init_datastructures;
461extern struct gimple_opt_pass pass_fixup_cfg;
462
e3b5732b 463extern struct rtl_opt_pass pass_expand;
8ddbbcae
JH
464extern struct rtl_opt_pass pass_init_function;
465extern struct rtl_opt_pass pass_jump;
466extern struct rtl_opt_pass pass_rtl_eh;
467extern struct rtl_opt_pass pass_initial_value_sets;
468extern struct rtl_opt_pass pass_unshare_all_rtl;
469extern struct rtl_opt_pass pass_instantiate_virtual_regs;
470extern struct rtl_opt_pass pass_rtl_fwprop;
471extern struct rtl_opt_pass pass_rtl_fwprop_addr;
472extern struct rtl_opt_pass pass_jump2;
473extern struct rtl_opt_pass pass_lower_subreg;
474extern struct rtl_opt_pass pass_cse;
475extern struct rtl_opt_pass pass_fast_rtl_dce;
476extern struct rtl_opt_pass pass_ud_rtl_dce;
477extern struct rtl_opt_pass pass_rtl_dce;
478extern struct rtl_opt_pass pass_rtl_dse1;
479extern struct rtl_opt_pass pass_rtl_dse2;
480extern struct rtl_opt_pass pass_rtl_dse3;
5f39ad47
SB
481extern struct rtl_opt_pass pass_rtl_cprop;
482extern struct rtl_opt_pass pass_rtl_pre;
483extern struct rtl_opt_pass pass_rtl_hoist;
484extern struct rtl_opt_pass pass_rtl_store_motion;
485extern struct rtl_opt_pass pass_cse_after_global_opts;
8ddbbcae 486extern struct rtl_opt_pass pass_rtl_ifcvt;
8ddbbcae
JH
487
488extern struct rtl_opt_pass pass_into_cfg_layout_mode;
489extern struct rtl_opt_pass pass_outof_cfg_layout_mode;
490
491extern struct rtl_opt_pass pass_loop2;
492extern struct rtl_opt_pass pass_rtl_loop_init;
493extern struct rtl_opt_pass pass_rtl_move_loop_invariants;
494extern struct rtl_opt_pass pass_rtl_unswitch;
495extern struct rtl_opt_pass pass_rtl_unroll_and_peel_loops;
496extern struct rtl_opt_pass pass_rtl_doloop;
497extern struct rtl_opt_pass pass_rtl_loop_done;
498
499extern struct rtl_opt_pass pass_web;
500extern struct rtl_opt_pass pass_cse2;
501extern struct rtl_opt_pass pass_df_initialize_opt;
502extern struct rtl_opt_pass pass_df_initialize_no_opt;
2af2dbdc 503extern struct rtl_opt_pass pass_reginfo_init;
8ddbbcae
JH
504extern struct rtl_opt_pass pass_inc_dec;
505extern struct rtl_opt_pass pass_stack_ptr_mod;
506extern struct rtl_opt_pass pass_initialize_regs;
507extern struct rtl_opt_pass pass_combine;
508extern struct rtl_opt_pass pass_if_after_combine;
509extern struct rtl_opt_pass pass_partition_blocks;
510extern struct rtl_opt_pass pass_match_asm_constraints;
511extern struct rtl_opt_pass pass_regmove;
512extern struct rtl_opt_pass pass_split_all_insns;
cc806ac1 513extern struct rtl_opt_pass pass_fast_rtl_byte_dce;
8ddbbcae
JH
514extern struct rtl_opt_pass pass_lower_subreg2;
515extern struct rtl_opt_pass pass_mode_switching;
8ddbbcae
JH
516extern struct rtl_opt_pass pass_sms;
517extern struct rtl_opt_pass pass_sched;
058e97ec 518extern struct rtl_opt_pass pass_ira;
8ddbbcae
JH
519extern struct rtl_opt_pass pass_postreload;
520extern struct rtl_opt_pass pass_clean_state;
521extern struct rtl_opt_pass pass_branch_prob;
522extern struct rtl_opt_pass pass_value_profile_transformations;
523extern struct rtl_opt_pass pass_postreload_cse;
524extern struct rtl_opt_pass pass_gcse2;
525extern struct rtl_opt_pass pass_split_after_reload;
526extern struct rtl_opt_pass pass_branch_target_load_optimize1;
527extern struct rtl_opt_pass pass_thread_prologue_and_epilogue;
528extern struct rtl_opt_pass pass_stack_adjustments;
529extern struct rtl_opt_pass pass_peephole2;
530extern struct rtl_opt_pass pass_if_after_reload;
531extern struct rtl_opt_pass pass_regrename;
532extern struct rtl_opt_pass pass_cprop_hardreg;
533extern struct rtl_opt_pass pass_reorder_blocks;
534extern struct rtl_opt_pass pass_branch_target_load_optimize2;
535extern struct rtl_opt_pass pass_leaf_regs;
536extern struct rtl_opt_pass pass_split_before_sched2;
537extern struct rtl_opt_pass pass_sched2;
538extern struct rtl_opt_pass pass_stack_regs;
539extern struct rtl_opt_pass pass_stack_regs_run;
540extern struct rtl_opt_pass pass_df_finish;
541extern struct rtl_opt_pass pass_compute_alignments;
542extern struct rtl_opt_pass pass_duplicate_computed_gotos;
543extern struct rtl_opt_pass pass_variable_tracking;
544extern struct rtl_opt_pass pass_free_cfg;
545extern struct rtl_opt_pass pass_machine_reorg;
546extern struct rtl_opt_pass pass_cleanup_barriers;
547extern struct rtl_opt_pass pass_delay_slots;
548extern struct rtl_opt_pass pass_split_for_shorten_branches;
549extern struct rtl_opt_pass pass_split_before_regstack;
550extern struct rtl_opt_pass pass_convert_to_eh_region_ranges;
551extern struct rtl_opt_pass pass_shorten_branches;
552extern struct rtl_opt_pass pass_set_nothrow_function_flags;
553extern struct rtl_opt_pass pass_final;
554extern struct rtl_opt_pass pass_rtl_seqabstr;
555extern struct gimple_opt_pass pass_release_ssa_names;
556extern struct gimple_opt_pass pass_early_inline;
557extern struct gimple_opt_pass pass_inline_parameters;
8ddbbcae
JH
558extern struct gimple_opt_pass pass_all_early_optimizations;
559extern struct gimple_opt_pass pass_update_address_taken;
b6e99746 560extern struct gimple_opt_pass pass_convert_switch;
ef330312
PB
561
562/* The root of the compilation pass tree, once constructed. */
d7f09764
DN
563extern struct opt_pass *all_passes, *all_small_ipa_passes, *all_lowering_passes,
564 *all_regular_ipa_passes, *all_lto_gen_passes;
ef330312 565
2a5e9d16
JR
566/* Define a list of pass lists so that both passes.c and plugins can easily
567 find all the pass lists. */
568#define GCC_PASS_LISTS \
569 DEF_PASS_LIST (all_lowering_passes) \
570 DEF_PASS_LIST (all_small_ipa_passes) \
571 DEF_PASS_LIST (all_regular_ipa_passes) \
572 DEF_PASS_LIST (all_lto_gen_passes) \
573 DEF_PASS_LIST (all_passes)
574
575#define DEF_PASS_LIST(LIST) PASS_LIST_NO_##LIST,
576enum
577{
578 GCC_PASS_LISTS
579 PASS_LIST_NUM
580};
581#undef DEF_PASS_LIST
582
583/* This is used by plugins, and should also be used in
584 passes.c:register_pass. */
585extern struct opt_pass **gcc_pass_lists[];
586
9fe0cb7d
RG
587/* Current optimization pass. */
588extern struct opt_pass *current_pass;
589
590extern struct opt_pass * get_pass_for_id (int);
090fa0ab 591extern bool execute_one_pass (struct opt_pass *);
8ddbbcae
JH
592extern void execute_pass_list (struct opt_pass *);
593extern void execute_ipa_pass_list (struct opt_pass *);
d7f09764
DN
594extern void execute_ipa_summary_passes (struct ipa_opt_pass_d *);
595extern void execute_all_ipa_transforms (void);
2c5721d9 596extern void execute_all_ipa_stmt_fixups (struct cgraph_node *, gimple *);
090fa0ab
GF
597extern bool pass_init_dump_file (struct opt_pass *);
598extern void pass_fini_dump_file (struct opt_pass *);
d7f09764 599
090fa0ab 600extern const char *get_current_pass_name (void);
6fb5fa3c
DB
601extern void print_current_pass (FILE *);
602extern void debug_pass (void);
d7f09764
DN
603extern void ipa_write_summaries (void);
604extern void ipa_write_summaries_of_cgraph_node_set (
605 struct cgraph_node_set_def *);
606extern void ipa_read_summaries (void);
68a607d8 607extern void register_one_dump_file (struct opt_pass *);
33977f81 608extern bool function_called_by_processed_nodes_p (void);
b80b0fd9 609extern void register_pass (struct register_pass_info *);
b4861090 610
b02b9b53
ZD
611/* Set to true if the pass is called the first time during compilation of the
612 current function. Note that using this information in the optimization
613 passes is considered not to be clean, and it should be avoided if possible.
614 This flag is currently used to prevent loops from being peeled repeatedly
615 in jump threading; it will be removed once we preserve loop structures
616 throughout the compilation -- we will be able to mark the affected loops
617 directly in jump threading, and avoid peeling them next time. */
618extern bool first_pass_instance;
619
090fa0ab
GF
620/* Declare for plugins. */
621extern void do_per_function_toporder (void (*) (void *), void *);
622
6de9cd9a 623#endif /* GCC_TREE_PASS_H */