]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/passes.c
Change copyright header to refer to version 3 of the GNU General Public License and...
[thirdparty/gcc.git] / gcc / passes.c
CommitLineData
f6db1481
RH
1/* Top level of GCC compilers (cc1, cc1plus, etc.)
2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
e53a16e7
ILT
3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
4 Free Software Foundation, Inc.
f6db1481
RH
5
6This file is part of GCC.
7
8GCC is free software; you can redistribute it and/or modify it under
9the terms of the GNU General Public License as published by the Free
9dcd6f09 10Software Foundation; either version 3, or (at your option) any later
f6db1481
RH
11version.
12
13GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14WARRANTY; without even the implied warranty of MERCHANTABILITY or
15FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16for 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/>. */
f6db1481
RH
21
22/* This is the top level of cc1/c++.
23 It parses command args, opens files, invokes the various passes
24 in the proper order, and counts the time used by each.
25 Error messages and low-level interface to malloc also handled here. */
26
27#include "config.h"
28#undef FLOAT /* This is for hpux. They should change hpux. */
29#undef FFS /* Some systems define this in param.h. */
30#include "system.h"
31#include "coretypes.h"
32#include "tm.h"
33#include <signal.h>
34
35#ifdef HAVE_SYS_RESOURCE_H
36# include <sys/resource.h>
37#endif
38
39#ifdef HAVE_SYS_TIMES_H
40# include <sys/times.h>
41#endif
42
43#include "line-map.h"
44#include "input.h"
45#include "tree.h"
46#include "rtl.h"
47#include "tm_p.h"
48#include "flags.h"
49#include "insn-attr.h"
50#include "insn-config.h"
51#include "insn-flags.h"
52#include "hard-reg-set.h"
53#include "recog.h"
54#include "output.h"
55#include "except.h"
56#include "function.h"
57#include "toplev.h"
58#include "expr.h"
59#include "basic-block.h"
60#include "intl.h"
61#include "ggc.h"
62#include "graph.h"
f6db1481
RH
63#include "regs.h"
64#include "timevar.h"
65#include "diagnostic.h"
66#include "params.h"
67#include "reload.h"
68#include "dwarf2asm.h"
69#include "integrate.h"
70#include "real.h"
71#include "debug.h"
72#include "target.h"
73#include "langhooks.h"
74#include "cfglayout.h"
75#include "cfgloop.h"
76#include "hosthooks.h"
77#include "cgraph.h"
78#include "opts.h"
79#include "coverage.h"
80#include "value-prof.h"
ef330312
PB
81#include "tree-inline.h"
82#include "tree-flow.h"
2f8e398b 83#include "tree-pass.h"
9f8628ba 84#include "tree-dump.h"
6fb5fa3c 85#include "df.h"
45a80bb9 86#include "predict.h"
f6db1481
RH
87
88#if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
89#include "dwarf2out.h"
90#endif
91
97b0ade3 92#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
f6db1481
RH
93#include "dbxout.h"
94#endif
95
96#ifdef SDB_DEBUGGING_INFO
97#include "sdbout.h"
98#endif
99
100#ifdef XCOFF_DEBUGGING_INFO
101#include "xcoffout.h" /* Needed for external data
102 declarations for e.g. AIX 4.x. */
103#endif
104
6fb5fa3c
DB
105/* This is used for debugging. It allows the current pass to printed
106 from anywhere in compilation. */
107struct tree_opt_pass *current_pass;
108
109/* Call from anywhere to find out what pass this is. Useful for
110 printing out debugging information deep inside an service
111 routine. */
112void
113print_current_pass (FILE *file)
114{
115 if (current_pass)
116 fprintf (file, "current pass = %s (%d)\n",
117 current_pass->name, current_pass->static_pass_number);
118 else
119 fprintf (file, "no current pass.\n");
120}
121
122
123/* Call from the debugger to get the current pass name. */
124void
125debug_pass (void)
126{
127 print_current_pass (stderr);
128}
129
130
131
ef330312
PB
132/* Global variables used to communicate with passes. */
133int dump_flags;
134bool in_gimple_form;
b02b9b53 135bool first_pass_instance;
f6db1481 136
f6db1481
RH
137
138/* This is called from various places for FUNCTION_DECL, VAR_DECL,
139 and TYPE_DECL nodes.
140
141 This does nothing for local (non-static) variables, unless the
0e6df31e
GK
142 variable is a register variable with DECL_ASSEMBLER_NAME set. In
143 that case, or if the variable is not an automatic, it sets up the
144 RTL and outputs any assembler code (label definition, storage
145 allocation and initialization).
f6db1481 146
0e6df31e 147 DECL is the declaration. TOP_LEVEL is nonzero
f6db1481
RH
148 if this declaration is not within a function. */
149
150void
151rest_of_decl_compilation (tree decl,
f6db1481
RH
152 int top_level,
153 int at_end)
154{
155 /* We deferred calling assemble_alias so that we could collect
156 other attributes such as visibility. Emit the alias now. */
157 {
158 tree alias;
159 alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl));
160 if (alias)
161 {
162 alias = TREE_VALUE (TREE_VALUE (alias));
163 alias = get_identifier (TREE_STRING_POINTER (alias));
164 assemble_alias (decl, alias);
165 }
166 }
167
0e6df31e
GK
168 /* Can't defer this, because it needs to happen before any
169 later function definitions are processed. */
820cc88f 170 if (DECL_ASSEMBLER_NAME_SET_P (decl) && DECL_REGISTER (decl))
0e6df31e
GK
171 make_decl_rtl (decl);
172
f6db1481
RH
173 /* Forward declarations for nested functions are not "external",
174 but we need to treat them as if they were. */
175 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
176 || TREE_CODE (decl) == FUNCTION_DECL)
177 {
178 timevar_push (TV_VARCONST);
179
f6db1481
RH
180 /* Don't output anything when a tentative file-scope definition
181 is seen. But at end of compilation, do output code for them.
182
183 We do output all variables when unit-at-a-time is active and rely on
184 callgraph code to defer them except for forward declarations
185 (see gcc.c-torture/compile/920624-1.c) */
186 if ((at_end
187 || !DECL_DEFER_OUTPUT (decl)
cd9c7bd2 188 || DECL_INITIAL (decl))
f6db1481
RH
189 && !DECL_EXTERNAL (decl))
190 {
db5f8b93 191 if (TREE_CODE (decl) != FUNCTION_DECL)
8a4a83ed 192 varpool_finalize_decl (decl);
f6db1481
RH
193 else
194 assemble_variable (decl, top_level, at_end, 0);
195 }
196
197#ifdef ASM_FINISH_DECLARE_OBJECT
198 if (decl == last_assemble_variable_decl)
199 {
200 ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
201 top_level, at_end);
202 }
203#endif
204
205 timevar_pop (TV_VARCONST);
206 }
ef11c839
SB
207 else if (TREE_CODE (decl) == TYPE_DECL
208 /* Like in rest_of_type_compilation, avoid confusing the debug
209 information machinery when there are errors. */
210 && !(sorrycount || errorcount))
f6db1481
RH
211 {
212 timevar_push (TV_SYMOUT);
213 debug_hooks->type_decl (decl, !top_level);
214 timevar_pop (TV_SYMOUT);
215 }
e4d5432a 216
aabcd309 217 /* Let cgraph know about the existence of variables. */
e4d5432a 218 if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl))
8a4a83ed 219 varpool_node (decl);
f6db1481
RH
220}
221
222/* Called after finishing a record, union or enumeral type. */
223
224void
225rest_of_type_compilation (tree type, int toplev)
226{
227 /* Avoid confusing the debug information machinery when there are
228 errors. */
229 if (errorcount != 0 || sorrycount != 0)
230 return;
231
232 timevar_push (TV_SYMOUT);
233 debug_hooks->type_decl (TYPE_STUB_DECL (type), !toplev);
234 timevar_pop (TV_SYMOUT);
235}
236
ef330312 237\f
f6db1481 238
ef330312
PB
239void
240finish_optimization_passes (void)
f6db1481 241{
ef330312
PB
242 enum tree_dump_index i;
243 struct dump_file_info *dfi;
244 char *name;
f6db1481 245
ef330312
PB
246 timevar_push (TV_DUMP);
247 if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
f6db1481 248 {
3d47ea88 249 dump_file = dump_begin (pass_profile.static_pass_number, NULL);
ef330312
PB
250 end_branch_prob ();
251 if (dump_file)
3d47ea88 252 dump_end (pass_profile.static_pass_number, dump_file);
f6db1481 253 }
f6db1481 254
ef330312 255 if (optimize > 0)
f6db1481 256 {
ef330312
PB
257 dump_file = dump_begin (pass_combine.static_pass_number, NULL);
258 if (dump_file)
f6db1481 259 {
ef330312
PB
260 dump_combine_total_stats (dump_file);
261 dump_end (pass_combine.static_pass_number, dump_file);
f6db1481
RH
262 }
263 }
264
ef330312
PB
265 /* Do whatever is necessary to finish printing the graphs. */
266 if (graph_dump_format != no_graph)
267 for (i = TDI_end; (dfi = get_dump_file_info (i)) != NULL; ++i)
268 if (dump_initialized_p (i)
5e34206b 269 && (dfi->flags & TDF_GRAPH) != 0
ef330312 270 && (name = get_dump_file_name (i)) != NULL)
5e34206b
JJ
271 {
272 finish_graph_dump_file (name);
273 free (name);
274 }
f6db1481 275
ef330312 276 timevar_pop (TV_DUMP);
f6db1481 277}
f6db1481 278
ef330312
PB
279static bool
280gate_rest_of_compilation (void)
f6db1481 281{
ef330312
PB
282 /* Early return if there were errors. We can run afoul of our
283 consistency checks, and there's not really much point in fixing them. */
284 return !(rtl_dump_and_exit || flag_syntax_only || errorcount || sorrycount);
f6db1481
RH
285}
286
ef330312 287struct tree_opt_pass pass_rest_of_compilation =
f6db1481 288{
ef330312
PB
289 NULL, /* name */
290 gate_rest_of_compilation, /* gate */
291 NULL, /* execute */
292 NULL, /* sub */
293 NULL, /* next */
294 0, /* static_pass_number */
295 TV_REST_OF_COMPILATION, /* tv_id */
296 PROP_rtl, /* properties_required */
297 0, /* properties_provided */
298 0, /* properties_destroyed */
299 0, /* todo_flags_start */
300 TODO_ggc_collect, /* todo_flags_finish */
301 0 /* letter */
302};
f6db1481 303
ef330312
PB
304static bool
305gate_postreload (void)
306{
307 return reload_completed;
f6db1481
RH
308}
309
ef330312 310struct tree_opt_pass pass_postreload =
f6db1481 311{
ef330312
PB
312 NULL, /* name */
313 gate_postreload, /* gate */
314 NULL, /* execute */
315 NULL, /* sub */
316 NULL, /* next */
317 0, /* static_pass_number */
318 0, /* tv_id */
319 PROP_rtl, /* properties_required */
320 0, /* properties_provided */
321 0, /* properties_destroyed */
322 0, /* todo_flags_start */
323 TODO_ggc_collect, /* todo_flags_finish */
324 0 /* letter */
325};
f6db1481 326
97b0ade3 327
f6db1481 328
ef330312
PB
329/* The root of the compilation pass tree, once constructed. */
330struct tree_opt_pass *all_passes, *all_ipa_passes, *all_lowering_passes;
f6db1481 331
ef330312
PB
332/* Iterate over the pass tree allocating dump file numbers. We want
333 to do this depth first, and independent of whether the pass is
334 enabled or not. */
f6db1481 335
ef330312 336static void
bbbe4e7b 337register_one_dump_file (struct tree_opt_pass *pass, bool ipa, int properties)
ef330312
PB
338{
339 char *dot_name, *flag_name, *glob_name;
bbbe4e7b 340 const char *prefix;
ef330312 341 char num[10];
bbbe4e7b 342 int flags;
f6db1481 343
ef330312
PB
344 /* See below in next_pass_1. */
345 num[0] = '\0';
346 if (pass->static_pass_number != -1)
347 sprintf (num, "%d", ((int) pass->static_pass_number < 0
348 ? 1 : pass->static_pass_number));
f6db1481 349
ef330312
PB
350 dot_name = concat (".", pass->name, num, NULL);
351 if (ipa)
bbbe4e7b
PB
352 prefix = "ipa-", flags = TDF_IPA;
353 else if (properties & PROP_trees)
354 prefix = "tree-", flags = TDF_TREE;
f6db1481 355 else
bbbe4e7b
PB
356 prefix = "rtl-", flags = TDF_RTL;
357
358 flag_name = concat (prefix, pass->name, num, NULL);
359 glob_name = concat (prefix, pass->name, NULL);
360 pass->static_pass_number = dump_register (dot_name, flag_name, glob_name,
361 flags, pass->letter);
97b0ade3
PB
362}
363
bbbe4e7b
PB
364/* Recursive worker function for register_dump_files. */
365
ef330312 366static int
bbbe4e7b 367register_dump_files_1 (struct tree_opt_pass *pass, bool ipa, int properties)
97b0ade3 368{
ef330312
PB
369 do
370 {
bbbe4e7b
PB
371 int new_properties = (properties | pass->properties_provided)
372 & ~pass->properties_destroyed;
f6db1481 373
ef330312 374 if (pass->name)
bbbe4e7b 375 register_one_dump_file (pass, ipa, new_properties);
f6db1481 376
ef330312 377 if (pass->sub)
bbbe4e7b
PB
378 new_properties = register_dump_files_1 (pass->sub, false,
379 new_properties);
f6db1481 380
ef330312
PB
381 /* If we have a gate, combine the properties that we could have with
382 and without the pass being examined. */
383 if (pass->gate)
384 properties &= new_properties;
385 else
386 properties = new_properties;
f6db1481 387
ef330312 388 pass = pass->next;
f6db1481 389 }
ef330312 390 while (pass);
f6db1481 391
ef330312 392 return properties;
f6db1481 393}
f9957958 394
bbbe4e7b
PB
395/* Register the dump files for the pipeline starting at PASS. IPA is
396 true if the pass is inter-procedural, and PROPERTIES reflects the
c0220ea4 397 properties that are guaranteed to be available at the beginning of
bbbe4e7b
PB
398 the pipeline. */
399
400static void
401register_dump_files (struct tree_opt_pass *pass, bool ipa, int properties)
402{
403 pass->properties_required |= properties;
bbbe4e7b
PB
404 register_dump_files_1 (pass, ipa, properties);
405}
406
ef330312
PB
407/* Add a pass to the pass list. Duplicate the pass if it's already
408 in the list. */
f9957958 409
ef330312
PB
410static struct tree_opt_pass **
411next_pass_1 (struct tree_opt_pass **list, struct tree_opt_pass *pass)
f6db1481 412{
ef330312
PB
413 /* A nonzero static_pass_number indicates that the
414 pass is already in the list. */
415 if (pass->static_pass_number)
416 {
417 struct tree_opt_pass *new;
f6db1481 418
ef330312
PB
419 new = xmalloc (sizeof (*new));
420 memcpy (new, pass, sizeof (*new));
3d882990 421 new->next = NULL;
f6db1481 422
b02b9b53
ZD
423 new->todo_flags_start &= ~TODO_mark_first_instance;
424
ef330312
PB
425 /* Indicate to register_dump_files that this pass has duplicates,
426 and so it should rename the dump file. The first instance will
427 be -1, and be number of duplicates = -static_pass_number - 1.
428 Subsequent instances will be > 0 and just the duplicate number. */
429 if (pass->name)
430 {
431 pass->static_pass_number -= 1;
432 new->static_pass_number = -pass->static_pass_number;
433 }
434
435 *list = new;
436 }
437 else
438 {
b02b9b53 439 pass->todo_flags_start |= TODO_mark_first_instance;
ef330312
PB
440 pass->static_pass_number = -1;
441 *list = pass;
442 }
443
444 return &(*list)->next;
445
f6db1481
RH
446}
447
6fb5fa3c 448
dd97d271
DN
449/* Construct the pass tree. The sequencing of passes is driven by
450 the cgraph routines:
451
452 cgraph_finalize_compilation_unit ()
453 for each node N in the cgraph
454 cgraph_analyze_function (N)
455 cgraph_lower_function (N) -> all_lowering_passes
456
457 If we are optimizing, cgraph_optimize is then invoked:
458
459 cgraph_optimize ()
460 ipa_passes () -> all_ipa_passes
461 cgraph_expand_all_functions ()
462 for each node N in the cgraph
463 cgraph_expand_function (N)
dd97d271
DN
464 lang_hooks.callgraph.expand_function (DECL (N))
465 tree_rest_of_compilation (DECL (N)) -> all_passes
466*/
97b0ade3 467
ef330312
PB
468void
469init_optimization_passes (void)
470{
471 struct tree_opt_pass **p;
472
473#define NEXT_PASS(PASS) (p = next_pass_1 (p, &PASS))
873aa8f5 474
f1bd2543
JH
475 /* All passes needed to lower the function into shape optimizers can
476 operate on. These passes are always run first on the function, but
477 backend might produce already lowered functions that are not processed
478 by these passes. */
ef330312
PB
479 p = &all_lowering_passes;
480 NEXT_PASS (pass_remove_useless_stmts);
481 NEXT_PASS (pass_mudflap_1);
953ff289 482 NEXT_PASS (pass_lower_omp);
ef330312
PB
483 NEXT_PASS (pass_lower_cf);
484 NEXT_PASS (pass_lower_eh);
485 NEXT_PASS (pass_build_cfg);
486 NEXT_PASS (pass_lower_complex_O0);
487 NEXT_PASS (pass_lower_vector);
488 NEXT_PASS (pass_warn_function_return);
2dee695b 489 NEXT_PASS (pass_build_cgraph_edges);
873aa8f5 490 NEXT_PASS (pass_inline_parameters);
ef330312
PB
491 *p = NULL;
492
f1bd2543
JH
493 /* Interprocedural optimization passes.
494 All these passes are ignored in -fno-unit-at-a-time
44c7bd63 495 except for subpasses of early_local_passes. */
f1bd2543
JH
496 p = &all_ipa_passes;
497 NEXT_PASS (pass_ipa_function_and_variable_visibility);
498 NEXT_PASS (pass_ipa_early_inline);
499 {
500 struct tree_opt_pass **p = &pass_ipa_early_inline.sub;
501 NEXT_PASS (pass_early_inline);
502 NEXT_PASS (pass_inline_parameters);
503 NEXT_PASS (pass_rebuild_cgraph_edges);
504 }
505 NEXT_PASS (pass_early_local_passes);
506 {
507 struct tree_opt_pass **p = &pass_early_local_passes.sub;
508 NEXT_PASS (pass_tree_profile);
509 NEXT_PASS (pass_cleanup_cfg);
510 NEXT_PASS (pass_init_datastructures);
511 NEXT_PASS (pass_expand_omp);
512 NEXT_PASS (pass_all_early_optimizations);
513 {
514 struct tree_opt_pass **p = &pass_all_early_optimizations.sub;
515 NEXT_PASS (pass_referenced_vars);
516 NEXT_PASS (pass_reset_cc_flags);
517 NEXT_PASS (pass_build_ssa);
518 NEXT_PASS (pass_early_warn_uninitialized);
519 NEXT_PASS (pass_rebuild_cgraph_edges);
520 NEXT_PASS (pass_early_inline);
521 NEXT_PASS (pass_cleanup_cfg);
522 NEXT_PASS (pass_rename_ssa_copies);
523 NEXT_PASS (pass_ccp);
524 NEXT_PASS (pass_forwprop);
029f45bd 525 NEXT_PASS (pass_sra_early);
f1bd2543
JH
526 NEXT_PASS (pass_copy_prop);
527 NEXT_PASS (pass_merge_phi);
528 NEXT_PASS (pass_dce);
529 NEXT_PASS (pass_tail_recursion);
45a80bb9 530 NEXT_PASS (pass_profile);
f1bd2543
JH
531 NEXT_PASS (pass_release_ssa_names);
532 }
533 NEXT_PASS (pass_rebuild_cgraph_edges);
534 NEXT_PASS (pass_inline_parameters);
535 }
536 NEXT_PASS (pass_ipa_increase_alignment);
43d861a5 537 NEXT_PASS (pass_ipa_matrix_reorg);
f1bd2543
JH
538 NEXT_PASS (pass_ipa_cp);
539 NEXT_PASS (pass_ipa_inline);
540 NEXT_PASS (pass_ipa_reference);
541 NEXT_PASS (pass_ipa_pure_const);
542 NEXT_PASS (pass_ipa_type_escape);
543 NEXT_PASS (pass_ipa_pta);
7a388ee4
JH
544 *p = NULL;
545
b3f7d793
DN
546 /* These passes are run after IPA passes on every function that is being
547 output to the assembler file. */
ef330312 548 p = &all_passes;
873aa8f5 549 NEXT_PASS (pass_apply_inline);
ef330312 550 NEXT_PASS (pass_all_optimizations);
f1bd2543
JH
551 {
552 struct tree_opt_pass **p = &pass_all_optimizations.sub;
553 NEXT_PASS (pass_create_structure_vars);
554 NEXT_PASS (pass_may_alias);
555 NEXT_PASS (pass_return_slot);
556 NEXT_PASS (pass_rename_ssa_copies);
557
558 /* Initial scalar cleanups. */
559 NEXT_PASS (pass_ccp);
3b48ccbc 560 NEXT_PASS (pass_phiprop);
f1bd2543
JH
561 NEXT_PASS (pass_fre);
562 NEXT_PASS (pass_dce);
563 NEXT_PASS (pass_forwprop);
564 NEXT_PASS (pass_copy_prop);
565 NEXT_PASS (pass_merge_phi);
566 NEXT_PASS (pass_vrp);
567 NEXT_PASS (pass_dce);
568 NEXT_PASS (pass_dominator);
569
570 /* The only const/copy propagation opportunities left after
571 DOM should be due to degenerate PHI nodes. So rather than
572 run the full propagators, run a specialized pass which
573 only examines PHIs to discover const/copy propagation
574 opportunities. */
575 NEXT_PASS (pass_phi_only_cprop);
576
18d08014 577 NEXT_PASS (pass_tree_ifcombine);
f1bd2543
JH
578 NEXT_PASS (pass_phiopt);
579 NEXT_PASS (pass_may_alias);
580 NEXT_PASS (pass_tail_recursion);
f1bd2543
JH
581 NEXT_PASS (pass_ch);
582 NEXT_PASS (pass_stdarg);
583 NEXT_PASS (pass_lower_complex);
584 NEXT_PASS (pass_sra);
585 /* FIXME: SRA may generate arbitrary gimple code, exposing new
586 aliased and call-clobbered variables. As mentioned below,
587 pass_may_alias should be a TODO item. */
588 NEXT_PASS (pass_may_alias);
589 NEXT_PASS (pass_rename_ssa_copies);
590 NEXT_PASS (pass_dominator);
591
592 /* The only const/copy propagation opportunities left after
593 DOM should be due to degenerate PHI nodes. So rather than
594 run the full propagators, run a specialized pass which
595 only examines PHIs to discover const/copy propagation
596 opportunities. */
597 NEXT_PASS (pass_phi_only_cprop);
598
599 NEXT_PASS (pass_reassoc);
600 NEXT_PASS (pass_dce);
601 NEXT_PASS (pass_dse);
602 NEXT_PASS (pass_may_alias);
603 NEXT_PASS (pass_forwprop);
604 NEXT_PASS (pass_phiopt);
605 NEXT_PASS (pass_object_sizes);
606 NEXT_PASS (pass_store_ccp);
607 NEXT_PASS (pass_store_copy_prop);
608 NEXT_PASS (pass_fold_builtins);
609 NEXT_PASS (pass_cse_sincos);
610 /* FIXME: May alias should a TODO but for 4.0.0,
611 we add may_alias right after fold builtins
612 which can create arbitrary GIMPLE. */
613 NEXT_PASS (pass_may_alias);
614 NEXT_PASS (pass_split_crit_edges);
615 NEXT_PASS (pass_pre);
616 NEXT_PASS (pass_may_alias);
617 NEXT_PASS (pass_sink_code);
618 NEXT_PASS (pass_tree_loop);
619 {
620 struct tree_opt_pass **p = &pass_tree_loop.sub;
621 NEXT_PASS (pass_tree_loop_init);
622 NEXT_PASS (pass_copy_prop);
bbc8a8dc 623 NEXT_PASS (pass_dce_loop);
f1bd2543 624 NEXT_PASS (pass_lim);
bbc8a8dc 625 NEXT_PASS (pass_predcom);
f1bd2543
JH
626 NEXT_PASS (pass_tree_unswitch);
627 NEXT_PASS (pass_scev_cprop);
628 NEXT_PASS (pass_empty_loop);
629 NEXT_PASS (pass_record_bounds);
3d8864c0 630 NEXT_PASS (pass_check_data_deps);
f1bd2543
JH
631 NEXT_PASS (pass_linear_transform);
632 NEXT_PASS (pass_iv_canon);
633 NEXT_PASS (pass_if_conversion);
634 NEXT_PASS (pass_vectorize);
635 {
636 struct tree_opt_pass **p = &pass_vectorize.sub;
637 NEXT_PASS (pass_lower_vector_ssa);
638 NEXT_PASS (pass_dce_loop);
639 }
640 /* NEXT_PASS (pass_may_alias) cannot be done again because the
641 vectorizer creates alias relations that are not supported by
642 pass_may_alias. */
643 NEXT_PASS (pass_complete_unroll);
644 NEXT_PASS (pass_loop_prefetch);
645 NEXT_PASS (pass_iv_optimize);
646 NEXT_PASS (pass_tree_loop_done);
647 }
648 NEXT_PASS (pass_cse_reciprocals);
6b889d89 649 NEXT_PASS (pass_convert_to_rsqrt);
f1bd2543
JH
650 NEXT_PASS (pass_reassoc);
651 NEXT_PASS (pass_vrp);
652 NEXT_PASS (pass_dominator);
653
654 /* The only const/copy propagation opportunities left after
655 DOM should be due to degenerate PHI nodes. So rather than
656 run the full propagators, run a specialized pass which
657 only examines PHIs to discover const/copy propagation
658 opportunities. */
659 NEXT_PASS (pass_phi_only_cprop);
660
661 NEXT_PASS (pass_cd_dce);
662
663 /* FIXME: If DCE is not run before checking for uninitialized uses,
664 we may get false warnings (e.g., testsuite/gcc.dg/uninit-5.c).
665 However, this also causes us to misdiagnose cases that should be
666 real warnings (e.g., testsuite/gcc.dg/pr18501.c).
667
668 To fix the false positives in uninit-5.c, we would have to
669 account for the predicates protecting the set and the use of each
670 variable. Using a representation like Gated Single Assignment
671 may help. */
672 NEXT_PASS (pass_late_warn_uninitialized);
673 NEXT_PASS (pass_dse);
674 NEXT_PASS (pass_forwprop);
675 NEXT_PASS (pass_phiopt);
676 NEXT_PASS (pass_tail_calls);
677 NEXT_PASS (pass_rename_ssa_copies);
678 NEXT_PASS (pass_uncprop);
679 NEXT_PASS (pass_del_ssa);
680 NEXT_PASS (pass_nrv);
681 NEXT_PASS (pass_mark_used_blocks);
682 NEXT_PASS (pass_cleanup_cfg_post_optimizing);
683 }
ef330312 684 NEXT_PASS (pass_warn_function_noreturn);
ef330312 685 NEXT_PASS (pass_free_datastructures);
ed1a2abd 686 NEXT_PASS (pass_mudflap_2);
ef330312
PB
687 NEXT_PASS (pass_free_cfg_annotations);
688 NEXT_PASS (pass_expand);
689 NEXT_PASS (pass_rest_of_compilation);
f1bd2543
JH
690 {
691 struct tree_opt_pass **p = &pass_rest_of_compilation.sub;
692 NEXT_PASS (pass_init_function);
693 NEXT_PASS (pass_jump);
f1bd2543
JH
694 NEXT_PASS (pass_rtl_eh);
695 NEXT_PASS (pass_initial_value_sets);
696 NEXT_PASS (pass_unshare_all_rtl);
697 NEXT_PASS (pass_instantiate_virtual_regs);
dacb3cda 698 NEXT_PASS (pass_into_cfg_layout_mode);
f1bd2543
JH
699 NEXT_PASS (pass_jump2);
700 NEXT_PASS (pass_lower_subreg);
6fb5fa3c 701 NEXT_PASS (pass_df_initialize_opt);
f1bd2543
JH
702 NEXT_PASS (pass_cse);
703 NEXT_PASS (pass_rtl_fwprop);
704 NEXT_PASS (pass_gcse);
f1bd2543
JH
705 NEXT_PASS (pass_rtl_ifcvt);
706 NEXT_PASS (pass_tracer);
707 /* Perform loop optimizations. It might be better to do them a bit
708 sooner, but we want the profile feedback to work more
709 efficiently. */
710 NEXT_PASS (pass_loop2);
711 {
712 struct tree_opt_pass **p = &pass_loop2.sub;
713 NEXT_PASS (pass_rtl_loop_init);
714 NEXT_PASS (pass_rtl_move_loop_invariants);
715 NEXT_PASS (pass_rtl_unswitch);
716 NEXT_PASS (pass_rtl_unroll_and_peel_loops);
717 NEXT_PASS (pass_rtl_doloop);
718 NEXT_PASS (pass_rtl_loop_done);
719 *p = NULL;
720 }
721 NEXT_PASS (pass_web);
bae8b6b2 722 NEXT_PASS (pass_jump_bypass);
f1bd2543 723 NEXT_PASS (pass_cse2);
6fb5fa3c 724 NEXT_PASS (pass_rtl_dse1);
f1bd2543 725 NEXT_PASS (pass_rtl_fwprop_addr);
6fb5fa3c
DB
726 NEXT_PASS (pass_regclass_init);
727 NEXT_PASS (pass_inc_dec);
728 NEXT_PASS (pass_initialize_regs);
ad21dab7 729 NEXT_PASS (pass_outof_cfg_layout_mode);
6fb5fa3c 730 NEXT_PASS (pass_ud_rtl_dce);
f1bd2543
JH
731 NEXT_PASS (pass_combine);
732 NEXT_PASS (pass_if_after_combine);
733 NEXT_PASS (pass_partition_blocks);
734 NEXT_PASS (pass_regmove);
735 NEXT_PASS (pass_split_all_insns);
736 NEXT_PASS (pass_lower_subreg2);
6fb5fa3c
DB
737 NEXT_PASS (pass_df_initialize_no_opt);
738 NEXT_PASS (pass_stack_ptr_mod);
f1bd2543
JH
739 NEXT_PASS (pass_mode_switching);
740 NEXT_PASS (pass_see);
d8d72314 741 NEXT_PASS (pass_match_asm_constraints);
f1bd2543
JH
742 NEXT_PASS (pass_sms);
743 NEXT_PASS (pass_sched);
6fb5fa3c 744 NEXT_PASS (pass_subregs_of_mode_init);
f1bd2543
JH
745 NEXT_PASS (pass_local_alloc);
746 NEXT_PASS (pass_global_alloc);
6fb5fa3c 747 NEXT_PASS (pass_subregs_of_mode_finish);
f1bd2543
JH
748 NEXT_PASS (pass_postreload);
749 {
750 struct tree_opt_pass **p = &pass_postreload.sub;
751 NEXT_PASS (pass_postreload_cse);
752 NEXT_PASS (pass_gcse2);
6fb5fa3c
DB
753 NEXT_PASS (pass_split_after_reload);
754 NEXT_PASS (pass_branch_target_load_optimize1);
755 NEXT_PASS (pass_thread_prologue_and_epilogue);
756 NEXT_PASS (pass_rtl_dse2);
f1bd2543
JH
757 NEXT_PASS (pass_rtl_seqabstr);
758 NEXT_PASS (pass_stack_adjustments);
759 NEXT_PASS (pass_peephole2);
760 NEXT_PASS (pass_if_after_reload);
761 NEXT_PASS (pass_regrename);
6fb5fa3c
DB
762 NEXT_PASS (pass_cprop_hardreg);
763 NEXT_PASS (pass_fast_rtl_dce);
f1bd2543 764 NEXT_PASS (pass_reorder_blocks);
6fb5fa3c 765 NEXT_PASS (pass_branch_target_load_optimize2);
f1bd2543 766 NEXT_PASS (pass_leaf_regs);
6fb5fa3c 767 NEXT_PASS (pass_split_before_sched2);
f1bd2543 768 NEXT_PASS (pass_sched2);
f1bd2543 769 NEXT_PASS (pass_stack_regs);
6fb5fa3c
DB
770 {
771 struct tree_opt_pass **p = &pass_stack_regs.sub;
772 NEXT_PASS (pass_split_before_regstack);
773 NEXT_PASS (pass_stack_regs_run);
774 }
f1bd2543
JH
775 NEXT_PASS (pass_compute_alignments);
776 NEXT_PASS (pass_duplicate_computed_gotos);
777 NEXT_PASS (pass_variable_tracking);
778 NEXT_PASS (pass_free_cfg);
779 NEXT_PASS (pass_machine_reorg);
780 NEXT_PASS (pass_cleanup_barriers);
781 NEXT_PASS (pass_delay_slots);
6fb5fa3c 782 NEXT_PASS (pass_df_finish);
f1bd2543
JH
783 NEXT_PASS (pass_split_for_shorten_branches);
784 NEXT_PASS (pass_convert_to_eh_region_ranges);
785 NEXT_PASS (pass_shorten_branches);
786 NEXT_PASS (pass_set_nothrow_function_flags);
787 NEXT_PASS (pass_final);
788 }
789 }
ef330312
PB
790 NEXT_PASS (pass_clean_state);
791 *p = NULL;
792
ef330312
PB
793#undef NEXT_PASS
794
795 /* Register the passes with the tree dump code. */
a5093353
JH
796 register_dump_files (all_lowering_passes, false, PROP_gimple_any);
797 all_lowering_passes->todo_flags_start |= TODO_set_props;
bbbe4e7b
PB
798 register_dump_files (all_ipa_passes, true,
799 PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
800 | PROP_cfg);
bbbe4e7b
PB
801 register_dump_files (all_passes, false,
802 PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
803 | PROP_cfg);
ef330312
PB
804}
805
a5093353
JH
806/* If we are in IPA mode (i.e., current_function_decl is NULL), call
807 function CALLBACK for every function in the call graph. Otherwise,
808 call CALLBACK on the current function. */
bbbe4e7b 809
ef330312 810static void
a5093353 811do_per_function (void (*callback) (void *data), void *data)
ef330312 812{
a5093353
JH
813 if (current_function_decl)
814 callback (data);
815 else
816 {
817 struct cgraph_node *node;
818 for (node = cgraph_nodes; node; node = node->next)
819 if (node->analyzed)
820 {
821 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
822 current_function_decl = node->decl;
823 callback (data);
824 free_dominance_info (CDI_DOMINATORS);
825 free_dominance_info (CDI_POST_DOMINATORS);
826 current_function_decl = NULL;
827 pop_cfun ();
828 ggc_collect ();
829 }
830 }
831}
832
873aa8f5
JH
833/* Because inlining might remove no-longer reachable nodes, we need to
834 keep the array visible to garbage collector to avoid reading collected
835 out nodes. */
836static int nnodes;
837static GTY ((length ("nnodes"))) struct cgraph_node **order;
838
839/* If we are in IPA mode (i.e., current_function_decl is NULL), call
840 function CALLBACK for every function in the call graph. Otherwise,
841 call CALLBACK on the current function. */
842
843static void
844do_per_function_toporder (void (*callback) (void *data), void *data)
845{
846 int i;
847
848 if (current_function_decl)
849 callback (data);
850 else
851 {
852 gcc_assert (!order);
853 order = ggc_alloc (sizeof (*order) * cgraph_n_nodes);
854 nnodes = cgraph_postorder (order);
855 for (i = nnodes - 1; i >= 0; i--)
856 {
857 struct cgraph_node *node = order[i];
858
859 /* Allow possibly removed nodes to be garbage collected. */
860 order[i] = NULL;
861 if (node->analyzed && (node->needed || node->reachable))
862 {
863 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
864 current_function_decl = node->decl;
865 callback (data);
866 free_dominance_info (CDI_DOMINATORS);
867 free_dominance_info (CDI_POST_DOMINATORS);
868 current_function_decl = NULL;
869 pop_cfun ();
870 ggc_collect ();
871 }
872 }
873 }
874 ggc_free (order);
875 order = NULL;
876 nnodes = 0;
877}
878
a5093353 879/* Perform all TODO actions that ought to be done on each function. */
ef330312 880
a5093353
JH
881static void
882execute_function_todo (void *data)
883{
884 unsigned int flags = (size_t)data;
885 if (cfun->curr_properties & PROP_ssa)
bbbe4e7b 886 flags |= TODO_verify_ssa;
a5093353 887 flags &= ~cfun->last_verified;
bbbe4e7b
PB
888 if (!flags)
889 return;
a6c550f9 890
1994bfea 891 /* Always cleanup the CFG before trying to update SSA. */
ef330312
PB
892 if (flags & TODO_cleanup_cfg)
893 {
1994bfea
JH
894 bool cleanup;
895
ef330312 896 if (current_loops)
1994bfea 897 cleanup = cleanup_tree_cfg_loop ();
ef330312 898 else
1994bfea 899 cleanup = cleanup_tree_cfg ();
c4f548b8 900
1994bfea
JH
901 if (cleanup && (cfun->curr_properties & PROP_ssa))
902 flags |= TODO_remove_unused_locals;
903
c4f548b8
DN
904 /* When cleanup_tree_cfg merges consecutive blocks, it may
905 perform some simplistic propagation when removing single
906 valued PHI nodes. This propagation may, in turn, cause the
907 SSA form to become out-of-date (see PR 22037). So, even
908 if the parent pass had not scheduled an SSA update, we may
909 still need to do one. */
910 if (!(flags & TODO_update_ssa_any) && need_ssa_update_p ())
911 flags |= TODO_update_ssa;
ef330312 912 }
f6db1481 913
563cb6be
DN
914 if (flags & TODO_update_ssa_any)
915 {
916 unsigned update_flags = flags & TODO_update_ssa_any;
917 update_ssa (update_flags);
a5093353 918 cfun->last_verified &= ~TODO_verify_ssa;
563cb6be
DN
919 }
920
3f519b35
RG
921 if (flags & TODO_remove_unused_locals)
922 remove_unused_locals ();
923
ef330312
PB
924 if ((flags & TODO_dump_func)
925 && dump_file && current_function_decl)
926 {
a5093353 927 if (cfun->curr_properties & PROP_trees)
ef330312
PB
928 dump_function_to_file (current_function_decl,
929 dump_file, dump_flags);
a68e7e6c 930 else
5e34206b 931 {
a68e7e6c
PB
932 if (dump_flags & TDF_SLIM)
933 print_rtl_slim_with_bb (dump_file, get_insns (), dump_flags);
a5093353
JH
934 else if ((cfun->curr_properties & PROP_cfg)
935 && (dump_flags & TDF_BLOCKS))
a68e7e6c
PB
936 print_rtl_with_bb (dump_file, get_insns ());
937 else
938 print_rtl (dump_file, get_insns ());
939
a5093353 940 if (cfun->curr_properties & PROP_cfg
a68e7e6c 941 && graph_dump_format != no_graph
5e34206b
JJ
942 && (dump_flags & TDF_GRAPH))
943 print_rtl_graph_with_bb (dump_file_name, get_insns ());
944 }
ef330312
PB
945
946 /* Flush the file. If verification fails, we won't be able to
947 close the file before aborting. */
948 fflush (dump_file);
949 }
a5093353 950
45a80bb9
JH
951 if (flags & TODO_rebuild_frequencies)
952 {
953 if (profile_status == PROFILE_GUESSED)
954 {
955 loop_optimizer_init (0);
956 add_noreturn_fake_exit_edges ();
957 mark_irreducible_loops ();
958 connect_infinite_loops_to_exit ();
959 estimate_bb_frequencies ();
960 remove_fake_exit_edges ();
961 loop_optimizer_finalize ();
962 }
963 else if (profile_status == PROFILE_READ)
964 counts_to_freqs ();
965 else
966 gcc_unreachable ();
967 }
968
a5093353
JH
969#if defined ENABLE_CHECKING
970 if (flags & TODO_verify_ssa)
971 verify_ssa (true);
972 if (flags & TODO_verify_flow)
973 verify_flow_info ();
974 if (flags & TODO_verify_stmts)
975 verify_stmts ();
976 if (flags & TODO_verify_loops)
977 verify_loop_closed_ssa ();
978#endif
979
980 cfun->last_verified = flags & TODO_verify_all;
981}
982
983/* Perform all TODO actions. */
984static void
985execute_todo (unsigned int flags)
986{
987#if defined ENABLE_CHECKING
988 if (need_ssa_update_p ())
989 gcc_assert (flags & TODO_update_ssa_any);
990#endif
991
b02b9b53
ZD
992 /* Inform the pass whether it is the first time it is run. */
993 first_pass_instance = (flags & TODO_mark_first_instance) != 0;
994
a5093353
JH
995 do_per_function (execute_function_todo, (void *)(size_t) flags);
996
f4b3ca72
JH
997 /* Always remove functions just as before inlining: IPA passes might be
998 interested to see bodies of extern inline functions that are not inlined
999 to analyze side effects. The full removal is done just at the end
1000 of IPA pass queue. */
1001 if (flags & TODO_remove_functions)
1002 cgraph_remove_unreachable_nodes (true, dump_file);
1003
ef330312
PB
1004 if ((flags & TODO_dump_cgraph)
1005 && dump_file && !current_function_decl)
1006 {
1007 dump_cgraph (dump_file);
1008 /* Flush the file. If verification fails, we won't be able to
1009 close the file before aborting. */
1010 fflush (dump_file);
1011 }
f6db1481 1012
ef330312
PB
1013 if (flags & TODO_ggc_collect)
1014 {
1015 ggc_collect ();
1016 }
6fb5fa3c
DB
1017
1018 /* Now that the dumping has been done, we can get rid of the optional
1019 df problems. */
1020 if (flags & TODO_df_finish)
1021 df_finish_pass ();
a5093353 1022}
97b0ade3 1023
6ac01510
ILT
1024/* Verify invariants that should hold between passes. This is a place
1025 to put simple sanity checks. */
1026
1027static void
1028verify_interpass_invariants (void)
1029{
1030#ifdef ENABLE_CHECKING
1031 gcc_assert (!fold_deferring_overflow_warnings_p ());
1032#endif
1033}
1034
a5093353
JH
1035/* Clear the last verified flag. */
1036
1037static void
1038clear_last_verified (void *data ATTRIBUTE_UNUSED)
1039{
1040 cfun->last_verified = 0;
1041}
1042
1043/* Helper function. Verify that the properties has been turn into the
1044 properties expected by the pass. */
bbbe4e7b 1045
582fd9ce 1046#ifdef ENABLE_CHECKING
a5093353
JH
1047static void
1048verify_curr_properties (void *data)
1049{
1050 unsigned int props = (size_t)data;
1051 gcc_assert ((cfun->curr_properties & props) == props);
1052}
582fd9ce 1053#endif
a5093353
JH
1054
1055/* After executing the pass, apply expected changes to the function
1056 properties. */
1057static void
1058update_properties_after_pass (void *data)
1059{
1060 struct tree_opt_pass *pass = data;
1061 cfun->curr_properties = (cfun->curr_properties | pass->properties_provided)
1062 & ~pass->properties_destroyed;
f6db1481
RH
1063}
1064
ef330312
PB
1065static bool
1066execute_one_pass (struct tree_opt_pass *pass)
f6db1481 1067{
bbbe4e7b 1068 bool initializing_dump;
c2924966 1069 unsigned int todo_after = 0;
97b0ade3 1070
6fb5fa3c 1071 current_pass = pass;
ef330312
PB
1072 /* See if we're supposed to run this pass. */
1073 if (pass->gate && !pass->gate ())
1074 return false;
f6db1481 1075
873aa8f5
JH
1076 if (!quiet_flag && !cfun)
1077 fprintf (stderr, " <%s>", pass->name ? pass->name : "");
1078
bbbe4e7b 1079 if (pass->todo_flags_start & TODO_set_props)
a5093353 1080 cfun->curr_properties = pass->properties_required;
bbbe4e7b 1081
ef330312
PB
1082 /* Note that the folders should only create gimple expressions.
1083 This is a hack until the new folder is ready. */
a5093353 1084 in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
f6db1481 1085
ef330312 1086 /* Run pre-pass verification. */
bbbe4e7b
PB
1087 execute_todo (pass->todo_flags_start);
1088
a5093353
JH
1089#ifdef ENABLE_CHECKING
1090 do_per_function (verify_curr_properties,
1091 (void *)(size_t)pass->properties_required);
1092#endif
f6db1481 1093
ef330312
PB
1094 /* If a dump file name is present, open it if enabled. */
1095 if (pass->static_pass_number != -1)
1096 {
bbbe4e7b 1097 initializing_dump = !dump_initialized_p (pass->static_pass_number);
ef330312
PB
1098 dump_file_name = get_dump_file_name (pass->static_pass_number);
1099 dump_file = dump_begin (pass->static_pass_number, &dump_flags);
1100 if (dump_file && current_function_decl)
1101 {
1102 const char *dname, *aname;
1103 dname = lang_hooks.decl_printable_name (current_function_decl, 2);
1104 aname = (IDENTIFIER_POINTER
1105 (DECL_ASSEMBLER_NAME (current_function_decl)));
1106 fprintf (dump_file, "\n;; Function %s (%s)%s\n\n", dname, aname,
1107 cfun->function_frequency == FUNCTION_FREQUENCY_HOT
1108 ? " (hot)"
1109 : cfun->function_frequency == FUNCTION_FREQUENCY_UNLIKELY_EXECUTED
1110 ? " (unlikely executed)"
1111 : "");
1112 }
ef330312 1113 }
bbbe4e7b
PB
1114 else
1115 initializing_dump = false;
f6db1481 1116
ef330312
PB
1117 /* If a timevar is present, start it. */
1118 if (pass->tv_id)
1119 timevar_push (pass->tv_id);
f6db1481 1120
ef330312
PB
1121 /* Do it! */
1122 if (pass->execute)
bbbe4e7b 1123 {
c2924966 1124 todo_after = pass->execute ();
a5093353 1125 do_per_function (clear_last_verified, NULL);
bbbe4e7b 1126 }
f6db1481 1127
ef330312
PB
1128 /* Stop timevar. */
1129 if (pass->tv_id)
1130 timevar_pop (pass->tv_id);
f6db1481 1131
a5093353 1132 do_per_function (update_properties_after_pass, pass);
bbbe4e7b
PB
1133
1134 if (initializing_dump
1135 && dump_file
1136 && graph_dump_format != no_graph
a5093353
JH
1137 && (cfun->curr_properties & (PROP_cfg | PROP_rtl))
1138 == (PROP_cfg | PROP_rtl))
bbbe4e7b
PB
1139 {
1140 get_dump_file_info (pass->static_pass_number)->flags |= TDF_GRAPH;
1141 dump_flags |= TDF_GRAPH;
1142 clean_graph_dump_file (dump_file_name);
1143 }
1144
ef330312 1145 /* Run post-pass cleanup and verification. */
c2924966 1146 execute_todo (todo_after | pass->todo_flags_finish);
6ac01510 1147 verify_interpass_invariants ();
f6db1481 1148
f45e0ad1
JH
1149 if (!current_function_decl)
1150 cgraph_process_new_functions ();
1151
ef330312
PB
1152 /* Flush and close dump file. */
1153 if (dump_file_name)
f6db1481 1154 {
ef330312
PB
1155 free ((char *) dump_file_name);
1156 dump_file_name = NULL;
f6db1481 1157 }
cfaab3a9 1158
ef330312 1159 if (dump_file)
f6db1481 1160 {
ef330312
PB
1161 dump_end (pass->static_pass_number, dump_file);
1162 dump_file = NULL;
f6db1481
RH
1163 }
1164
6fb5fa3c 1165 current_pass = NULL;
91851351
RG
1166 /* Reset in_gimple_form to not break non-unit-at-a-time mode. */
1167 in_gimple_form = false;
1168
ef330312 1169 return true;
f6db1481
RH
1170}
1171
ef330312
PB
1172void
1173execute_pass_list (struct tree_opt_pass *pass)
f6db1481 1174{
ef330312 1175 do
f6db1481 1176 {
ef330312
PB
1177 if (execute_one_pass (pass) && pass->sub)
1178 execute_pass_list (pass->sub);
1179 pass = pass->next;
f6db1481 1180 }
ef330312 1181 while (pass);
f6db1481
RH
1182}
1183
ef330312
PB
1184/* Same as execute_pass_list but assume that subpasses of IPA passes
1185 are local passes. */
1186void
1187execute_ipa_pass_list (struct tree_opt_pass *pass)
f6db1481 1188{
ef330312 1189 do
f6db1481 1190 {
a5093353
JH
1191 gcc_assert (!current_function_decl);
1192 gcc_assert (!cfun);
ef330312 1193 if (execute_one_pass (pass) && pass->sub)
873aa8f5
JH
1194 do_per_function_toporder ((void (*)(void *))execute_pass_list,
1195 pass->sub);
f45e0ad1
JH
1196 if (!current_function_decl)
1197 cgraph_process_new_functions ();
ef330312 1198 pass = pass->next;
f6db1481 1199 }
ef330312 1200 while (pass);
97b0ade3 1201}
873aa8f5 1202#include "gt-passes.h"