]>
Commit | Line | Data |
---|---|---|
1 | /* Description of pass structure | |
2 | Copyright (C) 1987-2025 Free Software Foundation, Inc. | |
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 | /* Note that this file is processed by a simple parser: | |
21 | 'gen-pass-instances.awk', so carefully verify the generated | |
22 | 'pass-instances.def' if you deviate from the syntax otherwise used in | |
23 | here. */ | |
24 | ||
25 | ||
26 | /* All passes needed to lower the function into shape optimizers can | |
27 | operate on. These passes are always run first on the function, but | |
28 | backend might produce already lowered functions that are not processed | |
29 | by these passes. */ | |
30 | INSERT_PASSES_AFTER (all_lowering_passes) | |
31 | NEXT_PASS (pass_warn_unused_result); | |
32 | NEXT_PASS (pass_diagnose_omp_blocks); | |
33 | NEXT_PASS (pass_diagnose_tm_blocks); | |
34 | NEXT_PASS (pass_omp_oacc_kernels_decompose); | |
35 | NEXT_PASS (pass_lower_omp); | |
36 | NEXT_PASS (pass_lower_cf); | |
37 | NEXT_PASS (pass_lower_tm); | |
38 | NEXT_PASS (pass_refactor_eh); | |
39 | NEXT_PASS (pass_lower_eh); | |
40 | NEXT_PASS (pass_coroutine_lower_builtins); | |
41 | NEXT_PASS (pass_build_cfg); | |
42 | NEXT_PASS (pass_warn_function_return); | |
43 | NEXT_PASS (pass_coroutine_early_expand_ifns); | |
44 | NEXT_PASS (pass_expand_omp); | |
45 | NEXT_PASS (pass_build_cgraph_edges); | |
46 | TERMINATE_PASS_LIST (all_lowering_passes) | |
47 | ||
48 | /* Interprocedural optimization passes. */ | |
49 | INSERT_PASSES_AFTER (all_small_ipa_passes) | |
50 | /* auto_profile_offline uses dwarf_name hook that only | |
51 | works before free_lang_data. */ | |
52 | NEXT_PASS (pass_ipa_auto_profile_offline); | |
53 | NEXT_PASS (pass_ipa_free_lang_data); | |
54 | NEXT_PASS (pass_ipa_function_and_variable_visibility); | |
55 | NEXT_PASS (pass_ipa_strub_mode); | |
56 | NEXT_PASS (pass_build_ssa_passes); | |
57 | PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes) | |
58 | NEXT_PASS (pass_fixup_cfg); | |
59 | NEXT_PASS (pass_build_ssa); | |
60 | NEXT_PASS (pass_walloca, /*strict_mode_p=*/true); | |
61 | NEXT_PASS (pass_warn_printf); | |
62 | NEXT_PASS (pass_warn_nonnull_compare); | |
63 | NEXT_PASS (pass_early_warn_uninitialized); | |
64 | NEXT_PASS (pass_warn_access, /*early=*/true); | |
65 | NEXT_PASS (pass_ubsan); | |
66 | NEXT_PASS (pass_nothrow); | |
67 | NEXT_PASS (pass_rebuild_cgraph_edges); | |
68 | POP_INSERT_PASSES () | |
69 | ||
70 | NEXT_PASS (pass_local_optimization_passes); | |
71 | PUSH_INSERT_PASSES_WITHIN (pass_local_optimization_passes) | |
72 | NEXT_PASS (pass_fixup_cfg); | |
73 | NEXT_PASS (pass_rebuild_cgraph_edges); | |
74 | NEXT_PASS (pass_local_fn_summary); | |
75 | NEXT_PASS (pass_early_inline); | |
76 | NEXT_PASS (pass_warn_recursion); | |
77 | NEXT_PASS (pass_all_early_optimizations); | |
78 | PUSH_INSERT_PASSES_WITHIN (pass_all_early_optimizations) | |
79 | NEXT_PASS (pass_remove_cgraph_callee_edges); | |
80 | NEXT_PASS (pass_early_object_sizes); | |
81 | /* Don't record nonzero bits before IPA to avoid | |
82 | using too much memory. */ | |
83 | NEXT_PASS (pass_ccp, false /* nonzero_p */); | |
84 | /* After CCP we rewrite no longer addressed locals into SSA | |
85 | form if possible. */ | |
86 | NEXT_PASS (pass_forwprop, /*last=*/false); | |
87 | NEXT_PASS (pass_early_thread_jumps, /*first=*/true); | |
88 | NEXT_PASS (pass_sra_early); | |
89 | /* pass_build_ealias is a dummy pass that ensures that we | |
90 | execute TODO_rebuild_alias at this point. */ | |
91 | NEXT_PASS (pass_build_ealias); | |
92 | /* Do phiprop before FRE so we optimize std::min and std::max well. */ | |
93 | NEXT_PASS (pass_phiprop); | |
94 | NEXT_PASS (pass_fre, true /* may_iterate */); | |
95 | NEXT_PASS (pass_early_vrp); | |
96 | NEXT_PASS (pass_merge_phi); | |
97 | NEXT_PASS (pass_dse); | |
98 | NEXT_PASS (pass_cd_dce, false /* update_address_taken_p */, true /* remove_unused_locals */); | |
99 | NEXT_PASS (pass_phiopt, true /* early_p */); | |
100 | NEXT_PASS (pass_tail_recursion); | |
101 | NEXT_PASS (pass_if_to_switch); | |
102 | NEXT_PASS (pass_convert_switch); | |
103 | NEXT_PASS (pass_cleanup_eh); | |
104 | NEXT_PASS (pass_sccopy); | |
105 | NEXT_PASS (pass_profile); | |
106 | NEXT_PASS (pass_local_pure_const); | |
107 | NEXT_PASS (pass_modref); | |
108 | /* Split functions creates parts that are not run through | |
109 | early optimizations again. It is thus good idea to do this | |
110 | late. */ | |
111 | NEXT_PASS (pass_split_functions); | |
112 | NEXT_PASS (pass_strip_predict_hints, true /* early_p */); | |
113 | POP_INSERT_PASSES () | |
114 | NEXT_PASS (pass_release_ssa_names); | |
115 | NEXT_PASS (pass_rebuild_cgraph_edges); | |
116 | NEXT_PASS (pass_local_fn_summary); | |
117 | POP_INSERT_PASSES () | |
118 | ||
119 | NEXT_PASS (pass_ipa_remove_symbols); | |
120 | NEXT_PASS (pass_ipa_strub); | |
121 | NEXT_PASS (pass_ipa_oacc); | |
122 | PUSH_INSERT_PASSES_WITHIN (pass_ipa_oacc) | |
123 | NEXT_PASS (pass_ipa_pta); | |
124 | /* Pass group that runs when the function is an offloaded function | |
125 | containing oacc kernels loops. */ | |
126 | NEXT_PASS (pass_ipa_oacc_kernels); | |
127 | PUSH_INSERT_PASSES_WITHIN (pass_ipa_oacc_kernels) | |
128 | NEXT_PASS (pass_oacc_kernels); | |
129 | PUSH_INSERT_PASSES_WITHIN (pass_oacc_kernels) | |
130 | NEXT_PASS (pass_ch); | |
131 | NEXT_PASS (pass_fre, true /* may_iterate */); | |
132 | /* We use pass_lim to rewrite in-memory iteration and reduction | |
133 | variable accesses in loops into local variables accesses. */ | |
134 | NEXT_PASS (pass_lim); | |
135 | NEXT_PASS (pass_dominator, false /* may_peel_loop_headers_p */); | |
136 | NEXT_PASS (pass_dce); | |
137 | NEXT_PASS (pass_parallelize_loops, true /* oacc_kernels_p */); | |
138 | NEXT_PASS (pass_expand_omp_ssa); | |
139 | NEXT_PASS (pass_rebuild_cgraph_edges); | |
140 | POP_INSERT_PASSES () | |
141 | POP_INSERT_PASSES () | |
142 | POP_INSERT_PASSES () | |
143 | ||
144 | NEXT_PASS (pass_target_clone); | |
145 | NEXT_PASS (pass_ipa_auto_profile); | |
146 | PUSH_INSERT_PASSES_WITHIN (pass_ipa_auto_profile) | |
147 | NEXT_PASS (pass_feedback_split_functions); | |
148 | POP_INSERT_PASSES () | |
149 | NEXT_PASS (pass_ipa_tree_profile); | |
150 | PUSH_INSERT_PASSES_WITHIN (pass_ipa_tree_profile) | |
151 | NEXT_PASS (pass_feedback_split_functions); | |
152 | POP_INSERT_PASSES () | |
153 | NEXT_PASS (pass_ipa_free_fn_summary, true /* small_p */); | |
154 | NEXT_PASS (pass_ipa_increase_alignment); | |
155 | NEXT_PASS (pass_ipa_tm); | |
156 | NEXT_PASS (pass_ipa_lower_emutls); | |
157 | TERMINATE_PASS_LIST (all_small_ipa_passes) | |
158 | ||
159 | INSERT_PASSES_AFTER (all_regular_ipa_passes) | |
160 | NEXT_PASS (pass_analyzer); | |
161 | NEXT_PASS (pass_ipa_odr); | |
162 | NEXT_PASS (pass_ipa_whole_program_visibility); | |
163 | NEXT_PASS (pass_ipa_profile); | |
164 | NEXT_PASS (pass_ipa_icf); | |
165 | NEXT_PASS (pass_ipa_devirt); | |
166 | NEXT_PASS (pass_ipa_cdtor_merge); | |
167 | NEXT_PASS (pass_ipa_cp); | |
168 | NEXT_PASS (pass_ipa_sra); | |
169 | NEXT_PASS (pass_ipa_fn_summary); | |
170 | NEXT_PASS (pass_ipa_inline); | |
171 | NEXT_PASS (pass_ipa_locality_cloning); | |
172 | NEXT_PASS (pass_ipa_pure_const); | |
173 | NEXT_PASS (pass_ipa_modref); | |
174 | NEXT_PASS (pass_ipa_free_fn_summary, false /* small_p */); | |
175 | NEXT_PASS (pass_ipa_reference); | |
176 | /* This pass needs to be scheduled after any IP code duplication. */ | |
177 | NEXT_PASS (pass_ipa_single_use); | |
178 | /* Comdat privatization come last, as direct references to comdat local | |
179 | symbols are not allowed outside of the comdat group. Privatizing early | |
180 | would result in missed optimizations due to this restriction. */ | |
181 | NEXT_PASS (pass_ipa_comdats); | |
182 | TERMINATE_PASS_LIST (all_regular_ipa_passes) | |
183 | ||
184 | /* Simple IPA passes executed after the regular passes. In WHOPR mode the | |
185 | passes are executed after partitioning and thus see just parts of the | |
186 | compiled unit. */ | |
187 | INSERT_PASSES_AFTER (all_late_ipa_passes) | |
188 | NEXT_PASS (pass_ipa_pta); | |
189 | NEXT_PASS (pass_omp_simd_clone); | |
190 | TERMINATE_PASS_LIST (all_late_ipa_passes) | |
191 | ||
192 | /* These passes are run after IPA passes on every function that is being | |
193 | output to the assembler file. */ | |
194 | INSERT_PASSES_AFTER (all_passes) | |
195 | NEXT_PASS (pass_fixup_cfg); | |
196 | NEXT_PASS (pass_lower_eh_dispatch); | |
197 | NEXT_PASS (pass_oacc_loop_designation); | |
198 | NEXT_PASS (pass_omp_oacc_neuter_broadcast); | |
199 | NEXT_PASS (pass_oacc_device_lower); | |
200 | NEXT_PASS (pass_omp_device_lower); | |
201 | NEXT_PASS (pass_omp_target_link); | |
202 | NEXT_PASS (pass_adjust_alignment); | |
203 | NEXT_PASS (pass_harden_control_flow_redundancy); | |
204 | NEXT_PASS (pass_all_optimizations); | |
205 | PUSH_INSERT_PASSES_WITHIN (pass_all_optimizations) | |
206 | NEXT_PASS (pass_remove_cgraph_callee_edges); | |
207 | /* Initial scalar cleanups before alias computation. | |
208 | They ensure memory accesses are not indirect wherever possible. */ | |
209 | NEXT_PASS (pass_strip_predict_hints, false /* early_p */); | |
210 | NEXT_PASS (pass_ccp, true /* nonzero_p */); | |
211 | /* After CCP we rewrite no longer addressed locals into SSA | |
212 | form if possible. */ | |
213 | NEXT_PASS (pass_object_sizes); | |
214 | NEXT_PASS (pass_post_ipa_warn); | |
215 | /* Must run before loop unrolling. */ | |
216 | NEXT_PASS (pass_warn_access, /*early=*/true); | |
217 | /* Profile count may overflow as a result of inlinining very large | |
218 | loop nests. This pass should run before any late pass that makes | |
219 | use of profile. */ | |
220 | NEXT_PASS (pass_rebuild_frequencies); | |
221 | NEXT_PASS (pass_complete_unrolli); | |
222 | NEXT_PASS (pass_backprop); | |
223 | NEXT_PASS (pass_phiprop); | |
224 | NEXT_PASS (pass_forwprop, /*last=*/false); | |
225 | /* pass_build_alias is a dummy pass that ensures that we | |
226 | execute TODO_rebuild_alias at this point. */ | |
227 | NEXT_PASS (pass_build_alias); | |
228 | NEXT_PASS (pass_return_slot); | |
229 | NEXT_PASS (pass_fre, true /* may_iterate */); | |
230 | NEXT_PASS (pass_merge_phi); | |
231 | NEXT_PASS (pass_thread_jumps_full, /*first=*/true); | |
232 | NEXT_PASS (pass_vrp, false /* final_p*/); | |
233 | NEXT_PASS (pass_array_bounds); | |
234 | NEXT_PASS (pass_dse); | |
235 | NEXT_PASS (pass_dce, false /* update_address_taken_p */, true /* remove_unused_locals */); | |
236 | NEXT_PASS (pass_stdarg); | |
237 | NEXT_PASS (pass_call_cdce); | |
238 | NEXT_PASS (pass_cselim); | |
239 | NEXT_PASS (pass_copy_prop); | |
240 | NEXT_PASS (pass_tree_ifcombine); | |
241 | NEXT_PASS (pass_merge_phi); | |
242 | NEXT_PASS (pass_phiopt, false /* early_p */); | |
243 | NEXT_PASS (pass_tail_recursion); | |
244 | NEXT_PASS (pass_ch); | |
245 | NEXT_PASS (pass_lower_complex); | |
246 | NEXT_PASS (pass_lower_bitint); | |
247 | NEXT_PASS (pass_sra); | |
248 | /* The dom pass will also resolve all __builtin_constant_p calls | |
249 | that are still there to 0. This has to be done after some | |
250 | propagations have already run, but before some more dead code | |
251 | is removed, and this place fits nicely. Remember this when | |
252 | trying to move or duplicate pass_dominator somewhere earlier. */ | |
253 | NEXT_PASS (pass_thread_jumps, /*first=*/true); | |
254 | NEXT_PASS (pass_dominator, true /* may_peel_loop_headers_p */); | |
255 | /* Threading can leave many const/copy propagations in the IL. | |
256 | Clean them up. Failure to do so well can lead to false | |
257 | positives from warnings for erroneous code. */ | |
258 | NEXT_PASS (pass_copy_prop); | |
259 | /* Identify paths that should never be executed in a conforming | |
260 | program and isolate those paths. */ | |
261 | NEXT_PASS (pass_isolate_erroneous_paths); | |
262 | NEXT_PASS (pass_reassoc, true /* early_p */); | |
263 | NEXT_PASS (pass_dce); | |
264 | NEXT_PASS (pass_forwprop, /*last=*/false); | |
265 | NEXT_PASS (pass_phiopt, false /* early_p */); | |
266 | NEXT_PASS (pass_ccp, true /* nonzero_p */); | |
267 | /* After CCP we rewrite no longer addressed locals into SSA | |
268 | form if possible. */ | |
269 | NEXT_PASS (pass_expand_pow); | |
270 | NEXT_PASS (pass_optimize_bswap); | |
271 | NEXT_PASS (pass_laddress); | |
272 | NEXT_PASS (pass_lim); | |
273 | NEXT_PASS (pass_walloca, false); | |
274 | NEXT_PASS (pass_pre); | |
275 | NEXT_PASS (pass_sink_code, false /* unsplit edges */); | |
276 | NEXT_PASS (pass_sancov); | |
277 | NEXT_PASS (pass_asan); | |
278 | NEXT_PASS (pass_tsan); | |
279 | NEXT_PASS (pass_dse, true /* use DR analysis */); | |
280 | NEXT_PASS (pass_dce, false /* update_address_taken_p */, false /* remove_unused_locals */); | |
281 | /* Pass group that runs when 1) enabled, 2) there are loops | |
282 | in the function. Make sure to run pass_fix_loops before | |
283 | to discover/remove loops before running the gate function | |
284 | of pass_tree_loop. */ | |
285 | NEXT_PASS (pass_fix_loops); | |
286 | NEXT_PASS (pass_tree_loop); | |
287 | PUSH_INSERT_PASSES_WITHIN (pass_tree_loop) | |
288 | /* Before loop_init we rewrite no longer addressed locals into SSA | |
289 | form if possible. */ | |
290 | NEXT_PASS (pass_tree_loop_init); | |
291 | NEXT_PASS (pass_tree_unswitch); | |
292 | NEXT_PASS (pass_loop_split); | |
293 | NEXT_PASS (pass_scev_cprop); | |
294 | NEXT_PASS (pass_loop_versioning); | |
295 | NEXT_PASS (pass_loop_jam); | |
296 | /* All unswitching, final value replacement and splitting can expose | |
297 | empty loops. Remove them now. */ | |
298 | NEXT_PASS (pass_cd_dce, false /* update_address_taken_p */); | |
299 | NEXT_PASS (pass_iv_canon); | |
300 | NEXT_PASS (pass_loop_distribution); | |
301 | NEXT_PASS (pass_crc_optimization); | |
302 | NEXT_PASS (pass_linterchange); | |
303 | NEXT_PASS (pass_copy_prop); | |
304 | NEXT_PASS (pass_graphite); | |
305 | PUSH_INSERT_PASSES_WITHIN (pass_graphite) | |
306 | NEXT_PASS (pass_graphite_transforms); | |
307 | NEXT_PASS (pass_lim); | |
308 | NEXT_PASS (pass_copy_prop); | |
309 | NEXT_PASS (pass_dce); | |
310 | POP_INSERT_PASSES () | |
311 | NEXT_PASS (pass_parallelize_loops, false /* oacc_kernels_p */); | |
312 | NEXT_PASS (pass_expand_omp_ssa); | |
313 | NEXT_PASS (pass_ch_vect); | |
314 | NEXT_PASS (pass_if_conversion); | |
315 | /* pass_vectorize must immediately follow pass_if_conversion. | |
316 | Please do not add any other passes in between. */ | |
317 | NEXT_PASS (pass_vectorize); | |
318 | PUSH_INSERT_PASSES_WITHIN (pass_vectorize) | |
319 | NEXT_PASS (pass_dce); | |
320 | POP_INSERT_PASSES () | |
321 | NEXT_PASS (pass_predcom); | |
322 | NEXT_PASS (pass_complete_unroll); | |
323 | NEXT_PASS (pass_pre_slp_scalar_cleanup); | |
324 | PUSH_INSERT_PASSES_WITHIN (pass_pre_slp_scalar_cleanup) | |
325 | NEXT_PASS (pass_fre, false /* may_iterate */); | |
326 | NEXT_PASS (pass_dse); | |
327 | POP_INSERT_PASSES () | |
328 | NEXT_PASS (pass_slp_vectorize); | |
329 | NEXT_PASS (pass_loop_prefetch); | |
330 | /* Run IVOPTs after the last pass that uses data-reference analysis | |
331 | as that doesn't handle TARGET_MEM_REFs. */ | |
332 | NEXT_PASS (pass_iv_optimize); | |
333 | NEXT_PASS (pass_lim); | |
334 | NEXT_PASS (pass_tree_loop_done); | |
335 | POP_INSERT_PASSES () | |
336 | /* Pass group that runs when pass_tree_loop is disabled or there | |
337 | are no loops in the function. */ | |
338 | NEXT_PASS (pass_tree_no_loop); | |
339 | PUSH_INSERT_PASSES_WITHIN (pass_tree_no_loop) | |
340 | NEXT_PASS (pass_slp_vectorize); | |
341 | POP_INSERT_PASSES () | |
342 | NEXT_PASS (pass_simduid_cleanup); | |
343 | NEXT_PASS (pass_lower_vector_ssa); | |
344 | NEXT_PASS (pass_lower_switch); | |
345 | NEXT_PASS (pass_cse_sincos); | |
346 | NEXT_PASS (pass_cse_reciprocals); | |
347 | NEXT_PASS (pass_reassoc, false /* early_p */); | |
348 | NEXT_PASS (pass_strength_reduction); | |
349 | NEXT_PASS (pass_split_paths); | |
350 | NEXT_PASS (pass_tracer); | |
351 | NEXT_PASS (pass_fre, false /* may_iterate */); | |
352 | /* After late FRE we rewrite no longer addressed locals into SSA | |
353 | form if possible. */ | |
354 | NEXT_PASS (pass_thread_jumps, /*first=*/false); | |
355 | NEXT_PASS (pass_dominator, false /* may_peel_loop_headers_p */); | |
356 | NEXT_PASS (pass_strlen); | |
357 | NEXT_PASS (pass_thread_jumps_full, /*first=*/false); | |
358 | NEXT_PASS (pass_vrp, true /* final_p */); | |
359 | /* Run CCP to compute alignment and nonzero bits. */ | |
360 | NEXT_PASS (pass_ccp, true /* nonzero_p */); | |
361 | NEXT_PASS (pass_warn_restrict); | |
362 | NEXT_PASS (pass_dse); | |
363 | NEXT_PASS (pass_dce, true /* update_address_taken_p */, true /* remove_unused_locals */); | |
364 | /* After late DCE we rewrite no longer addressed locals into SSA | |
365 | form if possible. */ | |
366 | NEXT_PASS (pass_forwprop, /*last=*/true); | |
367 | NEXT_PASS (pass_sink_code, true /* unsplit edges */); | |
368 | NEXT_PASS (pass_phiopt, false /* early_p */); | |
369 | NEXT_PASS (pass_fold_builtins); | |
370 | NEXT_PASS (pass_optimize_widening_mul); | |
371 | NEXT_PASS (pass_store_merging); | |
372 | /* If DCE is not run before checking for uninitialized uses, | |
373 | we may get false warnings (e.g., testsuite/gcc.dg/uninit-5.c). | |
374 | However, this also causes us to misdiagnose cases that should be | |
375 | real warnings (e.g., testsuite/gcc.dg/pr18501.c). */ | |
376 | NEXT_PASS (pass_cd_dce, false /* update_address_taken_p */); | |
377 | NEXT_PASS (pass_sccopy); | |
378 | NEXT_PASS (pass_tail_calls); | |
379 | /* Split critical edges before late uninit warning to reduce the | |
380 | number of false positives from it. */ | |
381 | NEXT_PASS (pass_split_crit_edges); | |
382 | NEXT_PASS (pass_late_warn_uninitialized); | |
383 | NEXT_PASS (pass_local_pure_const); | |
384 | NEXT_PASS (pass_modref); | |
385 | /* uncprop replaces constants by SSA names. This makes analysis harder | |
386 | and thus it should be run last. */ | |
387 | NEXT_PASS (pass_uncprop); | |
388 | POP_INSERT_PASSES () | |
389 | NEXT_PASS (pass_all_optimizations_g); | |
390 | PUSH_INSERT_PASSES_WITHIN (pass_all_optimizations_g) | |
391 | /* The idea is that with -Og we do not perform any IPA optimization | |
392 | so post-IPA work should be restricted to semantically required | |
393 | passes and all optimization work is done early. */ | |
394 | NEXT_PASS (pass_remove_cgraph_callee_edges); | |
395 | NEXT_PASS (pass_strip_predict_hints, false /* early_p */); | |
396 | /* Lower remaining pieces of GIMPLE. */ | |
397 | NEXT_PASS (pass_lower_complex); | |
398 | NEXT_PASS (pass_lower_bitint); | |
399 | NEXT_PASS (pass_lower_vector_ssa); | |
400 | NEXT_PASS (pass_lower_switch); | |
401 | /* Perform simple scalar cleanup which is constant/copy propagation. */ | |
402 | NEXT_PASS (pass_ccp, true /* nonzero_p */); | |
403 | NEXT_PASS (pass_post_ipa_warn); | |
404 | NEXT_PASS (pass_object_sizes); | |
405 | /* Fold remaining builtins. */ | |
406 | NEXT_PASS (pass_fold_builtins); | |
407 | NEXT_PASS (pass_strlen); | |
408 | /* Copy propagation also copy-propagates constants, this is necessary | |
409 | to forward object-size and builtin folding results properly. */ | |
410 | NEXT_PASS (pass_copy_prop); | |
411 | NEXT_PASS (pass_dce); | |
412 | /* Profile count may overflow as a result of inlinining very large | |
413 | loop nests. This pass should run before any late pass that makes | |
414 | use of profile. */ | |
415 | NEXT_PASS (pass_rebuild_frequencies); | |
416 | NEXT_PASS (pass_sancov); | |
417 | NEXT_PASS (pass_asan); | |
418 | NEXT_PASS (pass_tsan); | |
419 | /* ??? We do want some kind of loop invariant motion, but we possibly | |
420 | need to adjust LIM to be more friendly towards preserving accurate | |
421 | debug information here. */ | |
422 | /* Split critical edges before late uninit warning to reduce the | |
423 | number of false positives from it. */ | |
424 | NEXT_PASS (pass_split_crit_edges); | |
425 | NEXT_PASS (pass_late_warn_uninitialized); | |
426 | /* uncprop replaces constants by SSA names. This makes analysis harder | |
427 | and thus it should be run last. */ | |
428 | NEXT_PASS (pass_uncprop); | |
429 | POP_INSERT_PASSES () | |
430 | NEXT_PASS (pass_assumptions); | |
431 | NEXT_PASS (pass_tm_init); | |
432 | PUSH_INSERT_PASSES_WITHIN (pass_tm_init) | |
433 | NEXT_PASS (pass_tm_mark); | |
434 | NEXT_PASS (pass_tm_memopt); | |
435 | NEXT_PASS (pass_tm_edges); | |
436 | POP_INSERT_PASSES () | |
437 | NEXT_PASS (pass_simduid_cleanup); | |
438 | NEXT_PASS (pass_vtable_verify); | |
439 | NEXT_PASS (pass_lower_vaarg); | |
440 | NEXT_PASS (pass_lower_vector); | |
441 | NEXT_PASS (pass_lower_complex_O0); | |
442 | NEXT_PASS (pass_lower_bitint_O0); | |
443 | NEXT_PASS (pass_sancov_O0); | |
444 | NEXT_PASS (pass_lower_switch_O0); | |
445 | NEXT_PASS (pass_asan_O0); | |
446 | NEXT_PASS (pass_tsan_O0); | |
447 | NEXT_PASS (pass_musttail); | |
448 | NEXT_PASS (pass_sanopt); | |
449 | NEXT_PASS (pass_cleanup_eh); | |
450 | NEXT_PASS (pass_lower_resx); | |
451 | NEXT_PASS (pass_nrv); | |
452 | NEXT_PASS (pass_gimple_isel); | |
453 | NEXT_PASS (pass_harden_conditional_branches); | |
454 | NEXT_PASS (pass_harden_compares); | |
455 | NEXT_PASS (pass_warn_access, /*early=*/false); | |
456 | NEXT_PASS (pass_cleanup_cfg_post_optimizing); | |
457 | NEXT_PASS (pass_warn_function_noreturn); | |
458 | ||
459 | NEXT_PASS (pass_expand); | |
460 | ||
461 | NEXT_PASS (pass_rest_of_compilation); | |
462 | PUSH_INSERT_PASSES_WITHIN (pass_rest_of_compilation) | |
463 | NEXT_PASS (pass_instantiate_virtual_regs); | |
464 | NEXT_PASS (pass_into_cfg_layout_mode); | |
465 | NEXT_PASS (pass_jump); | |
466 | NEXT_PASS (pass_lower_subreg); | |
467 | NEXT_PASS (pass_df_initialize_opt); | |
468 | NEXT_PASS (pass_cse); | |
469 | NEXT_PASS (pass_rtl_fwprop); | |
470 | NEXT_PASS (pass_rtl_cprop); | |
471 | NEXT_PASS (pass_rtl_pre); | |
472 | NEXT_PASS (pass_rtl_hoist); | |
473 | NEXT_PASS (pass_hardreg_pre); | |
474 | NEXT_PASS (pass_rtl_cprop); | |
475 | NEXT_PASS (pass_rtl_store_motion); | |
476 | NEXT_PASS (pass_cse_after_global_opts); | |
477 | NEXT_PASS (pass_rtl_ifcvt); | |
478 | NEXT_PASS (pass_reginfo_init); | |
479 | /* Perform loop optimizations. It might be better to do them a bit | |
480 | sooner, but we want the profile feedback to work more | |
481 | efficiently. */ | |
482 | NEXT_PASS (pass_loop2); | |
483 | PUSH_INSERT_PASSES_WITHIN (pass_loop2) | |
484 | NEXT_PASS (pass_rtl_loop_init); | |
485 | NEXT_PASS (pass_rtl_move_loop_invariants); | |
486 | NEXT_PASS (pass_rtl_unroll_loops); | |
487 | NEXT_PASS (pass_rtl_doloop); | |
488 | NEXT_PASS (pass_rtl_loop_done); | |
489 | POP_INSERT_PASSES () | |
490 | NEXT_PASS (pass_lower_subreg2); | |
491 | NEXT_PASS (pass_web); | |
492 | NEXT_PASS (pass_rtl_cprop); | |
493 | NEXT_PASS (pass_cse2); | |
494 | NEXT_PASS (pass_rtl_dse1); | |
495 | NEXT_PASS (pass_rtl_fwprop_addr); | |
496 | NEXT_PASS (pass_inc_dec); | |
497 | NEXT_PASS (pass_initialize_regs); | |
498 | NEXT_PASS (pass_ud_rtl_dce); | |
499 | NEXT_PASS (pass_ext_dce); | |
500 | NEXT_PASS (pass_combine); | |
501 | NEXT_PASS (pass_late_combine); | |
502 | NEXT_PASS (pass_if_after_combine); | |
503 | NEXT_PASS (pass_jump_after_combine); | |
504 | NEXT_PASS (pass_partition_blocks); | |
505 | NEXT_PASS (pass_outof_cfg_layout_mode); | |
506 | NEXT_PASS (pass_split_all_insns); | |
507 | NEXT_PASS (pass_lower_subreg3); | |
508 | NEXT_PASS (pass_df_initialize_no_opt); | |
509 | NEXT_PASS (pass_stack_ptr_mod); | |
510 | NEXT_PASS (pass_mode_switching); | |
511 | NEXT_PASS (pass_match_asm_constraints); | |
512 | NEXT_PASS (pass_sms); | |
513 | NEXT_PASS (pass_live_range_shrinkage); | |
514 | NEXT_PASS (pass_sched); | |
515 | NEXT_PASS (pass_rtl_avoid_store_forwarding); | |
516 | NEXT_PASS (pass_early_remat); | |
517 | NEXT_PASS (pass_ira); | |
518 | NEXT_PASS (pass_reload); | |
519 | /* In the following, some passes are tied to 'pass_postreload' and others | |
520 | to 'pass_late_compilation'. The difference is that the latter also | |
521 | run for 'targetm.no_register_allocation' targets. */ | |
522 | NEXT_PASS (pass_postreload); | |
523 | PUSH_INSERT_PASSES_WITHIN (pass_postreload) | |
524 | NEXT_PASS (pass_postreload_cse); | |
525 | NEXT_PASS (pass_late_combine); | |
526 | NEXT_PASS (pass_gcse2); | |
527 | NEXT_PASS (pass_split_after_reload); | |
528 | NEXT_PASS (pass_ree); | |
529 | NEXT_PASS (pass_compare_elim_after_reload); | |
530 | NEXT_PASS (pass_thread_prologue_and_epilogue); | |
531 | NEXT_PASS (pass_rtl_dse2); | |
532 | NEXT_PASS (pass_stack_adjustments); | |
533 | NEXT_PASS (pass_jump2); | |
534 | NEXT_PASS (pass_duplicate_computed_gotos); | |
535 | NEXT_PASS (pass_sched_fusion); | |
536 | NEXT_PASS (pass_peephole2); | |
537 | NEXT_PASS (pass_if_after_reload); | |
538 | NEXT_PASS (pass_regrename); | |
539 | NEXT_PASS (pass_fold_mem_offsets); | |
540 | NEXT_PASS (pass_cprop_hardreg); | |
541 | NEXT_PASS (pass_fast_rtl_dce); | |
542 | NEXT_PASS (pass_reorder_blocks); | |
543 | NEXT_PASS (pass_leaf_regs); | |
544 | NEXT_PASS (pass_split_before_sched2); | |
545 | NEXT_PASS (pass_sched2); | |
546 | NEXT_PASS (pass_stack_regs); | |
547 | PUSH_INSERT_PASSES_WITHIN (pass_stack_regs) | |
548 | NEXT_PASS (pass_split_before_regstack); | |
549 | NEXT_PASS (pass_stack_regs_run); | |
550 | POP_INSERT_PASSES () | |
551 | POP_INSERT_PASSES () | |
552 | NEXT_PASS (pass_late_thread_prologue_and_epilogue); | |
553 | /* No target-independent code motion is allowed beyond this point, | |
554 | excepting the legacy delayed-branch pass. */ | |
555 | NEXT_PASS (pass_late_compilation); | |
556 | PUSH_INSERT_PASSES_WITHIN (pass_late_compilation) | |
557 | NEXT_PASS (pass_zero_call_used_regs); | |
558 | NEXT_PASS (pass_compute_alignments); | |
559 | NEXT_PASS (pass_variable_tracking); | |
560 | NEXT_PASS (pass_free_cfg); | |
561 | NEXT_PASS (pass_machine_reorg); | |
562 | NEXT_PASS (pass_cleanup_barriers); | |
563 | NEXT_PASS (pass_delay_slots); | |
564 | NEXT_PASS (pass_split_for_shorten_branches); | |
565 | NEXT_PASS (pass_convert_to_eh_region_ranges); | |
566 | NEXT_PASS (pass_shorten_branches); | |
567 | NEXT_PASS (pass_set_nothrow_function_flags); | |
568 | NEXT_PASS (pass_dwarf2_frame); | |
569 | NEXT_PASS (pass_final); | |
570 | POP_INSERT_PASSES () | |
571 | NEXT_PASS (pass_df_finish); | |
572 | POP_INSERT_PASSES () | |
573 | NEXT_PASS (pass_clean_state); | |
574 | TERMINATE_PASS_LIST (all_passes) |