]>
Commit | Line | Data |
---|---|---|
ca4be2a0 | 1 | /* Description of pass structure |
fbd26352 | 2 | Copyright (C) 1987-2019 Free Software Foundation, Inc. |
ca4be2a0 | 3 | |
4 | This file is part of GCC. | |
5 | ||
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 | |
9 | version. | |
10 | ||
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 | |
14 | for more details. | |
15 | ||
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/>. */ | |
19 | ||
20 | /* | |
21 | Macros that should be defined when using this file: | |
22 | INSERT_PASSES_AFTER (PASS) | |
23 | PUSH_INSERT_PASSES_WITHIN (PASS) | |
24 | POP_INSERT_PASSES () | |
25 | NEXT_PASS (PASS) | |
fff44d9f | 26 | TERMINATE_PASS_LIST (PASS) |
ca4be2a0 | 27 | */ |
28 | ||
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 | |
32 | by these passes. */ | |
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); | |
ca4be2a0 | 37 | NEXT_PASS (pass_lower_omp); |
38 | NEXT_PASS (pass_lower_cf); | |
39 | NEXT_PASS (pass_lower_tm); | |
40 | NEXT_PASS (pass_refactor_eh); | |
41 | NEXT_PASS (pass_lower_eh); | |
42 | NEXT_PASS (pass_build_cfg); | |
43 | NEXT_PASS (pass_warn_function_return); | |
44 | NEXT_PASS (pass_expand_omp); | |
b9833bfd | 45 | NEXT_PASS (pass_sprintf_length, false); |
da6cf191 | 46 | NEXT_PASS (pass_walloca, /*strict_mode_p=*/true); |
b13f363a | 47 | NEXT_PASS (pass_build_cgraph_edges); |
fff44d9f | 48 | TERMINATE_PASS_LIST (all_lowering_passes) |
ca4be2a0 | 49 | |
50 | /* Interprocedural optimization passes. */ | |
51 | INSERT_PASSES_AFTER (all_small_ipa_passes) | |
52 | NEXT_PASS (pass_ipa_free_lang_data); | |
53 | NEXT_PASS (pass_ipa_function_and_variable_visibility); | |
058a1b7a | 54 | NEXT_PASS (pass_build_ssa_passes); |
55 | PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes) | |
ca4be2a0 | 56 | NEXT_PASS (pass_fixup_cfg); |
ca4be2a0 | 57 | NEXT_PASS (pass_build_ssa); |
7675e968 | 58 | NEXT_PASS (pass_warn_nonnull_compare); |
ca4be2a0 | 59 | NEXT_PASS (pass_early_warn_uninitialized); |
cd3f735a | 60 | NEXT_PASS (pass_ubsan); |
73594827 | 61 | NEXT_PASS (pass_nothrow); |
d94b0edf | 62 | NEXT_PASS (pass_rebuild_cgraph_edges); |
058a1b7a | 63 | POP_INSERT_PASSES () |
64 | ||
058a1b7a | 65 | NEXT_PASS (pass_local_optimization_passes); |
66 | PUSH_INSERT_PASSES_WITHIN (pass_local_optimization_passes) | |
67 | NEXT_PASS (pass_fixup_cfg); | |
ca4be2a0 | 68 | NEXT_PASS (pass_rebuild_cgraph_edges); |
a2da7d8a | 69 | NEXT_PASS (pass_local_fn_summary); |
ca4be2a0 | 70 | NEXT_PASS (pass_early_inline); |
71 | NEXT_PASS (pass_all_early_optimizations); | |
72 | PUSH_INSERT_PASSES_WITHIN (pass_all_early_optimizations) | |
73 | NEXT_PASS (pass_remove_cgraph_callee_edges); | |
0bb8a43b | 74 | NEXT_PASS (pass_object_sizes, true /* insert_min_max_p */); |
d0322b7d | 75 | /* Don't record nonzero bits before IPA to avoid |
76 | using too much memory. */ | |
77 | NEXT_PASS (pass_ccp, false /* nonzero_p */); | |
ca4be2a0 | 78 | /* After CCP we rewrite no longer addressed locals into SSA |
79 | form if possible. */ | |
80 | NEXT_PASS (pass_forwprop); | |
a18b7a33 | 81 | NEXT_PASS (pass_early_thread_jumps); |
41f94d6c | 82 | NEXT_PASS (pass_sra_early); |
ca4be2a0 | 83 | /* pass_build_ealias is a dummy pass that ensures that we |
84 | execute TODO_rebuild_alias at this point. */ | |
85 | NEXT_PASS (pass_build_ealias); | |
ee5b48dc | 86 | NEXT_PASS (pass_fre, true /* may_iterate */); |
6e93da1b | 87 | NEXT_PASS (pass_early_vrp); |
ca4be2a0 | 88 | NEXT_PASS (pass_merge_phi); |
23db877c | 89 | NEXT_PASS (pass_dse); |
ca4be2a0 | 90 | NEXT_PASS (pass_cd_dce); |
a2c2432d | 91 | NEXT_PASS (pass_phiopt, true /* early_p */); |
ca4be2a0 | 92 | NEXT_PASS (pass_early_ipa_sra); |
93 | NEXT_PASS (pass_tail_recursion); | |
94 | NEXT_PASS (pass_convert_switch); | |
058a1b7a | 95 | NEXT_PASS (pass_cleanup_eh); |
96 | NEXT_PASS (pass_profile); | |
97 | NEXT_PASS (pass_local_pure_const); | |
ca4be2a0 | 98 | /* Split functions creates parts that are not run through |
99 | early optimizations again. It is thus good idea to do this | |
058a1b7a | 100 | late. */ |
101 | NEXT_PASS (pass_split_functions); | |
c03de6c9 | 102 | NEXT_PASS (pass_strip_predict_hints, true /* early_p */); |
ca4be2a0 | 103 | POP_INSERT_PASSES () |
104 | NEXT_PASS (pass_release_ssa_names); | |
105 | NEXT_PASS (pass_rebuild_cgraph_edges); | |
a2da7d8a | 106 | NEXT_PASS (pass_local_fn_summary); |
ca4be2a0 | 107 | POP_INSERT_PASSES () |
f71e6ee5 | 108 | |
9da914af | 109 | NEXT_PASS (pass_ipa_remove_symbols); |
f71e6ee5 | 110 | NEXT_PASS (pass_ipa_oacc); |
111 | PUSH_INSERT_PASSES_WITHIN (pass_ipa_oacc) | |
112 | NEXT_PASS (pass_ipa_pta); | |
113 | /* Pass group that runs when the function is an offloaded function | |
114 | containing oacc kernels loops. */ | |
115 | NEXT_PASS (pass_ipa_oacc_kernels); | |
116 | PUSH_INSERT_PASSES_WITHIN (pass_ipa_oacc_kernels) | |
117 | NEXT_PASS (pass_oacc_kernels); | |
118 | PUSH_INSERT_PASSES_WITHIN (pass_oacc_kernels) | |
119 | NEXT_PASS (pass_ch); | |
ee5b48dc | 120 | NEXT_PASS (pass_fre, true /* may_iterate */); |
f71e6ee5 | 121 | /* We use pass_lim to rewrite in-memory iteration and reduction |
122 | variable accesses in loops into local variables accesses. */ | |
123 | NEXT_PASS (pass_lim); | |
124 | NEXT_PASS (pass_dominator, false /* may_peel_loop_headers_p */); | |
125 | NEXT_PASS (pass_dce); | |
22e3dcee | 126 | NEXT_PASS (pass_parallelize_loops, true /* oacc_kernels_p */); |
f71e6ee5 | 127 | NEXT_PASS (pass_expand_omp_ssa); |
128 | NEXT_PASS (pass_rebuild_cgraph_edges); | |
129 | POP_INSERT_PASSES () | |
130 | POP_INSERT_PASSES () | |
131 | POP_INSERT_PASSES () | |
132 | ||
4c1ced11 | 133 | NEXT_PASS (pass_target_clone); |
94bed7c3 | 134 | NEXT_PASS (pass_ipa_auto_profile); |
ca4be2a0 | 135 | NEXT_PASS (pass_ipa_tree_profile); |
136 | PUSH_INSERT_PASSES_WITHIN (pass_ipa_tree_profile) | |
137 | NEXT_PASS (pass_feedback_split_functions); | |
138 | POP_INSERT_PASSES () | |
369c9a01 | 139 | NEXT_PASS (pass_ipa_free_fn_summary, true /* small_p */); |
ca4be2a0 | 140 | NEXT_PASS (pass_ipa_increase_alignment); |
141 | NEXT_PASS (pass_ipa_tm); | |
142 | NEXT_PASS (pass_ipa_lower_emutls); | |
fff44d9f | 143 | TERMINATE_PASS_LIST (all_small_ipa_passes) |
ca4be2a0 | 144 | |
145 | INSERT_PASSES_AFTER (all_regular_ipa_passes) | |
146 | NEXT_PASS (pass_ipa_whole_program_visibility); | |
147 | NEXT_PASS (pass_ipa_profile); | |
52200d03 | 148 | NEXT_PASS (pass_ipa_icf); |
84f6cc40 | 149 | NEXT_PASS (pass_ipa_devirt); |
ca4be2a0 | 150 | NEXT_PASS (pass_ipa_cp); |
151 | NEXT_PASS (pass_ipa_cdtor_merge); | |
56686608 | 152 | NEXT_PASS (pass_ipa_hsa); |
a2da7d8a | 153 | NEXT_PASS (pass_ipa_fn_summary); |
ca4be2a0 | 154 | NEXT_PASS (pass_ipa_inline); |
155 | NEXT_PASS (pass_ipa_pure_const); | |
369c9a01 | 156 | NEXT_PASS (pass_ipa_free_fn_summary, false /* small_p */); |
ca4be2a0 | 157 | NEXT_PASS (pass_ipa_reference); |
3f1f2be0 | 158 | /* This pass needs to be scheduled after any IP code duplication. */ |
159 | NEXT_PASS (pass_ipa_single_use); | |
cf8b23bb | 160 | /* Comdat privatization come last, as direct references to comdat local |
161 | symbols are not allowed outside of the comdat group. Privatizing early | |
162 | would result in missed optimizations due to this restriction. */ | |
163 | NEXT_PASS (pass_ipa_comdats); | |
fff44d9f | 164 | TERMINATE_PASS_LIST (all_regular_ipa_passes) |
ca4be2a0 | 165 | |
ca4be2a0 | 166 | /* Simple IPA passes executed after the regular passes. In WHOPR mode the |
167 | passes are executed after partitioning and thus see just parts of the | |
168 | compiled unit. */ | |
169 | INSERT_PASSES_AFTER (all_late_ipa_passes) | |
b35a87b1 | 170 | NEXT_PASS (pass_materialize_all_clones); |
ca4be2a0 | 171 | NEXT_PASS (pass_ipa_pta); |
d09768a4 | 172 | NEXT_PASS (pass_omp_simd_clone); |
fff44d9f | 173 | TERMINATE_PASS_LIST (all_late_ipa_passes) |
ca4be2a0 | 174 | |
175 | /* These passes are run after IPA passes on every function that is being | |
176 | output to the assembler file. */ | |
177 | INSERT_PASSES_AFTER (all_passes) | |
f34e160b | 178 | NEXT_PASS (pass_fixup_cfg); |
ca4be2a0 | 179 | NEXT_PASS (pass_lower_eh_dispatch); |
0bb0f256 | 180 | NEXT_PASS (pass_oacc_device_lower); |
bab6706a | 181 | NEXT_PASS (pass_omp_device_lower); |
c0998828 | 182 | NEXT_PASS (pass_omp_target_link); |
ca4be2a0 | 183 | NEXT_PASS (pass_all_optimizations); |
184 | PUSH_INSERT_PASSES_WITHIN (pass_all_optimizations) | |
185 | NEXT_PASS (pass_remove_cgraph_callee_edges); | |
186 | /* Initial scalar cleanups before alias computation. | |
187 | They ensure memory accesses are not indirect wherever possible. */ | |
c03de6c9 | 188 | NEXT_PASS (pass_strip_predict_hints, false /* early_p */); |
d0322b7d | 189 | NEXT_PASS (pass_ccp, true /* nonzero_p */); |
184fac50 | 190 | NEXT_PASS (pass_post_ipa_warn); |
ca4be2a0 | 191 | /* After CCP we rewrite no longer addressed locals into SSA |
192 | form if possible. */ | |
b2e502cd | 193 | NEXT_PASS (pass_complete_unrolli); |
7fc2f613 | 194 | NEXT_PASS (pass_backprop); |
ca4be2a0 | 195 | NEXT_PASS (pass_phiprop); |
196 | NEXT_PASS (pass_forwprop); | |
0bb8a43b | 197 | NEXT_PASS (pass_object_sizes, false /* insert_min_max_p */); |
ca4be2a0 | 198 | /* pass_build_alias is a dummy pass that ensures that we |
199 | execute TODO_rebuild_alias at this point. */ | |
200 | NEXT_PASS (pass_build_alias); | |
201 | NEXT_PASS (pass_return_slot); | |
ee5b48dc | 202 | NEXT_PASS (pass_fre, true /* may_iterate */); |
ca4be2a0 | 203 | NEXT_PASS (pass_merge_phi); |
372172fe | 204 | NEXT_PASS (pass_thread_jumps); |
bc179819 | 205 | NEXT_PASS (pass_vrp, true /* warn_array_bounds_p */); |
ca4be2a0 | 206 | NEXT_PASS (pass_dce); |
379c7683 | 207 | NEXT_PASS (pass_stdarg); |
ca4be2a0 | 208 | NEXT_PASS (pass_call_cdce); |
209 | NEXT_PASS (pass_cselim); | |
5f4d66ea | 210 | NEXT_PASS (pass_copy_prop); |
ca4be2a0 | 211 | NEXT_PASS (pass_tree_ifcombine); |
cce09224 | 212 | NEXT_PASS (pass_merge_phi); |
a2c2432d | 213 | NEXT_PASS (pass_phiopt, false /* early_p */); |
ca4be2a0 | 214 | NEXT_PASS (pass_tail_recursion); |
215 | NEXT_PASS (pass_ch); | |
ca4be2a0 | 216 | NEXT_PASS (pass_lower_complex); |
217 | NEXT_PASS (pass_sra); | |
ca4be2a0 | 218 | /* The dom pass will also resolve all __builtin_constant_p calls |
219 | that are still there to 0. This has to be done after some | |
220 | propagations have already run, but before some more dead code | |
221 | is removed, and this place fits nicely. Remember this when | |
222 | trying to move or duplicate pass_dominator somewhere earlier. */ | |
372172fe | 223 | NEXT_PASS (pass_thread_jumps); |
3279ea23 | 224 | NEXT_PASS (pass_dominator, true /* may_peel_loop_headers_p */); |
0eee1ea0 | 225 | /* Threading can leave many const/copy propagations in the IL. |
226 | Clean them up. Failure to do so well can lead to false | |
227 | positives from warnings for erroneous code. */ | |
228 | NEXT_PASS (pass_copy_prop); | |
229 | /* Identify paths that should never be executed in a conforming | |
230 | program and isolate those paths. */ | |
db242b6d | 231 | NEXT_PASS (pass_isolate_erroneous_paths); |
ca4be2a0 | 232 | NEXT_PASS (pass_dse); |
83505659 | 233 | NEXT_PASS (pass_reassoc, true /* insert_powi_p */); |
ca4be2a0 | 234 | NEXT_PASS (pass_dce); |
235 | NEXT_PASS (pass_forwprop); | |
a2c2432d | 236 | NEXT_PASS (pass_phiopt, false /* early_p */); |
d0322b7d | 237 | NEXT_PASS (pass_ccp, true /* nonzero_p */); |
ca4be2a0 | 238 | /* After CCP we rewrite no longer addressed locals into SSA |
239 | form if possible. */ | |
ca4be2a0 | 240 | NEXT_PASS (pass_cse_sincos); |
241 | NEXT_PASS (pass_optimize_bswap); | |
07d294f7 | 242 | NEXT_PASS (pass_laddress); |
410372fe | 243 | NEXT_PASS (pass_lim); |
da6cf191 | 244 | NEXT_PASS (pass_walloca, false); |
ca4be2a0 | 245 | NEXT_PASS (pass_pre); |
246 | NEXT_PASS (pass_sink_code); | |
d29e939c | 247 | NEXT_PASS (pass_sancov); |
ca4be2a0 | 248 | NEXT_PASS (pass_asan); |
249 | NEXT_PASS (pass_tsan); | |
410372fe | 250 | NEXT_PASS (pass_dce); |
ef3f2b6f | 251 | /* Pass group that runs when 1) enabled, 2) there are loops |
bf8e217d | 252 | in the function. Make sure to run pass_fix_loops before |
253 | to discover/remove loops before running the gate function | |
254 | of pass_tree_loop. */ | |
255 | NEXT_PASS (pass_fix_loops); | |
ca4be2a0 | 256 | NEXT_PASS (pass_tree_loop); |
257 | PUSH_INSERT_PASSES_WITHIN (pass_tree_loop) | |
5bf29a97 | 258 | /* Before loop_init we rewrite no longer addressed locals into SSA |
259 | form if possible. */ | |
ca4be2a0 | 260 | NEXT_PASS (pass_tree_loop_init); |
ca4be2a0 | 261 | NEXT_PASS (pass_tree_unswitch); |
262 | NEXT_PASS (pass_scev_cprop); | |
92a2a716 | 263 | NEXT_PASS (pass_loop_split); |
9435b515 | 264 | NEXT_PASS (pass_loop_versioning); |
baf1c4a6 | 265 | NEXT_PASS (pass_loop_jam); |
b1759f48 | 266 | /* All unswitching, final value replacement and splitting can expose |
267 | empty loops. Remove them now. */ | |
268 | NEXT_PASS (pass_cd_dce); | |
9a3a6fd9 | 269 | NEXT_PASS (pass_iv_canon); |
ca4be2a0 | 270 | NEXT_PASS (pass_loop_distribution); |
5051abaf | 271 | NEXT_PASS (pass_linterchange); |
ca4be2a0 | 272 | NEXT_PASS (pass_copy_prop); |
273 | NEXT_PASS (pass_graphite); | |
274 | PUSH_INSERT_PASSES_WITHIN (pass_graphite) | |
275 | NEXT_PASS (pass_graphite_transforms); | |
276 | NEXT_PASS (pass_lim); | |
277 | NEXT_PASS (pass_copy_prop); | |
c919e493 | 278 | NEXT_PASS (pass_dce); |
ca4be2a0 | 279 | POP_INSERT_PASSES () |
31c2b13b | 280 | NEXT_PASS (pass_parallelize_loops, false /* oacc_kernels_p */); |
e6db04d7 | 281 | NEXT_PASS (pass_expand_omp_ssa); |
e7f9a223 | 282 | NEXT_PASS (pass_ch_vect); |
ca4be2a0 | 283 | NEXT_PASS (pass_if_conversion); |
c71d3c24 | 284 | /* pass_vectorize must immediately follow pass_if_conversion. |
285 | Please do not add any other passes in between. */ | |
ca4be2a0 | 286 | NEXT_PASS (pass_vectorize); |
287 | PUSH_INSERT_PASSES_WITHIN (pass_vectorize) | |
c919e493 | 288 | NEXT_PASS (pass_dce); |
ca4be2a0 | 289 | POP_INSERT_PASSES () |
290 | NEXT_PASS (pass_predcom); | |
291 | NEXT_PASS (pass_complete_unroll); | |
292 | NEXT_PASS (pass_slp_vectorize); | |
293 | NEXT_PASS (pass_loop_prefetch); | |
ef3f2b6f | 294 | /* Run IVOPTs after the last pass that uses data-reference analysis |
295 | as that doesn't handle TARGET_MEM_REFs. */ | |
ca4be2a0 | 296 | NEXT_PASS (pass_iv_optimize); |
297 | NEXT_PASS (pass_lim); | |
298 | NEXT_PASS (pass_tree_loop_done); | |
299 | POP_INSERT_PASSES () | |
ef3f2b6f | 300 | /* Pass group that runs when pass_tree_loop is disabled or there |
301 | are no loops in the function. */ | |
302 | NEXT_PASS (pass_tree_no_loop); | |
303 | PUSH_INSERT_PASSES_WITHIN (pass_tree_no_loop) | |
304 | NEXT_PASS (pass_slp_vectorize); | |
305 | POP_INSERT_PASSES () | |
9918db44 | 306 | NEXT_PASS (pass_simduid_cleanup); |
ca4be2a0 | 307 | NEXT_PASS (pass_lower_vector_ssa); |
12b322e0 | 308 | NEXT_PASS (pass_lower_switch); |
ca4be2a0 | 309 | NEXT_PASS (pass_cse_reciprocals); |
b9833bfd | 310 | NEXT_PASS (pass_sprintf_length, true); |
83505659 | 311 | NEXT_PASS (pass_reassoc, false /* insert_powi_p */); |
ca4be2a0 | 312 | NEXT_PASS (pass_strength_reduction); |
ae31bfaa | 313 | NEXT_PASS (pass_split_paths); |
388748aa | 314 | NEXT_PASS (pass_tracer); |
ee5b48dc | 315 | NEXT_PASS (pass_fre, false /* may_iterate */); |
372172fe | 316 | NEXT_PASS (pass_thread_jumps); |
3279ea23 | 317 | NEXT_PASS (pass_dominator, false /* may_peel_loop_headers_p */); |
9f15ed6e | 318 | NEXT_PASS (pass_strlen); |
372172fe | 319 | NEXT_PASS (pass_thread_jumps); |
bc179819 | 320 | NEXT_PASS (pass_vrp, false /* warn_array_bounds_p */); |
0eee1ea0 | 321 | /* Threading can leave many const/copy propagations in the IL. |
322 | Clean them up. */ | |
323 | NEXT_PASS (pass_copy_prop); | |
4fd009e9 | 324 | NEXT_PASS (pass_warn_restrict); |
55bc8a5a | 325 | NEXT_PASS (pass_dse); |
56137da8 | 326 | NEXT_PASS (pass_cd_dce); |
55bc8a5a | 327 | NEXT_PASS (pass_forwprop); |
a2c2432d | 328 | NEXT_PASS (pass_phiopt, false /* early_p */); |
55bc8a5a | 329 | NEXT_PASS (pass_fold_builtins); |
330 | NEXT_PASS (pass_optimize_widening_mul); | |
3d3e04ac | 331 | NEXT_PASS (pass_store_merging); |
55bc8a5a | 332 | NEXT_PASS (pass_tail_calls); |
79f1ed25 | 333 | /* If DCE is not run before checking for uninitialized uses, |
ca4be2a0 | 334 | we may get false warnings (e.g., testsuite/gcc.dg/uninit-5.c). |
335 | However, this also causes us to misdiagnose cases that should be | |
79f1ed25 | 336 | real warnings (e.g., testsuite/gcc.dg/pr18501.c). */ |
337 | NEXT_PASS (pass_dce); | |
13089d2b | 338 | /* Split critical edges before late uninit warning to reduce the |
339 | number of false positives from it. */ | |
340 | NEXT_PASS (pass_split_crit_edges); | |
ca4be2a0 | 341 | NEXT_PASS (pass_late_warn_uninitialized); |
ca4be2a0 | 342 | NEXT_PASS (pass_uncprop); |
343 | NEXT_PASS (pass_local_pure_const); | |
344 | POP_INSERT_PASSES () | |
345 | NEXT_PASS (pass_all_optimizations_g); | |
346 | PUSH_INSERT_PASSES_WITHIN (pass_all_optimizations_g) | |
347 | NEXT_PASS (pass_remove_cgraph_callee_edges); | |
c03de6c9 | 348 | NEXT_PASS (pass_strip_predict_hints, false /* early_p */); |
ca4be2a0 | 349 | /* Lower remaining pieces of GIMPLE. */ |
350 | NEXT_PASS (pass_lower_complex); | |
351 | NEXT_PASS (pass_lower_vector_ssa); | |
12b322e0 | 352 | NEXT_PASS (pass_lower_switch); |
ca4be2a0 | 353 | /* Perform simple scalar cleanup which is constant/copy propagation. */ |
d0322b7d | 354 | NEXT_PASS (pass_ccp, true /* nonzero_p */); |
184fac50 | 355 | NEXT_PASS (pass_post_ipa_warn); |
ca4be2a0 | 356 | NEXT_PASS (pass_object_sizes); |
357 | /* Fold remaining builtins. */ | |
358 | NEXT_PASS (pass_fold_builtins); | |
07ef3c63 | 359 | NEXT_PASS (pass_sprintf_length, true); |
ca4be2a0 | 360 | /* Copy propagation also copy-propagates constants, this is necessary |
361 | to forward object-size and builtin folding results properly. */ | |
362 | NEXT_PASS (pass_copy_prop); | |
363 | NEXT_PASS (pass_dce); | |
d29e939c | 364 | NEXT_PASS (pass_sancov); |
ca4be2a0 | 365 | NEXT_PASS (pass_asan); |
366 | NEXT_PASS (pass_tsan); | |
ca4be2a0 | 367 | /* ??? We do want some kind of loop invariant motion, but we possibly |
368 | need to adjust LIM to be more friendly towards preserving accurate | |
369 | debug information here. */ | |
13089d2b | 370 | /* Split critical edges before late uninit warning to reduce the |
371 | number of false positives from it. */ | |
372 | NEXT_PASS (pass_split_crit_edges); | |
ca4be2a0 | 373 | NEXT_PASS (pass_late_warn_uninitialized); |
374 | NEXT_PASS (pass_uncprop); | |
375 | NEXT_PASS (pass_local_pure_const); | |
376 | POP_INSERT_PASSES () | |
377 | NEXT_PASS (pass_tm_init); | |
378 | PUSH_INSERT_PASSES_WITHIN (pass_tm_init) | |
379 | NEXT_PASS (pass_tm_mark); | |
380 | NEXT_PASS (pass_tm_memopt); | |
381 | NEXT_PASS (pass_tm_edges); | |
382 | POP_INSERT_PASSES () | |
43895be5 | 383 | NEXT_PASS (pass_simduid_cleanup); |
b710ec85 | 384 | NEXT_PASS (pass_vtable_verify); |
82fc0e0a | 385 | NEXT_PASS (pass_lower_vaarg); |
ca4be2a0 | 386 | NEXT_PASS (pass_lower_vector); |
387 | NEXT_PASS (pass_lower_complex_O0); | |
d29e939c | 388 | NEXT_PASS (pass_sancov_O0); |
d335da40 | 389 | NEXT_PASS (pass_lower_switch_O0); |
ca4be2a0 | 390 | NEXT_PASS (pass_asan_O0); |
391 | NEXT_PASS (pass_tsan_O0); | |
19b928d9 | 392 | NEXT_PASS (pass_sanopt); |
ca4be2a0 | 393 | NEXT_PASS (pass_cleanup_eh); |
394 | NEXT_PASS (pass_lower_resx); | |
395 | NEXT_PASS (pass_nrv); | |
ca4be2a0 | 396 | NEXT_PASS (pass_cleanup_cfg_post_optimizing); |
397 | NEXT_PASS (pass_warn_function_noreturn); | |
56686608 | 398 | NEXT_PASS (pass_gen_hsail); |
ca4be2a0 | 399 | |
400 | NEXT_PASS (pass_expand); | |
401 | ||
402 | NEXT_PASS (pass_rest_of_compilation); | |
403 | PUSH_INSERT_PASSES_WITHIN (pass_rest_of_compilation) | |
404 | NEXT_PASS (pass_instantiate_virtual_regs); | |
405 | NEXT_PASS (pass_into_cfg_layout_mode); | |
406 | NEXT_PASS (pass_jump); | |
407 | NEXT_PASS (pass_lower_subreg); | |
408 | NEXT_PASS (pass_df_initialize_opt); | |
409 | NEXT_PASS (pass_cse); | |
410 | NEXT_PASS (pass_rtl_fwprop); | |
411 | NEXT_PASS (pass_rtl_cprop); | |
412 | NEXT_PASS (pass_rtl_pre); | |
413 | NEXT_PASS (pass_rtl_hoist); | |
414 | NEXT_PASS (pass_rtl_cprop); | |
415 | NEXT_PASS (pass_rtl_store_motion); | |
416 | NEXT_PASS (pass_cse_after_global_opts); | |
417 | NEXT_PASS (pass_rtl_ifcvt); | |
418 | NEXT_PASS (pass_reginfo_init); | |
419 | /* Perform loop optimizations. It might be better to do them a bit | |
420 | sooner, but we want the profile feedback to work more | |
421 | efficiently. */ | |
422 | NEXT_PASS (pass_loop2); | |
423 | PUSH_INSERT_PASSES_WITHIN (pass_loop2) | |
424 | NEXT_PASS (pass_rtl_loop_init); | |
425 | NEXT_PASS (pass_rtl_move_loop_invariants); | |
c836de3f | 426 | NEXT_PASS (pass_rtl_unroll_loops); |
ca4be2a0 | 427 | NEXT_PASS (pass_rtl_doloop); |
428 | NEXT_PASS (pass_rtl_loop_done); | |
ca4be2a0 | 429 | POP_INSERT_PASSES () |
e657014d | 430 | NEXT_PASS (pass_lower_subreg2); |
ca4be2a0 | 431 | NEXT_PASS (pass_web); |
432 | NEXT_PASS (pass_rtl_cprop); | |
433 | NEXT_PASS (pass_cse2); | |
434 | NEXT_PASS (pass_rtl_dse1); | |
435 | NEXT_PASS (pass_rtl_fwprop_addr); | |
436 | NEXT_PASS (pass_inc_dec); | |
437 | NEXT_PASS (pass_initialize_regs); | |
438 | NEXT_PASS (pass_ud_rtl_dce); | |
439 | NEXT_PASS (pass_combine); | |
440 | NEXT_PASS (pass_if_after_combine); | |
441 | NEXT_PASS (pass_partition_blocks); | |
ca4be2a0 | 442 | NEXT_PASS (pass_outof_cfg_layout_mode); |
443 | NEXT_PASS (pass_split_all_insns); | |
e657014d | 444 | NEXT_PASS (pass_lower_subreg3); |
ca4be2a0 | 445 | NEXT_PASS (pass_df_initialize_no_opt); |
446 | NEXT_PASS (pass_stack_ptr_mod); | |
447 | NEXT_PASS (pass_mode_switching); | |
448 | NEXT_PASS (pass_match_asm_constraints); | |
449 | NEXT_PASS (pass_sms); | |
57a8bf1b | 450 | NEXT_PASS (pass_live_range_shrinkage); |
ca4be2a0 | 451 | NEXT_PASS (pass_sched); |
62958b22 | 452 | NEXT_PASS (pass_early_remat); |
ca4be2a0 | 453 | NEXT_PASS (pass_ira); |
454 | NEXT_PASS (pass_reload); | |
455 | NEXT_PASS (pass_postreload); | |
456 | PUSH_INSERT_PASSES_WITHIN (pass_postreload) | |
6463091b | 457 | NEXT_PASS (pass_postreload_jump); |
ca4be2a0 | 458 | NEXT_PASS (pass_postreload_cse); |
459 | NEXT_PASS (pass_gcse2); | |
460 | NEXT_PASS (pass_split_after_reload); | |
461 | NEXT_PASS (pass_ree); | |
462 | NEXT_PASS (pass_compare_elim_after_reload); | |
463 | NEXT_PASS (pass_branch_target_load_optimize1); | |
464 | NEXT_PASS (pass_thread_prologue_and_epilogue); | |
465 | NEXT_PASS (pass_rtl_dse2); | |
466 | NEXT_PASS (pass_stack_adjustments); | |
467 | NEXT_PASS (pass_jump2); | |
9f4ec746 | 468 | NEXT_PASS (pass_duplicate_computed_gotos); |
012ad66c | 469 | NEXT_PASS (pass_sched_fusion); |
9f4ec746 | 470 | NEXT_PASS (pass_peephole2); |
ca4be2a0 | 471 | NEXT_PASS (pass_if_after_reload); |
472 | NEXT_PASS (pass_regrename); | |
473 | NEXT_PASS (pass_cprop_hardreg); | |
474 | NEXT_PASS (pass_fast_rtl_dce); | |
475 | NEXT_PASS (pass_reorder_blocks); | |
476 | NEXT_PASS (pass_branch_target_load_optimize2); | |
477 | NEXT_PASS (pass_leaf_regs); | |
478 | NEXT_PASS (pass_split_before_sched2); | |
479 | NEXT_PASS (pass_sched2); | |
480 | NEXT_PASS (pass_stack_regs); | |
481 | PUSH_INSERT_PASSES_WITHIN (pass_stack_regs) | |
482 | NEXT_PASS (pass_split_before_regstack); | |
483 | NEXT_PASS (pass_stack_regs_run); | |
484 | POP_INSERT_PASSES () | |
6fe9a05b | 485 | POP_INSERT_PASSES () |
486 | NEXT_PASS (pass_late_compilation); | |
487 | PUSH_INSERT_PASSES_WITHIN (pass_late_compilation) | |
ca4be2a0 | 488 | NEXT_PASS (pass_compute_alignments); |
ca4be2a0 | 489 | NEXT_PASS (pass_variable_tracking); |
490 | NEXT_PASS (pass_free_cfg); | |
491 | NEXT_PASS (pass_machine_reorg); | |
492 | NEXT_PASS (pass_cleanup_barriers); | |
493 | NEXT_PASS (pass_delay_slots); | |
494 | NEXT_PASS (pass_split_for_shorten_branches); | |
495 | NEXT_PASS (pass_convert_to_eh_region_ranges); | |
496 | NEXT_PASS (pass_shorten_branches); | |
497 | NEXT_PASS (pass_set_nothrow_function_flags); | |
498 | NEXT_PASS (pass_dwarf2_frame); | |
499 | NEXT_PASS (pass_final); | |
500 | POP_INSERT_PASSES () | |
501 | NEXT_PASS (pass_df_finish); | |
502 | POP_INSERT_PASSES () | |
503 | NEXT_PASS (pass_clean_state); | |
fff44d9f | 504 | TERMINATE_PASS_LIST (all_passes) |