1 /* Description of pass structure
2 Copyright (C
) 1987-2013 Free Software Foundation
, Inc.
4 This file is part of GCC.
6 GCC is free software
; you can redistribute it and
/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation
; either version
3, or (at your option
) any later
11 GCC is distributed in the hope that it will be useful
, but WITHOUT ANY
12 WARRANTY
; without even the implied warranty of MERCHANTABILITY or
13 FITNESS
FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with GCC
; see the file COPYING3. If not see
18 <http
://www.gnu.org
/licenses
/>.
*/
21 Macros that should be defined when using this file
:
22 INSERT_PASSES_AFTER (PASS
)
23 PUSH_INSERT_PASSES_WITHIN (PASS
)
26 TERMINATE_PASS_LIST ()
29 /* All passes needed to lower the function into shape optimizers can
30 operate on. These passes are always run first on the function
, but
31 backend might produce already lowered functions that are not processed
33 INSERT_PASSES_AFTER (all_lowering_passes
)
34 NEXT_PASS (pass_warn_unused_result
);
35 NEXT_PASS (pass_diagnose_omp_blocks
);
36 NEXT_PASS (pass_diagnose_tm_blocks
);
37 NEXT_PASS (pass_mudflap_1
);
38 NEXT_PASS (pass_lower_omp
);
39 NEXT_PASS (pass_lower_cf
);
40 NEXT_PASS (pass_lower_tm
);
41 NEXT_PASS (pass_refactor_eh
);
42 NEXT_PASS (pass_lower_eh
);
43 NEXT_PASS (pass_build_cfg
);
44 NEXT_PASS (pass_warn_function_return
);
45 NEXT_PASS (pass_expand_omp
);
46 NEXT_PASS (pass_build_cgraph_edges
);
47 TERMINATE_PASS_LIST ()
49 /* Interprocedural optimization passes.
*/
50 INSERT_PASSES_AFTER (all_small_ipa_passes
)
51 NEXT_PASS (pass_ipa_free_lang_data
);
52 NEXT_PASS (pass_ipa_function_and_variable_visibility
);
53 NEXT_PASS (pass_early_local_passes
);
54 PUSH_INSERT_PASSES_WITHIN (pass_early_local_passes
)
55 NEXT_PASS (pass_fixup_cfg
);
56 NEXT_PASS (pass_init_datastructures
);
58 NEXT_PASS (pass_build_ssa
);
59 NEXT_PASS (pass_early_warn_uninitialized
);
60 NEXT_PASS (pass_rebuild_cgraph_edges
);
61 NEXT_PASS (pass_inline_parameters
);
62 NEXT_PASS (pass_early_inline
);
63 NEXT_PASS (pass_all_early_optimizations
);
64 PUSH_INSERT_PASSES_WITHIN (pass_all_early_optimizations
)
65 NEXT_PASS (pass_remove_cgraph_callee_edges
);
66 NEXT_PASS (pass_rename_ssa_copies
);
68 /* After CCP we rewrite no longer addressed locals into SSA
70 NEXT_PASS (pass_forwprop
);
71 /* pass_build_ealias is a dummy pass that ensures that we
72 execute TODO_rebuild_alias at this point.
*/
73 NEXT_PASS (pass_build_ealias
);
74 NEXT_PASS (pass_sra_early
);
76 NEXT_PASS (pass_copy_prop
);
77 NEXT_PASS (pass_merge_phi
);
78 NEXT_PASS (pass_cd_dce
);
79 NEXT_PASS (pass_early_ipa_sra
);
80 NEXT_PASS (pass_tail_recursion
);
81 NEXT_PASS (pass_convert_switch
);
82 NEXT_PASS (pass_cleanup_eh
);
83 NEXT_PASS (pass_profile
);
84 NEXT_PASS (pass_local_pure_const
);
85 /* Split functions creates parts that are not run through
86 early optimizations again. It is thus good idea to do this
88 NEXT_PASS (pass_split_functions
);
90 NEXT_PASS (pass_release_ssa_names
);
91 NEXT_PASS (pass_rebuild_cgraph_edges
);
92 NEXT_PASS (pass_inline_parameters
);
94 NEXT_PASS (pass_ipa_free_inline_summary
);
95 NEXT_PASS (pass_ipa_tree_profile
);
96 PUSH_INSERT_PASSES_WITHIN (pass_ipa_tree_profile
)
97 NEXT_PASS (pass_feedback_split_functions
);
99 NEXT_PASS (pass_ipa_increase_alignment
);
100 NEXT_PASS (pass_ipa_tm
);
101 NEXT_PASS (pass_ipa_lower_emutls
);
102 TERMINATE_PASS_LIST ()
104 INSERT_PASSES_AFTER (all_regular_ipa_passes
)
105 NEXT_PASS (pass_ipa_whole_program_visibility
);
106 NEXT_PASS (pass_ipa_profile
);
107 NEXT_PASS (pass_ipa_devirt
);
108 NEXT_PASS (pass_ipa_cp
);
109 NEXT_PASS (pass_ipa_cdtor_merge
);
110 NEXT_PASS (pass_ipa_inline
);
111 NEXT_PASS (pass_ipa_pure_const
);
112 NEXT_PASS (pass_ipa_reference
);
113 TERMINATE_PASS_LIST ()
115 INSERT_PASSES_AFTER (all_lto_gen_passes
)
116 NEXT_PASS (pass_ipa_lto_gimple_out
);
117 NEXT_PASS (pass_ipa_lto_finish_out
); /* This must be the last LTO pass.
*/
118 TERMINATE_PASS_LIST ()
120 /* Simple IPA passes executed after the regular passes. In WHOPR mode the
121 passes are executed after partitioning and thus see just parts of the
123 INSERT_PASSES_AFTER (all_late_ipa_passes
)
124 NEXT_PASS (pass_ipa_pta
);
125 TERMINATE_PASS_LIST ()
127 /* These passes are run after IPA passes on every function that is being
128 output to the assembler file.
*/
129 INSERT_PASSES_AFTER (all_passes
)
130 NEXT_PASS (pass_lower_eh_dispatch
);
131 NEXT_PASS (pass_all_optimizations
);
132 PUSH_INSERT_PASSES_WITHIN (pass_all_optimizations
)
133 NEXT_PASS (pass_remove_cgraph_callee_edges
);
134 /* Initial scalar cleanups before alias computation.
135 They ensure memory accesses are not indirect wherever possible.
*/
136 NEXT_PASS (pass_strip_predict_hints
);
137 NEXT_PASS (pass_rename_ssa_copies
);
138 NEXT_PASS (pass_copy_prop
);
139 NEXT_PASS (pass_complete_unrolli
);
140 NEXT_PASS (pass_ccp
);
141 /* After CCP we rewrite no longer addressed locals into SSA
143 NEXT_PASS (pass_phiprop
);
144 NEXT_PASS (pass_forwprop
);
145 /* pass_build_alias is a dummy pass that ensures that we
146 execute TODO_rebuild_alias at this point.
*/
147 NEXT_PASS (pass_build_alias
);
148 NEXT_PASS (pass_return_slot
);
149 NEXT_PASS (pass_fre
);
150 NEXT_PASS (pass_copy_prop
);
151 NEXT_PASS (pass_merge_phi
);
152 NEXT_PASS (pass_vrp
);
153 NEXT_PASS (pass_dce
);
154 NEXT_PASS (pass_call_cdce
);
155 NEXT_PASS (pass_cselim
);
156 NEXT_PASS (pass_tree_ifcombine
);
157 NEXT_PASS (pass_phiopt
);
158 NEXT_PASS (pass_tail_recursion
);
160 NEXT_PASS (pass_stdarg
);
161 NEXT_PASS (pass_lower_complex
);
162 NEXT_PASS (pass_sra
);
163 NEXT_PASS (pass_rename_ssa_copies
);
164 /* The dom pass will also resolve all __builtin_constant_p calls
165 that are still there to
0. This has to be done after some
166 propagations have already run
, but before some more dead code
167 is removed
, and this place fits nicely. Remember this when
168 trying to move or duplicate pass_dominator somewhere earlier.
*/
169 NEXT_PASS (pass_dominator
);
170 /* The only const
/copy propagation opportunities left after
171 DOM should be due to degenerate PHI nodes. So rather than
172 run the full propagators
, run a specialized pass which
173 only examines PHIs to discover const
/copy propagation
175 NEXT_PASS (pass_phi_only_cprop
);
176 NEXT_PASS (pass_dse
);
177 NEXT_PASS (pass_reassoc
);
178 NEXT_PASS (pass_dce
);
179 NEXT_PASS (pass_forwprop
);
180 NEXT_PASS (pass_phiopt
);
181 NEXT_PASS (pass_object_sizes
);
182 NEXT_PASS (pass_strlen
);
183 NEXT_PASS (pass_ccp
);
184 /* After CCP we rewrite no longer addressed locals into SSA
186 NEXT_PASS (pass_copy_prop
);
187 NEXT_PASS (pass_cse_sincos
);
188 NEXT_PASS (pass_optimize_bswap
);
189 NEXT_PASS (pass_split_crit_edges
);
190 NEXT_PASS (pass_pre
);
191 NEXT_PASS (pass_sink_code
);
192 NEXT_PASS (pass_asan
);
193 NEXT_PASS (pass_tsan
);
194 NEXT_PASS (pass_tree_loop
);
195 PUSH_INSERT_PASSES_WITHIN (pass_tree_loop
)
196 NEXT_PASS (pass_tree_loop_init
);
197 NEXT_PASS (pass_lim
);
198 NEXT_PASS (pass_copy_prop
);
199 NEXT_PASS (pass_dce_loop
);
200 NEXT_PASS (pass_tree_unswitch
);
201 NEXT_PASS (pass_scev_cprop
);
202 NEXT_PASS (pass_record_bounds
);
203 NEXT_PASS (pass_check_data_deps
);
204 NEXT_PASS (pass_loop_distribution
);
205 NEXT_PASS (pass_copy_prop
);
206 NEXT_PASS (pass_graphite
);
207 PUSH_INSERT_PASSES_WITHIN (pass_graphite
)
208 NEXT_PASS (pass_graphite_transforms
);
209 NEXT_PASS (pass_lim
);
210 NEXT_PASS (pass_copy_prop
);
211 NEXT_PASS (pass_dce_loop
);
213 NEXT_PASS (pass_iv_canon
);
214 NEXT_PASS (pass_parallelize_loops
);
215 NEXT_PASS (pass_if_conversion
);
216 NEXT_PASS (pass_vectorize
);
217 PUSH_INSERT_PASSES_WITHIN (pass_vectorize
)
218 NEXT_PASS (pass_dce_loop
);
220 NEXT_PASS (pass_predcom
);
221 NEXT_PASS (pass_complete_unroll
);
222 NEXT_PASS (pass_slp_vectorize
);
223 NEXT_PASS (pass_loop_prefetch
);
224 NEXT_PASS (pass_iv_optimize
);
225 NEXT_PASS (pass_lim
);
226 NEXT_PASS (pass_tree_loop_done
);
228 NEXT_PASS (pass_lower_vector_ssa
);
229 NEXT_PASS (pass_cse_reciprocals
);
230 NEXT_PASS (pass_reassoc
);
231 NEXT_PASS (pass_strength_reduction
);
232 NEXT_PASS (pass_dominator
);
233 /* The only const
/copy propagation opportunities left after
234 DOM should be due to degenerate PHI nodes. So rather than
235 run the full propagators
, run a specialized pass which
236 only examines PHIs to discover const
/copy propagation
238 NEXT_PASS (pass_phi_only_cprop
);
239 NEXT_PASS (pass_vrp
);
240 NEXT_PASS (pass_cd_dce
);
241 NEXT_PASS (pass_tracer
);
242 NEXT_PASS (pass_dse
);
243 NEXT_PASS (pass_forwprop
);
244 NEXT_PASS (pass_phiopt
);
245 NEXT_PASS (pass_fold_builtins
);
246 NEXT_PASS (pass_optimize_widening_mul
);
247 NEXT_PASS (pass_tail_calls
);
248 NEXT_PASS (pass_rename_ssa_copies
);
249 /* FIXME
: If DCE is not run before checking for uninitialized uses
,
250 we may get false
warnings (e.g.
, testsuite
/gcc.dg
/uninit
-5.c
).
251 However
, this also causes us to misdiagnose cases that should be
252 real
warnings (e.g.
, testsuite
/gcc.dg
/pr18501.c
).
254 To fix the false positives in uninit
-5.c
, we would have to
255 account for the predicates protecting the set and the use of each
256 variable. Using a representation like Gated Single Assignment
258 /* Split critical edges before late uninit warning to reduce the
259 number of false positives from it.
*/
260 NEXT_PASS (pass_split_crit_edges
);
261 NEXT_PASS (pass_late_warn_uninitialized
);
262 NEXT_PASS (pass_uncprop
);
263 NEXT_PASS (pass_local_pure_const
);
265 NEXT_PASS (pass_all_optimizations_g
);
266 PUSH_INSERT_PASSES_WITHIN (pass_all_optimizations_g
)
267 NEXT_PASS (pass_remove_cgraph_callee_edges
);
268 NEXT_PASS (pass_strip_predict_hints
);
269 /* Lower remaining pieces of GIMPLE.
*/
270 NEXT_PASS (pass_lower_complex
);
271 NEXT_PASS (pass_lower_vector_ssa
);
272 /* Perform simple scalar cleanup which is constant
/copy propagation.
*/
273 NEXT_PASS (pass_ccp
);
274 NEXT_PASS (pass_object_sizes
);
275 /* Fold remaining builtins.
*/
276 NEXT_PASS (pass_fold_builtins
);
277 /* Copy propagation also copy
-propagates constants
, this is necessary
278 to forward object
-size and builtin folding results properly.
*/
279 NEXT_PASS (pass_copy_prop
);
280 NEXT_PASS (pass_dce
);
281 NEXT_PASS (pass_asan
);
282 NEXT_PASS (pass_tsan
);
283 NEXT_PASS (pass_rename_ssa_copies
);
284 /* ??? We do want some kind of loop invariant motion
, but we possibly
285 need to adjust LIM to be more friendly towards preserving accurate
286 debug information here.
*/
287 /* Split critical edges before late uninit warning to reduce the
288 number of false positives from it.
*/
289 NEXT_PASS (pass_split_crit_edges
);
290 NEXT_PASS (pass_late_warn_uninitialized
);
291 NEXT_PASS (pass_uncprop
);
292 NEXT_PASS (pass_local_pure_const
);
294 NEXT_PASS (pass_tm_init
);
295 PUSH_INSERT_PASSES_WITHIN (pass_tm_init
)
296 NEXT_PASS (pass_tm_mark
);
297 NEXT_PASS (pass_tm_memopt
);
298 NEXT_PASS (pass_tm_edges
);
300 NEXT_PASS (pass_vtable_verify
);
301 NEXT_PASS (pass_lower_vector
);
302 NEXT_PASS (pass_lower_complex_O0
);
303 NEXT_PASS (pass_asan_O0
);
304 NEXT_PASS (pass_tsan_O0
);
305 NEXT_PASS (pass_cleanup_eh
);
306 NEXT_PASS (pass_lower_resx
);
307 NEXT_PASS (pass_nrv
);
308 NEXT_PASS (pass_mudflap_2
);
309 NEXT_PASS (pass_cleanup_cfg_post_optimizing
);
310 NEXT_PASS (pass_warn_function_noreturn
);
312 NEXT_PASS (pass_expand
);
314 NEXT_PASS (pass_rest_of_compilation
);
315 PUSH_INSERT_PASSES_WITHIN (pass_rest_of_compilation
)
316 NEXT_PASS (pass_instantiate_virtual_regs
);
317 NEXT_PASS (pass_into_cfg_layout_mode
);
318 NEXT_PASS (pass_jump
);
319 NEXT_PASS (pass_lower_subreg
);
320 NEXT_PASS (pass_df_initialize_opt
);
321 NEXT_PASS (pass_cse
);
322 NEXT_PASS (pass_rtl_fwprop
);
323 NEXT_PASS (pass_rtl_cprop
);
324 NEXT_PASS (pass_rtl_pre
);
325 NEXT_PASS (pass_rtl_hoist
);
326 NEXT_PASS (pass_rtl_cprop
);
327 NEXT_PASS (pass_rtl_store_motion
);
328 NEXT_PASS (pass_cse_after_global_opts
);
329 NEXT_PASS (pass_rtl_ifcvt
);
330 NEXT_PASS (pass_reginfo_init
);
331 /* Perform loop optimizations. It might be better to do them a bit
332 sooner
, but we want the profile feedback to work more
334 NEXT_PASS (pass_loop2
);
335 PUSH_INSERT_PASSES_WITHIN (pass_loop2
)
336 NEXT_PASS (pass_rtl_loop_init
);
337 NEXT_PASS (pass_rtl_move_loop_invariants
);
338 NEXT_PASS (pass_rtl_unswitch
);
339 NEXT_PASS (pass_rtl_unroll_and_peel_loops
);
340 NEXT_PASS (pass_rtl_doloop
);
341 NEXT_PASS (pass_rtl_loop_done
);
342 TERMINATE_PASS_LIST ()
344 NEXT_PASS (pass_web
);
345 NEXT_PASS (pass_rtl_cprop
);
346 NEXT_PASS (pass_cse2
);
347 NEXT_PASS (pass_rtl_dse1
);
348 NEXT_PASS (pass_rtl_fwprop_addr
);
349 NEXT_PASS (pass_inc_dec
);
350 NEXT_PASS (pass_initialize_regs
);
351 NEXT_PASS (pass_ud_rtl_dce
);
352 NEXT_PASS (pass_combine
);
353 NEXT_PASS (pass_if_after_combine
);
354 NEXT_PASS (pass_partition_blocks
);
355 NEXT_PASS (pass_regmove
);
356 NEXT_PASS (pass_outof_cfg_layout_mode
);
357 NEXT_PASS (pass_split_all_insns
);
358 NEXT_PASS (pass_lower_subreg2
);
359 NEXT_PASS (pass_df_initialize_no_opt
);
360 NEXT_PASS (pass_stack_ptr_mod
);
361 NEXT_PASS (pass_mode_switching
);
362 NEXT_PASS (pass_match_asm_constraints
);
363 NEXT_PASS (pass_sms
);
364 NEXT_PASS (pass_sched
);
365 NEXT_PASS (pass_ira
);
366 NEXT_PASS (pass_reload
);
367 NEXT_PASS (pass_postreload
);
368 PUSH_INSERT_PASSES_WITHIN (pass_postreload
)
369 NEXT_PASS (pass_postreload_cse
);
370 NEXT_PASS (pass_gcse2
);
371 NEXT_PASS (pass_split_after_reload
);
372 NEXT_PASS (pass_ree
);
373 NEXT_PASS (pass_compare_elim_after_reload
);
374 NEXT_PASS (pass_branch_target_load_optimize1
);
375 NEXT_PASS (pass_thread_prologue_and_epilogue
);
376 NEXT_PASS (pass_rtl_dse2
);
377 NEXT_PASS (pass_stack_adjustments
);
378 NEXT_PASS (pass_jump2
);
379 NEXT_PASS (pass_peephole2
);
380 NEXT_PASS (pass_if_after_reload
);
381 NEXT_PASS (pass_regrename
);
382 NEXT_PASS (pass_cprop_hardreg
);
383 NEXT_PASS (pass_fast_rtl_dce
);
384 NEXT_PASS (pass_reorder_blocks
);
385 NEXT_PASS (pass_branch_target_load_optimize2
);
386 NEXT_PASS (pass_leaf_regs
);
387 NEXT_PASS (pass_split_before_sched2
);
388 NEXT_PASS (pass_sched2
);
389 NEXT_PASS (pass_stack_regs
);
390 PUSH_INSERT_PASSES_WITHIN (pass_stack_regs
)
391 NEXT_PASS (pass_split_before_regstack
);
392 NEXT_PASS (pass_stack_regs_run
);
394 NEXT_PASS (pass_compute_alignments
);
395 NEXT_PASS (pass_duplicate_computed_gotos
);
396 NEXT_PASS (pass_variable_tracking
);
397 NEXT_PASS (pass_free_cfg
);
398 NEXT_PASS (pass_machine_reorg
);
399 NEXT_PASS (pass_cleanup_barriers
);
400 NEXT_PASS (pass_delay_slots
);
401 NEXT_PASS (pass_split_for_shorten_branches
);
402 NEXT_PASS (pass_convert_to_eh_region_ranges
);
403 NEXT_PASS (pass_shorten_branches
);
404 NEXT_PASS (pass_set_nothrow_function_flags
);
405 NEXT_PASS (pass_dwarf2_frame
);
406 NEXT_PASS (pass_final
);
408 NEXT_PASS (pass_df_finish
);
410 NEXT_PASS (pass_clean_state
);
411 TERMINATE_PASS_LIST ()