]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/passes.c
PR fortran/43836
[thirdparty/gcc.git] / gcc / passes.c
CommitLineData
a49a878f 1/* Top level of GCC compilers (cc1, cc1plus, etc.)
2 Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
7cf0dbf3 3 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
1a6a0f2a 4 Free Software Foundation, Inc.
a49a878f 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
8c4c00c1 10Software Foundation; either version 3, or (at your option) any later
a49a878f 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
8c4c00c1 19along with GCC; see the file COPYING3. If not see
20<http://www.gnu.org/licenses/>. */
a49a878f 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"
a49a878f 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"
77fce4cd 81#include "tree-inline.h"
82#include "tree-flow.h"
5290ebdb 83#include "tree-pass.h"
0f9005dd 84#include "tree-dump.h"
3072d30e 85#include "df.h"
4ae20857 86#include "predict.h"
7bfefa9d 87#include "lto-streamer.h"
c9036234 88#include "plugin.h"
a49a878f 89
90#if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
91#include "dwarf2out.h"
92#endif
93
da2f1613 94#if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
a49a878f 95#include "dbxout.h"
96#endif
97
98#ifdef SDB_DEBUGGING_INFO
99#include "sdbout.h"
100#endif
101
102#ifdef XCOFF_DEBUGGING_INFO
103#include "xcoffout.h" /* Needed for external data
104 declarations for e.g. AIX 4.x. */
105#endif
106
3072d30e 107/* This is used for debugging. It allows the current pass to printed
c9036234 108 from anywhere in compilation.
109 The variable current_pass is also used for statistics and plugins. */
20099e35 110struct opt_pass *current_pass;
3072d30e 111
112/* Call from anywhere to find out what pass this is. Useful for
113 printing out debugging information deep inside an service
114 routine. */
115void
116print_current_pass (FILE *file)
117{
118 if (current_pass)
48e1416a 119 fprintf (file, "current pass = %s (%d)\n",
3072d30e 120 current_pass->name, current_pass->static_pass_number);
121 else
122 fprintf (file, "no current pass.\n");
123}
124
125
126/* Call from the debugger to get the current pass name. */
127void
128debug_pass (void)
129{
130 print_current_pass (stderr);
48e1416a 131}
3072d30e 132
133
134
77fce4cd 135/* Global variables used to communicate with passes. */
136int dump_flags;
137bool in_gimple_form;
7e0311ae 138bool first_pass_instance;
a49a878f 139
a49a878f 140
141/* This is called from various places for FUNCTION_DECL, VAR_DECL,
142 and TYPE_DECL nodes.
143
144 This does nothing for local (non-static) variables, unless the
b2c4af5e 145 variable is a register variable with DECL_ASSEMBLER_NAME set. In
146 that case, or if the variable is not an automatic, it sets up the
147 RTL and outputs any assembler code (label definition, storage
148 allocation and initialization).
a49a878f 149
b2c4af5e 150 DECL is the declaration. TOP_LEVEL is nonzero
a49a878f 151 if this declaration is not within a function. */
152
153void
154rest_of_decl_compilation (tree decl,
a49a878f 155 int top_level,
156 int at_end)
157{
158 /* We deferred calling assemble_alias so that we could collect
159 other attributes such as visibility. Emit the alias now. */
160 {
161 tree alias;
162 alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl));
163 if (alias)
164 {
165 alias = TREE_VALUE (TREE_VALUE (alias));
166 alias = get_identifier (TREE_STRING_POINTER (alias));
167 assemble_alias (decl, alias);
168 }
169 }
170
b2c4af5e 171 /* Can't defer this, because it needs to happen before any
172 later function definitions are processed. */
5ded8c6f 173 if (DECL_ASSEMBLER_NAME_SET_P (decl) && DECL_REGISTER (decl))
b2c4af5e 174 make_decl_rtl (decl);
175
a49a878f 176 /* Forward declarations for nested functions are not "external",
177 but we need to treat them as if they were. */
178 if (TREE_STATIC (decl) || DECL_EXTERNAL (decl)
179 || TREE_CODE (decl) == FUNCTION_DECL)
180 {
181 timevar_push (TV_VARCONST);
182
a49a878f 183 /* Don't output anything when a tentative file-scope definition
184 is seen. But at end of compilation, do output code for them.
185
6329636b 186 We do output all variables and rely on
a49a878f 187 callgraph code to defer them except for forward declarations
188 (see gcc.c-torture/compile/920624-1.c) */
189 if ((at_end
190 || !DECL_DEFER_OUTPUT (decl)
c1dcd13c 191 || DECL_INITIAL (decl))
a49a878f 192 && !DECL_EXTERNAL (decl))
193 {
c131e678 194 if (TREE_CODE (decl) != FUNCTION_DECL)
1d416bd7 195 varpool_finalize_decl (decl);
a49a878f 196 else
197 assemble_variable (decl, top_level, at_end, 0);
198 }
199
200#ifdef ASM_FINISH_DECLARE_OBJECT
201 if (decl == last_assemble_variable_decl)
202 {
203 ASM_FINISH_DECLARE_OBJECT (asm_out_file, decl,
204 top_level, at_end);
205 }
206#endif
207
208 timevar_pop (TV_VARCONST);
209 }
76512af6 210 else if (TREE_CODE (decl) == TYPE_DECL
211 /* Like in rest_of_type_compilation, avoid confusing the debug
212 information machinery when there are errors. */
213 && !(sorrycount || errorcount))
a49a878f 214 {
215 timevar_push (TV_SYMOUT);
216 debug_hooks->type_decl (decl, !top_level);
217 timevar_pop (TV_SYMOUT);
218 }
d7401838 219
06b27565 220 /* Let cgraph know about the existence of variables. */
d7401838 221 if (TREE_CODE (decl) == VAR_DECL && !DECL_EXTERNAL (decl))
1d416bd7 222 varpool_node (decl);
a49a878f 223}
224
225/* Called after finishing a record, union or enumeral type. */
226
227void
228rest_of_type_compilation (tree type, int toplev)
229{
230 /* Avoid confusing the debug information machinery when there are
231 errors. */
232 if (errorcount != 0 || sorrycount != 0)
233 return;
234
235 timevar_push (TV_SYMOUT);
236 debug_hooks->type_decl (TYPE_STUB_DECL (type), !toplev);
237 timevar_pop (TV_SYMOUT);
238}
239
77fce4cd 240\f
a49a878f 241
77fce4cd 242void
243finish_optimization_passes (void)
a49a878f 244{
9f1b7d17 245 int i;
77fce4cd 246 struct dump_file_info *dfi;
247 char *name;
a49a878f 248
77fce4cd 249 timevar_push (TV_DUMP);
250 if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
a49a878f 251 {
20099e35 252 dump_file = dump_begin (pass_profile.pass.static_pass_number, NULL);
77fce4cd 253 end_branch_prob ();
254 if (dump_file)
20099e35 255 dump_end (pass_profile.pass.static_pass_number, dump_file);
a49a878f 256 }
a49a878f 257
77fce4cd 258 if (optimize > 0)
a49a878f 259 {
20099e35 260 dump_file = dump_begin (pass_combine.pass.static_pass_number, NULL);
77fce4cd 261 if (dump_file)
a49a878f 262 {
77fce4cd 263 dump_combine_total_stats (dump_file);
20099e35 264 dump_end (pass_combine.pass.static_pass_number, dump_file);
a49a878f 265 }
266 }
267
77fce4cd 268 /* Do whatever is necessary to finish printing the graphs. */
269 if (graph_dump_format != no_graph)
270 for (i = TDI_end; (dfi = get_dump_file_info (i)) != NULL; ++i)
271 if (dump_initialized_p (i)
5f0ef107 272 && (dfi->flags & TDF_GRAPH) != 0
77fce4cd 273 && (name = get_dump_file_name (i)) != NULL)
5f0ef107 274 {
275 finish_graph_dump_file (name);
276 free (name);
277 }
a49a878f 278
77fce4cd 279 timevar_pop (TV_DUMP);
a49a878f 280}
a49a878f 281
77fce4cd 282static bool
283gate_rest_of_compilation (void)
a49a878f 284{
77fce4cd 285 /* Early return if there were errors. We can run afoul of our
286 consistency checks, and there's not really much point in fixing them. */
287 return !(rtl_dump_and_exit || flag_syntax_only || errorcount || sorrycount);
a49a878f 288}
289
20099e35 290struct gimple_opt_pass pass_rest_of_compilation =
a49a878f 291{
20099e35 292 {
293 GIMPLE_PASS,
21486db3 294 "*rest_of_compilation", /* name */
77fce4cd 295 gate_rest_of_compilation, /* gate */
296 NULL, /* execute */
297 NULL, /* sub */
298 NULL, /* next */
299 0, /* static_pass_number */
300 TV_REST_OF_COMPILATION, /* tv_id */
301 PROP_rtl, /* properties_required */
302 0, /* properties_provided */
303 0, /* properties_destroyed */
304 0, /* todo_flags_start */
20099e35 305 TODO_ggc_collect /* todo_flags_finish */
306 }
77fce4cd 307};
a49a878f 308
77fce4cd 309static bool
310gate_postreload (void)
311{
312 return reload_completed;
a49a878f 313}
314
20099e35 315struct rtl_opt_pass pass_postreload =
a49a878f 316{
20099e35 317 {
318 RTL_PASS,
0c297edc 319 "*all-postreload", /* name */
77fce4cd 320 gate_postreload, /* gate */
321 NULL, /* execute */
322 NULL, /* sub */
323 NULL, /* next */
324 0, /* static_pass_number */
0b1615c1 325 TV_NONE, /* tv_id */
77fce4cd 326 PROP_rtl, /* properties_required */
327 0, /* properties_provided */
328 0, /* properties_destroyed */
329 0, /* todo_flags_start */
20099e35 330 TODO_ggc_collect | TODO_verify_rtl_sharing /* todo_flags_finish */
331 }
77fce4cd 332};
a49a878f 333
da2f1613 334
a49a878f 335
77fce4cd 336/* The root of the compilation pass tree, once constructed. */
7bfefa9d 337struct opt_pass *all_passes, *all_small_ipa_passes, *all_lowering_passes,
338 *all_regular_ipa_passes, *all_lto_gen_passes;
a49a878f 339
c34d1545 340/* This is used by plugins, and should also be used in register_pass. */
341#define DEF_PASS_LIST(LIST) &LIST,
342struct opt_pass **gcc_pass_lists[] = { GCC_PASS_LISTS NULL };
343#undef DEF_PASS_LIST
344
9659d177 345/* A map from static pass id to optimization pass. */
346struct opt_pass **passes_by_id;
347int passes_by_id_size;
348
349/* Set the static pass number of pass PASS to ID and record that
350 in the mapping from static pass number to pass. */
351
352static void
353set_pass_for_id (int id, struct opt_pass *pass)
354{
355 pass->static_pass_number = id;
356 if (passes_by_id_size <= id)
357 {
4077bf7a 358 passes_by_id = XRESIZEVEC (struct opt_pass *, passes_by_id, id + 1);
9659d177 359 memset (passes_by_id + passes_by_id_size, 0,
360 (id + 1 - passes_by_id_size) * sizeof (void *));
361 passes_by_id_size = id + 1;
362 }
363 passes_by_id[id] = pass;
364}
365
366/* Return the pass with the static pass number ID. */
367
368struct opt_pass *
369get_pass_for_id (int id)
370{
371 if (id >= passes_by_id_size)
372 return NULL;
373 return passes_by_id[id];
374}
375
77fce4cd 376/* Iterate over the pass tree allocating dump file numbers. We want
377 to do this depth first, and independent of whether the pass is
378 enabled or not. */
a49a878f 379
9227b6fc 380void
5d48fdb4 381register_one_dump_file (struct opt_pass *pass)
77fce4cd 382{
383 char *dot_name, *flag_name, *glob_name;
0c297edc 384 const char *name, *prefix;
77fce4cd 385 char num[10];
9659d177 386 int flags, id;
a49a878f 387
77fce4cd 388 /* See below in next_pass_1. */
389 num[0] = '\0';
390 if (pass->static_pass_number != -1)
391 sprintf (num, "%d", ((int) pass->static_pass_number < 0
392 ? 1 : pass->static_pass_number));
a49a878f 393
0c297edc 394 /* The name is both used to identify the pass for the purposes of plugins,
395 and to specify dump file name and option.
396 The latter two might want something short which is not quite unique; for
397 that reason, we may have a disambiguating prefix, followed by a space
398 to mark the start of the following dump file name / option string. */
399 name = strchr (pass->name, ' ');
400 name = name ? name + 1 : pass->name;
401 dot_name = concat (".", name, num, NULL);
68e3904e 402 if (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS)
6354626c 403 prefix = "ipa-", flags = TDF_IPA;
5d48fdb4 404 else if (pass->type == GIMPLE_PASS)
6354626c 405 prefix = "tree-", flags = TDF_TREE;
a49a878f 406 else
6354626c 407 prefix = "rtl-", flags = TDF_RTL;
408
0c297edc 409 flag_name = concat (prefix, name, num, NULL);
410 glob_name = concat (prefix, name, NULL);
9659d177 411 id = dump_register (dot_name, flag_name, glob_name, flags);
412 set_pass_for_id (id, pass);
da2f1613 413}
414
6354626c 415/* Recursive worker function for register_dump_files. */
416
48e1416a 417static int
5d48fdb4 418register_dump_files_1 (struct opt_pass *pass, int properties)
da2f1613 419{
77fce4cd 420 do
421 {
6354626c 422 int new_properties = (properties | pass->properties_provided)
423 & ~pass->properties_destroyed;
a49a878f 424
9478582c 425 if (pass->name && pass->name[0] != '*')
5d48fdb4 426 register_one_dump_file (pass);
a49a878f 427
77fce4cd 428 if (pass->sub)
5d48fdb4 429 new_properties = register_dump_files_1 (pass->sub, new_properties);
a49a878f 430
77fce4cd 431 /* If we have a gate, combine the properties that we could have with
432 and without the pass being examined. */
433 if (pass->gate)
434 properties &= new_properties;
435 else
436 properties = new_properties;
a49a878f 437
77fce4cd 438 pass = pass->next;
a49a878f 439 }
77fce4cd 440 while (pass);
a49a878f 441
77fce4cd 442 return properties;
a49a878f 443}
839f8415 444
48e1416a 445/* Register the dump files for the pipeline starting at PASS.
5d48fdb4 446 PROPERTIES reflects the properties that are guaranteed to be available at
447 the beginning of the pipeline. */
6354626c 448
48e1416a 449static void
5d48fdb4 450register_dump_files (struct opt_pass *pass,int properties)
6354626c 451{
452 pass->properties_required |= properties;
5d48fdb4 453 register_dump_files_1 (pass, properties);
6354626c 454}
455
3efe62a1 456/* Look at the static_pass_number and duplicate the pass
457 if it is already added to a list. */
839f8415 458
3efe62a1 459static struct opt_pass *
460make_pass_instance (struct opt_pass *pass, bool track_duplicates)
a49a878f 461{
77fce4cd 462 /* A nonzero static_pass_number indicates that the
463 pass is already in the list. */
464 if (pass->static_pass_number)
465 {
f4e36c33 466 struct opt_pass *new_pass;
a49a878f 467
ea2c6784 468 if (pass->type == GIMPLE_PASS
469 || pass->type == RTL_PASS
470 || pass->type == SIMPLE_IPA_PASS)
471 {
472 new_pass = XNEW (struct opt_pass);
473 memcpy (new_pass, pass, sizeof (struct opt_pass));
474 }
475 else if (pass->type == IPA_PASS)
476 {
477 new_pass = (struct opt_pass *)XNEW (struct ipa_opt_pass_d);
478 memcpy (new_pass, pass, sizeof (struct ipa_opt_pass_d));
479 }
480 else
481 gcc_unreachable ();
482
f4e36c33 483 new_pass->next = NULL;
a49a878f 484
f4e36c33 485 new_pass->todo_flags_start &= ~TODO_mark_first_instance;
7e0311ae 486
77fce4cd 487 /* Indicate to register_dump_files that this pass has duplicates,
488 and so it should rename the dump file. The first instance will
489 be -1, and be number of duplicates = -static_pass_number - 1.
490 Subsequent instances will be > 0 and just the duplicate number. */
0c297edc 491 if ((pass->name && pass->name[0] != '*') || track_duplicates)
77fce4cd 492 {
493 pass->static_pass_number -= 1;
f4e36c33 494 new_pass->static_pass_number = -pass->static_pass_number;
77fce4cd 495 }
3efe62a1 496 return new_pass;
77fce4cd 497 }
498 else
499 {
7e0311ae 500 pass->todo_flags_start |= TODO_mark_first_instance;
77fce4cd 501 pass->static_pass_number = -1;
c9036234 502
503 invoke_plugin_callbacks (PLUGIN_NEW_PASS, pass);
48e1416a 504 }
505 return pass;
3efe62a1 506}
507
508/* Add a pass to the pass list. Duplicate the pass if it's already
509 in the list. */
510
511static struct opt_pass **
512next_pass_1 (struct opt_pass **list, struct opt_pass *pass)
513{
0c297edc 514 /* Every pass should have a name so that plugins can refer to them. */
515 gcc_assert (pass->name != NULL);
516
3efe62a1 517 *list = make_pass_instance (pass, false);
48e1416a 518
77fce4cd 519 return &(*list)->next;
a49a878f 520}
521
3efe62a1 522/* List node for an inserted pass instance. We need to keep track of all
523 the newly-added pass instances (with 'added_pass_nodes' defined below)
524 so that we can register their dump files after pass-positioning is finished.
525 Registering dumping files needs to be post-processed or the
526 static_pass_number of the opt_pass object would be modified and mess up
527 the dump file names of future pass instances to be added. */
528
529struct pass_list_node
530{
531 struct opt_pass *pass;
532 struct pass_list_node *next;
533};
534
535static struct pass_list_node *added_pass_nodes = NULL;
536static struct pass_list_node *prev_added_pass_node;
537
48e1416a 538/* Insert the pass at the proper position. Return true if the pass
3efe62a1 539 is successfully added.
540
541 NEW_PASS_INFO - new pass to be inserted
542 PASS_LIST - root of the pass list to insert the new pass to */
543
544static bool
545position_pass (struct register_pass_info *new_pass_info,
546 struct opt_pass **pass_list)
547{
548 struct opt_pass *pass = *pass_list, *prev_pass = NULL;
549 bool success = false;
550
551 for ( ; pass; prev_pass = pass, pass = pass->next)
552 {
553 /* Check if the current pass is of the same type as the new pass and
554 matches the name and the instance number of the reference pass. */
555 if (pass->type == new_pass_info->pass->type
556 && pass->name
557 && !strcmp (pass->name, new_pass_info->reference_pass_name)
558 && ((new_pass_info->ref_pass_instance_number == 0)
559 || (new_pass_info->ref_pass_instance_number ==
560 pass->static_pass_number)
561 || (new_pass_info->ref_pass_instance_number == 1
562 && pass->todo_flags_start & TODO_mark_first_instance)))
563 {
564 struct opt_pass *new_pass;
565 struct pass_list_node *new_pass_node;
566
567 new_pass = make_pass_instance (new_pass_info->pass, true);
48e1416a 568
3efe62a1 569 /* Insert the new pass instance based on the positioning op. */
570 switch (new_pass_info->pos_op)
571 {
572 case PASS_POS_INSERT_AFTER:
573 new_pass->next = pass->next;
574 pass->next = new_pass;
575
576 /* Skip newly inserted pass to avoid repeated
577 insertions in the case where the new pass and the
578 existing one have the same name. */
48e1416a 579 pass = new_pass;
3efe62a1 580 break;
581 case PASS_POS_INSERT_BEFORE:
582 new_pass->next = pass;
583 if (prev_pass)
584 prev_pass->next = new_pass;
585 else
586 *pass_list = new_pass;
587 break;
588 case PASS_POS_REPLACE:
589 new_pass->next = pass->next;
590 if (prev_pass)
591 prev_pass->next = new_pass;
592 else
593 *pass_list = new_pass;
594 new_pass->sub = pass->sub;
595 new_pass->tv_id = pass->tv_id;
596 pass = new_pass;
597 break;
598 default:
599 error ("Invalid pass positioning operation");
600 return false;
601 }
602
603 /* Save the newly added pass (instance) in the added_pass_nodes
604 list so that we can register its dump file later. Note that
605 we cannot register the dump file now because doing so will modify
606 the static_pass_number of the opt_pass object and therefore
607 mess up the dump file name of future instances. */
608 new_pass_node = XCNEW (struct pass_list_node);
609 new_pass_node->pass = new_pass;
610 if (!added_pass_nodes)
611 added_pass_nodes = new_pass_node;
612 else
613 prev_added_pass_node->next = new_pass_node;
614 prev_added_pass_node = new_pass_node;
615
616 success = true;
617 }
618
619 if (pass->sub && position_pass (new_pass_info, &pass->sub))
620 success = true;
621 }
622
623 return success;
624}
625
626/* Hooks a new pass into the pass lists.
627
628 PASS_INFO - pass information that specifies the opt_pass object,
629 reference pass, instance number, and how to position
630 the pass */
631
632void
633register_pass (struct register_pass_info *pass_info)
634{
c21d7f23 635 bool all_instances, success;
636
0de338e5 637 /* The checks below could fail in buggy plugins. Existing GCC
638 passes should never fail these checks, so we mention plugin in
639 the messages. */
3efe62a1 640 if (!pass_info->pass)
0de338e5 641 fatal_error ("plugin cannot register a missing pass");
642
643 if (!pass_info->pass->name)
644 fatal_error ("plugin cannot register an unnamed pass");
3efe62a1 645
646 if (!pass_info->reference_pass_name)
0de338e5 647 fatal_error
648 ("plugin cannot register pass %qs without reference pass name",
649 pass_info->pass->name);
3efe62a1 650
0de338e5 651 /* Try to insert the new pass to the pass lists. We need to check
c21d7f23 652 all five lists as the reference pass could be in one (or all) of
0de338e5 653 them. */
c21d7f23 654 all_instances = pass_info->ref_pass_instance_number == 0;
655 success = position_pass (pass_info, &all_lowering_passes);
656 if (!success || all_instances)
657 success |= position_pass (pass_info, &all_small_ipa_passes);
658 if (!success || all_instances)
659 success |= position_pass (pass_info, &all_regular_ipa_passes);
660 if (!success || all_instances)
661 success |= position_pass (pass_info, &all_lto_gen_passes);
662 if (!success || all_instances)
663 success |= position_pass (pass_info, &all_passes);
664 if (!success)
0de338e5 665 fatal_error
666 ("pass %qs not found but is referenced by new pass %qs",
667 pass_info->reference_pass_name, pass_info->pass->name);
c21d7f23 668
669 /* OK, we have successfully inserted the new pass. We need to register
670 the dump files for the newly added pass and its duplicates (if any).
671 Because the registration of plugin/backend passes happens after the
672 command-line options are parsed, the options that specify single
673 pass dumping (e.g. -fdump-tree-PASSNAME) cannot be used for new
674 passes. Therefore we currently can only enable dumping of
675 new passes when the 'dump-all' flags (e.g. -fdump-tree-all)
676 are specified. While doing so, we also delete the pass_list_node
677 objects created during pass positioning. */
678 while (added_pass_nodes)
3efe62a1 679 {
c21d7f23 680 struct pass_list_node *next_node = added_pass_nodes->next;
681 enum tree_dump_index tdi;
682 register_one_dump_file (added_pass_nodes->pass);
683 if (added_pass_nodes->pass->type == SIMPLE_IPA_PASS
684 || added_pass_nodes->pass->type == IPA_PASS)
685 tdi = TDI_ipa_all;
686 else if (added_pass_nodes->pass->type == GIMPLE_PASS)
687 tdi = TDI_tree_all;
688 else
689 tdi = TDI_rtl_all;
690 /* Check if dump-all flag is specified. */
691 if (get_dump_file_info (tdi)->state)
692 get_dump_file_info (added_pass_nodes->pass->static_pass_number)
693 ->state = get_dump_file_info (tdi)->state;
694 XDELETE (added_pass_nodes);
695 added_pass_nodes = next_node;
3efe62a1 696 }
697}
3072d30e 698
ae6ad54a 699/* Construct the pass tree. The sequencing of passes is driven by
700 the cgraph routines:
701
702 cgraph_finalize_compilation_unit ()
703 for each node N in the cgraph
704 cgraph_analyze_function (N)
705 cgraph_lower_function (N) -> all_lowering_passes
706
707 If we are optimizing, cgraph_optimize is then invoked:
708
709 cgraph_optimize ()
7bfefa9d 710 ipa_passes () -> all_small_ipa_passes
ae6ad54a 711 cgraph_expand_all_functions ()
712 for each node N in the cgraph
713 cgraph_expand_function (N)
84e10000 714 tree_rest_of_compilation (DECL (N)) -> all_passes
ae6ad54a 715*/
da2f1613 716
77fce4cd 717void
718init_optimization_passes (void)
719{
20099e35 720 struct opt_pass **p;
77fce4cd 721
20099e35 722#define NEXT_PASS(PASS) (p = next_pass_1 (p, &((PASS).pass)))
09a2e412 723
fdd35027 724 /* All passes needed to lower the function into shape optimizers can
725 operate on. These passes are always run first on the function, but
726 backend might produce already lowered functions that are not processed
727 by these passes. */
77fce4cd 728 p = &all_lowering_passes;
bfec3452 729 NEXT_PASS (pass_warn_unused_result);
730 NEXT_PASS (pass_diagnose_omp_blocks);
77fce4cd 731 NEXT_PASS (pass_mudflap_1);
1e8e9920 732 NEXT_PASS (pass_lower_omp);
77fce4cd 733 NEXT_PASS (pass_lower_cf);
4888ab9a 734 NEXT_PASS (pass_refactor_eh);
77fce4cd 735 NEXT_PASS (pass_lower_eh);
736 NEXT_PASS (pass_build_cfg);
77fce4cd 737 NEXT_PASS (pass_lower_vector);
738 NEXT_PASS (pass_warn_function_return);
e7c352d1 739 NEXT_PASS (pass_build_cgraph_edges);
09a2e412 740 NEXT_PASS (pass_inline_parameters);
77fce4cd 741 *p = NULL;
742
6329636b 743 /* Interprocedural optimization passes. */
7bfefa9d 744 p = &all_small_ipa_passes;
fdd35027 745 NEXT_PASS (pass_ipa_function_and_variable_visibility);
746 NEXT_PASS (pass_ipa_early_inline);
747 {
20099e35 748 struct opt_pass **p = &pass_ipa_early_inline.pass.sub;
fdd35027 749 NEXT_PASS (pass_early_inline);
750 NEXT_PASS (pass_inline_parameters);
751 NEXT_PASS (pass_rebuild_cgraph_edges);
752 }
34e5cced 753 NEXT_PASS (pass_ipa_free_lang_data);
fdd35027 754 NEXT_PASS (pass_early_local_passes);
755 {
20099e35 756 struct opt_pass **p = &pass_early_local_passes.pass.sub;
6cb239e5 757 NEXT_PASS (pass_fixup_cfg);
fdd35027 758 NEXT_PASS (pass_tree_profile);
759 NEXT_PASS (pass_cleanup_cfg);
760 NEXT_PASS (pass_init_datastructures);
761 NEXT_PASS (pass_expand_omp);
bff4202c 762
763 NEXT_PASS (pass_referenced_vars);
bff4202c 764 NEXT_PASS (pass_build_ssa);
ea18e2e5 765 NEXT_PASS (pass_early_warn_uninitialized);
7bfefa9d 766 /* Note that it is not strictly necessary to schedule an early
767 inline pass here. However, some test cases (e.g.,
768 g++.dg/other/p334435.C g++.dg/other/i386-1.C) expect extern
769 inline functions to be inlined even at -O0. This does not
770 happen during the first early inline pass. */
771 NEXT_PASS (pass_rebuild_cgraph_edges);
772 NEXT_PASS (pass_early_inline);
fdd35027 773 NEXT_PASS (pass_all_early_optimizations);
774 {
20099e35 775 struct opt_pass **p = &pass_all_early_optimizations.pass.sub;
ba3a7ba0 776 NEXT_PASS (pass_remove_cgraph_callee_edges);
fdd35027 777 NEXT_PASS (pass_rename_ssa_copies);
778 NEXT_PASS (pass_ccp);
779 NEXT_PASS (pass_forwprop);
7f81b5ee 780 /* pass_build_ealias is a dummy pass that ensures that we
781 execute TODO_rebuild_alias at this point. Re-building
782 alias information also rewrites no longer addressed
783 locals into SSA form if possible. */
784 NEXT_PASS (pass_build_ealias);
1f0a4df8 785 NEXT_PASS (pass_sra_early);
fdd35027 786 NEXT_PASS (pass_copy_prop);
787 NEXT_PASS (pass_merge_phi);
43bba217 788 NEXT_PASS (pass_cd_dce);
2f29eac3 789 NEXT_PASS (pass_early_ipa_sra);
fdd35027 790 NEXT_PASS (pass_tail_recursion);
a347af29 791 NEXT_PASS (pass_convert_switch);
4c5fcca6 792 NEXT_PASS (pass_cleanup_eh);
4ae20857 793 NEXT_PASS (pass_profile);
b5cebd44 794 NEXT_PASS (pass_local_pure_const);
fdd35027 795 }
bff4202c 796 NEXT_PASS (pass_release_ssa_names);
fdd35027 797 NEXT_PASS (pass_rebuild_cgraph_edges);
64f6c8c9 798 NEXT_PASS (pass_inline_parameters);
fdd35027 799 }
800 NEXT_PASS (pass_ipa_increase_alignment);
604cde73 801 NEXT_PASS (pass_ipa_matrix_reorg);
7bfefa9d 802 *p = NULL;
803
804 p = &all_regular_ipa_passes;
59dd4830 805 NEXT_PASS (pass_ipa_whole_program_visibility);
fdd35027 806 NEXT_PASS (pass_ipa_cp);
807 NEXT_PASS (pass_ipa_inline);
808 NEXT_PASS (pass_ipa_reference);
48e1416a 809 NEXT_PASS (pass_ipa_pure_const);
fdd35027 810 NEXT_PASS (pass_ipa_type_escape);
811 NEXT_PASS (pass_ipa_pta);
7bfefa9d 812 NEXT_PASS (pass_ipa_struct_reorg);
813 *p = NULL;
814
815 p = &all_lto_gen_passes;
816 NEXT_PASS (pass_ipa_lto_gimple_out);
817 NEXT_PASS (pass_ipa_lto_wpa_fixup);
818 NEXT_PASS (pass_ipa_lto_finish_out); /* This must be the last LTO pass. */
f517b36e 819 *p = NULL;
820
48a12060 821 /* These passes are run after IPA passes on every function that is being
822 output to the assembler file. */
77fce4cd 823 p = &all_passes;
e38def9c 824 NEXT_PASS (pass_lower_eh_dispatch);
77fce4cd 825 NEXT_PASS (pass_all_optimizations);
fdd35027 826 {
20099e35 827 struct opt_pass **p = &pass_all_optimizations.pass.sub;
ba3a7ba0 828 NEXT_PASS (pass_remove_cgraph_callee_edges);
43bba217 829 /* Initial scalar cleanups before alias computation.
830 They ensure memory accesses are not indirect wherever possible. */
1add270f 831 NEXT_PASS (pass_strip_predict_hints);
43bba217 832 NEXT_PASS (pass_update_address_taken);
fdd35027 833 NEXT_PASS (pass_rename_ssa_copies);
d88fd237 834 NEXT_PASS (pass_complete_unrolli);
fdd35027 835 NEXT_PASS (pass_ccp);
ac4b41a4 836 NEXT_PASS (pass_forwprop);
43bba217 837 NEXT_PASS (pass_call_cdce);
838 /* pass_build_alias is a dummy pass that ensures that we
839 execute TODO_rebuild_alias at this point. Re-building
840 alias information also rewrites no longer addressed
841 locals into SSA form if possible. */
842 NEXT_PASS (pass_build_alias);
843 NEXT_PASS (pass_return_slot);
37361b38 844 NEXT_PASS (pass_phiprop);
fdd35027 845 NEXT_PASS (pass_fre);
fdd35027 846 NEXT_PASS (pass_copy_prop);
847 NEXT_PASS (pass_merge_phi);
848 NEXT_PASS (pass_vrp);
849 NEXT_PASS (pass_dce);
e6d0e152 850 NEXT_PASS (pass_cselim);
8530c7be 851 NEXT_PASS (pass_tree_ifcombine);
fdd35027 852 NEXT_PASS (pass_phiopt);
fdd35027 853 NEXT_PASS (pass_tail_recursion);
fdd35027 854 NEXT_PASS (pass_ch);
855 NEXT_PASS (pass_stdarg);
856 NEXT_PASS (pass_lower_complex);
857 NEXT_PASS (pass_sra);
fdd35027 858 NEXT_PASS (pass_rename_ssa_copies);
a65c4d64 859 /* The dom pass will also resolve all __builtin_constant_p calls
860 that are still there to 0. This has to be done after some
861 propagations have already run, but before some more dead code
862 is removed, and this place fits nicely. Remember this when
863 trying to move or duplicate pass_dominator somewhere earlier. */
fdd35027 864 NEXT_PASS (pass_dominator);
fdd35027 865 /* The only const/copy propagation opportunities left after
866 DOM should be due to degenerate PHI nodes. So rather than
867 run the full propagators, run a specialized pass which
868 only examines PHIs to discover const/copy propagation
869 opportunities. */
870 NEXT_PASS (pass_phi_only_cprop);
dddf5036 871 NEXT_PASS (pass_dse);
fdd35027 872 NEXT_PASS (pass_reassoc);
873 NEXT_PASS (pass_dce);
fdd35027 874 NEXT_PASS (pass_forwprop);
875 NEXT_PASS (pass_phiopt);
876 NEXT_PASS (pass_object_sizes);
f70980f2 877 NEXT_PASS (pass_ccp);
317d3b82 878 NEXT_PASS (pass_copy_prop);
fdd35027 879 NEXT_PASS (pass_cse_sincos);
84cc784c 880 NEXT_PASS (pass_optimize_bswap);
fdd35027 881 NEXT_PASS (pass_split_crit_edges);
882 NEXT_PASS (pass_pre);
fdd35027 883 NEXT_PASS (pass_sink_code);
884 NEXT_PASS (pass_tree_loop);
885 {
20099e35 886 struct opt_pass **p = &pass_tree_loop.pass.sub;
fdd35027 887 NEXT_PASS (pass_tree_loop_init);
69f0b410 888 NEXT_PASS (pass_lim);
fdd35027 889 NEXT_PASS (pass_copy_prop);
ad4a85ad 890 NEXT_PASS (pass_dce_loop);
fdd35027 891 NEXT_PASS (pass_tree_unswitch);
892 NEXT_PASS (pass_scev_cprop);
fdd35027 893 NEXT_PASS (pass_record_bounds);
355572cc 894 NEXT_PASS (pass_check_data_deps);
801c5610 895 NEXT_PASS (pass_loop_distribution);
fdd35027 896 NEXT_PASS (pass_linear_transform);
255b6be7 897 NEXT_PASS (pass_graphite_transforms);
26c166eb 898 {
899 struct opt_pass **p = &pass_graphite_transforms.pass.sub;
a751953f 900 NEXT_PASS (pass_copy_prop);
26c166eb 901 NEXT_PASS (pass_dce_loop);
902 NEXT_PASS (pass_lim);
903 }
fdd35027 904 NEXT_PASS (pass_iv_canon);
905 NEXT_PASS (pass_if_conversion);
906 NEXT_PASS (pass_vectorize);
907 {
20099e35 908 struct opt_pass **p = &pass_vectorize.pass.sub;
fdd35027 909 NEXT_PASS (pass_lower_vector_ssa);
910 NEXT_PASS (pass_dce_loop);
911 }
b50b1b69 912 NEXT_PASS (pass_predcom);
fdd35027 913 NEXT_PASS (pass_complete_unroll);
37545e54 914 NEXT_PASS (pass_slp_vectorize);
28c92cbb 915 NEXT_PASS (pass_parallelize_loops);
fdd35027 916 NEXT_PASS (pass_loop_prefetch);
917 NEXT_PASS (pass_iv_optimize);
918 NEXT_PASS (pass_tree_loop_done);
919 }
920 NEXT_PASS (pass_cse_reciprocals);
921 NEXT_PASS (pass_reassoc);
922 NEXT_PASS (pass_vrp);
923 NEXT_PASS (pass_dominator);
fdd35027 924 /* The only const/copy propagation opportunities left after
925 DOM should be due to degenerate PHI nodes. So rather than
926 run the full propagators, run a specialized pass which
927 only examines PHIs to discover const/copy propagation
928 opportunities. */
929 NEXT_PASS (pass_phi_only_cprop);
fdd35027 930 NEXT_PASS (pass_cd_dce);
3ddccd57 931 NEXT_PASS (pass_tracer);
fdd35027 932
933 /* FIXME: If DCE is not run before checking for uninitialized uses,
934 we may get false warnings (e.g., testsuite/gcc.dg/uninit-5.c).
935 However, this also causes us to misdiagnose cases that should be
936 real warnings (e.g., testsuite/gcc.dg/pr18501.c).
48e1416a 937
fdd35027 938 To fix the false positives in uninit-5.c, we would have to
939 account for the predicates protecting the set and the use of each
940 variable. Using a representation like Gated Single Assignment
941 may help. */
942 NEXT_PASS (pass_late_warn_uninitialized);
943 NEXT_PASS (pass_dse);
944 NEXT_PASS (pass_forwprop);
945 NEXT_PASS (pass_phiopt);
a65c4d64 946 NEXT_PASS (pass_fold_builtins);
fdd35027 947 NEXT_PASS (pass_tail_calls);
948 NEXT_PASS (pass_rename_ssa_copies);
949 NEXT_PASS (pass_uncprop);
b5cebd44 950 NEXT_PASS (pass_local_pure_const);
fdd35027 951 }
7b76dcb9 952 NEXT_PASS (pass_lower_complex_O0);
48d5ef93 953 NEXT_PASS (pass_cleanup_eh);
e38def9c 954 NEXT_PASS (pass_lower_resx);
bff4202c 955 NEXT_PASS (pass_nrv);
a8dd994c 956 NEXT_PASS (pass_mudflap_2);
bff4202c 957 NEXT_PASS (pass_cleanup_cfg_post_optimizing);
77fce4cd 958 NEXT_PASS (pass_warn_function_noreturn);
75a70cf9 959
77fce4cd 960 NEXT_PASS (pass_expand);
a8dd994c 961
77fce4cd 962 NEXT_PASS (pass_rest_of_compilation);
fdd35027 963 {
20099e35 964 struct opt_pass **p = &pass_rest_of_compilation.pass.sub;
fdd35027 965 NEXT_PASS (pass_init_function);
966 NEXT_PASS (pass_jump);
fdd35027 967 NEXT_PASS (pass_rtl_eh);
968 NEXT_PASS (pass_initial_value_sets);
969 NEXT_PASS (pass_unshare_all_rtl);
970 NEXT_PASS (pass_instantiate_virtual_regs);
154480b1 971 NEXT_PASS (pass_into_cfg_layout_mode);
fdd35027 972 NEXT_PASS (pass_jump2);
973 NEXT_PASS (pass_lower_subreg);
3072d30e 974 NEXT_PASS (pass_df_initialize_opt);
fdd35027 975 NEXT_PASS (pass_cse);
976 NEXT_PASS (pass_rtl_fwprop);
d743aba2 977 NEXT_PASS (pass_rtl_cprop);
978 NEXT_PASS (pass_rtl_pre);
979 NEXT_PASS (pass_rtl_hoist);
980 NEXT_PASS (pass_rtl_cprop);
981 NEXT_PASS (pass_rtl_store_motion);
982 NEXT_PASS (pass_cse_after_global_opts);
fdd35027 983 NEXT_PASS (pass_rtl_ifcvt);
e8eed2f8 984 NEXT_PASS (pass_reginfo_init);
fdd35027 985 /* Perform loop optimizations. It might be better to do them a bit
986 sooner, but we want the profile feedback to work more
987 efficiently. */
988 NEXT_PASS (pass_loop2);
989 {
20099e35 990 struct opt_pass **p = &pass_loop2.pass.sub;
fdd35027 991 NEXT_PASS (pass_rtl_loop_init);
992 NEXT_PASS (pass_rtl_move_loop_invariants);
993 NEXT_PASS (pass_rtl_unswitch);
994 NEXT_PASS (pass_rtl_unroll_and_peel_loops);
995 NEXT_PASS (pass_rtl_doloop);
996 NEXT_PASS (pass_rtl_loop_done);
997 *p = NULL;
998 }
999 NEXT_PASS (pass_web);
d743aba2 1000 NEXT_PASS (pass_rtl_cprop);
fdd35027 1001 NEXT_PASS (pass_cse2);
3072d30e 1002 NEXT_PASS (pass_rtl_dse1);
fdd35027 1003 NEXT_PASS (pass_rtl_fwprop_addr);
3072d30e 1004 NEXT_PASS (pass_inc_dec);
1005 NEXT_PASS (pass_initialize_regs);
3072d30e 1006 NEXT_PASS (pass_ud_rtl_dce);
fdd35027 1007 NEXT_PASS (pass_combine);
1008 NEXT_PASS (pass_if_after_combine);
1009 NEXT_PASS (pass_partition_blocks);
1010 NEXT_PASS (pass_regmove);
ee4d588d 1011 NEXT_PASS (pass_outof_cfg_layout_mode);
fdd35027 1012 NEXT_PASS (pass_split_all_insns);
1013 NEXT_PASS (pass_lower_subreg2);
3072d30e 1014 NEXT_PASS (pass_df_initialize_no_opt);
1015 NEXT_PASS (pass_stack_ptr_mod);
fdd35027 1016 NEXT_PASS (pass_mode_switching);
9dc6d5bb 1017 NEXT_PASS (pass_match_asm_constraints);
fdd35027 1018 NEXT_PASS (pass_sms);
a7dcf969 1019 NEXT_PASS (pass_sched);
47dd2e78 1020 NEXT_PASS (pass_ira);
fdd35027 1021 NEXT_PASS (pass_postreload);
1022 {
20099e35 1023 struct opt_pass **p = &pass_postreload.pass.sub;
fdd35027 1024 NEXT_PASS (pass_postreload_cse);
1025 NEXT_PASS (pass_gcse2);
3072d30e 1026 NEXT_PASS (pass_split_after_reload);
1027 NEXT_PASS (pass_branch_target_load_optimize1);
1028 NEXT_PASS (pass_thread_prologue_and_epilogue);
1029 NEXT_PASS (pass_rtl_dse2);
fdd35027 1030 NEXT_PASS (pass_stack_adjustments);
1031 NEXT_PASS (pass_peephole2);
1032 NEXT_PASS (pass_if_after_reload);
1033 NEXT_PASS (pass_regrename);
3072d30e 1034 NEXT_PASS (pass_cprop_hardreg);
1035 NEXT_PASS (pass_fast_rtl_dce);
fdd35027 1036 NEXT_PASS (pass_reorder_blocks);
3072d30e 1037 NEXT_PASS (pass_branch_target_load_optimize2);
fdd35027 1038 NEXT_PASS (pass_leaf_regs);
3072d30e 1039 NEXT_PASS (pass_split_before_sched2);
fdd35027 1040 NEXT_PASS (pass_sched2);
fdd35027 1041 NEXT_PASS (pass_stack_regs);
3072d30e 1042 {
20099e35 1043 struct opt_pass **p = &pass_stack_regs.pass.sub;
3072d30e 1044 NEXT_PASS (pass_split_before_regstack);
1045 NEXT_PASS (pass_stack_regs_run);
1046 }
fdd35027 1047 NEXT_PASS (pass_compute_alignments);
1048 NEXT_PASS (pass_duplicate_computed_gotos);
1049 NEXT_PASS (pass_variable_tracking);
1050 NEXT_PASS (pass_free_cfg);
1051 NEXT_PASS (pass_machine_reorg);
1052 NEXT_PASS (pass_cleanup_barriers);
1053 NEXT_PASS (pass_delay_slots);
1054 NEXT_PASS (pass_split_for_shorten_branches);
1055 NEXT_PASS (pass_convert_to_eh_region_ranges);
1056 NEXT_PASS (pass_shorten_branches);
1057 NEXT_PASS (pass_set_nothrow_function_flags);
1058 NEXT_PASS (pass_final);
1059 }
829545fe 1060 NEXT_PASS (pass_df_finish);
fdd35027 1061 }
77fce4cd 1062 NEXT_PASS (pass_clean_state);
1063 *p = NULL;
1064
77fce4cd 1065#undef NEXT_PASS
1066
1067 /* Register the passes with the tree dump code. */
5d48fdb4 1068 register_dump_files (all_lowering_passes, PROP_gimple_any);
48e1416a 1069 register_dump_files (all_small_ipa_passes,
7bfefa9d 1070 PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
1071 | PROP_cfg);
48e1416a 1072 register_dump_files (all_regular_ipa_passes,
7bfefa9d 1073 PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
1074 | PROP_cfg);
48e1416a 1075 register_dump_files (all_lto_gen_passes,
6354626c 1076 PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
1077 | PROP_cfg);
48e1416a 1078 register_dump_files (all_passes,
6354626c 1079 PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
1080 | PROP_cfg);
77fce4cd 1081}
1082
80f94d49 1083/* If we are in IPA mode (i.e., current_function_decl is NULL), call
1084 function CALLBACK for every function in the call graph. Otherwise,
48e1416a 1085 call CALLBACK on the current function. */
6354626c 1086
77fce4cd 1087static void
80f94d49 1088do_per_function (void (*callback) (void *data), void *data)
77fce4cd 1089{
80f94d49 1090 if (current_function_decl)
1091 callback (data);
1092 else
1093 {
1094 struct cgraph_node *node;
1095 for (node = cgraph_nodes; node; node = node->next)
7fe9b425 1096 if (node->analyzed && gimple_has_body_p (node->decl)
1097 && (!node->clone_of || node->decl != node->clone_of->decl))
80f94d49 1098 {
1099 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1100 current_function_decl = node->decl;
1101 callback (data);
7bfefa9d 1102 if (!flag_wpa)
1103 {
1104 free_dominance_info (CDI_DOMINATORS);
1105 free_dominance_info (CDI_POST_DOMINATORS);
1106 }
80f94d49 1107 current_function_decl = NULL;
1108 pop_cfun ();
1109 ggc_collect ();
1110 }
1111 }
1112}
1113
09a2e412 1114/* Because inlining might remove no-longer reachable nodes, we need to
1115 keep the array visible to garbage collector to avoid reading collected
1116 out nodes. */
1117static int nnodes;
1118static GTY ((length ("nnodes"))) struct cgraph_node **order;
1119
1120/* If we are in IPA mode (i.e., current_function_decl is NULL), call
1121 function CALLBACK for every function in the call graph. Otherwise,
c9036234 1122 call CALLBACK on the current function.
1123 This function is global so that plugins can use it. */
1124void
09a2e412 1125do_per_function_toporder (void (*callback) (void *data), void *data)
1126{
1127 int i;
1128
1129 if (current_function_decl)
1130 callback (data);
1131 else
1132 {
1133 gcc_assert (!order);
4077bf7a 1134 order = GGC_NEWVEC (struct cgraph_node *, cgraph_n_nodes);
09a2e412 1135 nnodes = cgraph_postorder (order);
09fc9532 1136 for (i = nnodes - 1; i >= 0; i--)
1137 order[i]->process = 1;
09a2e412 1138 for (i = nnodes - 1; i >= 0; i--)
1139 {
1140 struct cgraph_node *node = order[i];
1141
1142 /* Allow possibly removed nodes to be garbage collected. */
1143 order[i] = NULL;
09fc9532 1144 node->process = 0;
59dd4830 1145 if (node->analyzed)
09a2e412 1146 {
1147 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1148 current_function_decl = node->decl;
1149 callback (data);
1150 free_dominance_info (CDI_DOMINATORS);
1151 free_dominance_info (CDI_POST_DOMINATORS);
1152 current_function_decl = NULL;
1153 pop_cfun ();
1154 ggc_collect ();
1155 }
1156 }
1157 }
1158 ggc_free (order);
1159 order = NULL;
1160 nnodes = 0;
1161}
1162
80f94d49 1163/* Perform all TODO actions that ought to be done on each function. */
77fce4cd 1164
80f94d49 1165static void
1166execute_function_todo (void *data)
1167{
1168 unsigned int flags = (size_t)data;
1169 if (cfun->curr_properties & PROP_ssa)
6354626c 1170 flags |= TODO_verify_ssa;
80f94d49 1171 flags &= ~cfun->last_verified;
6354626c 1172 if (!flags)
1173 return;
9659d177 1174
1175 statistics_fini_pass ();
1176
6fa78c7b 1177 /* Always cleanup the CFG before trying to update SSA. */
77fce4cd 1178 if (flags & TODO_cleanup_cfg)
1179 {
eb2a640e 1180 bool cleanup = cleanup_tree_cfg ();
ae79515f 1181
6fa78c7b 1182 if (cleanup && (cfun->curr_properties & PROP_ssa))
1183 flags |= TODO_remove_unused_locals;
48e1416a 1184
ae79515f 1185 /* When cleanup_tree_cfg merges consecutive blocks, it may
1186 perform some simplistic propagation when removing single
1187 valued PHI nodes. This propagation may, in turn, cause the
1188 SSA form to become out-of-date (see PR 22037). So, even
1189 if the parent pass had not scheduled an SSA update, we may
1190 still need to do one. */
dd277d48 1191 if (!(flags & TODO_update_ssa_any) && need_ssa_update_p (cfun))
ae79515f 1192 flags |= TODO_update_ssa;
77fce4cd 1193 }
a49a878f 1194
91be5bb8 1195 if (flags & TODO_update_ssa_any)
1196 {
1197 unsigned update_flags = flags & TODO_update_ssa_any;
1198 update_ssa (update_flags);
80f94d49 1199 cfun->last_verified &= ~TODO_verify_ssa;
91be5bb8 1200 }
48e1416a 1201
dd277d48 1202 if (flags & TODO_update_address_taken)
1203 execute_update_addresses_taken (true);
1204
b1b7c0c4 1205 if (flags & TODO_rebuild_alias)
1206 {
dd277d48 1207 if (!(flags & TODO_update_address_taken))
1208 execute_update_addresses_taken (true);
b1b7c0c4 1209 compute_may_aliases ();
b1b7c0c4 1210 }
48e1416a 1211
db22d3cc 1212 if (flags & TODO_remove_unused_locals)
1213 remove_unused_locals ();
1214
75a70cf9 1215 if ((flags & TODO_dump_func) && dump_file && current_function_decl)
77fce4cd 1216 {
80f94d49 1217 if (cfun->curr_properties & PROP_trees)
75a70cf9 1218 dump_function_to_file (current_function_decl, dump_file, dump_flags);
75ab26dc 1219 else
5f0ef107 1220 {
75ab26dc 1221 if (dump_flags & TDF_SLIM)
1222 print_rtl_slim_with_bb (dump_file, get_insns (), dump_flags);
80f94d49 1223 else if ((cfun->curr_properties & PROP_cfg)
1224 && (dump_flags & TDF_BLOCKS))
75ab26dc 1225 print_rtl_with_bb (dump_file, get_insns ());
1226 else
1227 print_rtl (dump_file, get_insns ());
1228
75a70cf9 1229 if ((cfun->curr_properties & PROP_cfg)
75ab26dc 1230 && graph_dump_format != no_graph
5f0ef107 1231 && (dump_flags & TDF_GRAPH))
1232 print_rtl_graph_with_bb (dump_file_name, get_insns ());
1233 }
77fce4cd 1234
1235 /* Flush the file. If verification fails, we won't be able to
1236 close the file before aborting. */
1237 fflush (dump_file);
1238 }
80f94d49 1239
4ae20857 1240 if (flags & TODO_rebuild_frequencies)
1241 {
1242 if (profile_status == PROFILE_GUESSED)
1243 {
1244 loop_optimizer_init (0);
1245 add_noreturn_fake_exit_edges ();
1246 mark_irreducible_loops ();
1247 connect_infinite_loops_to_exit ();
1248 estimate_bb_frequencies ();
1249 remove_fake_exit_edges ();
1250 loop_optimizer_finalize ();
1251 }
1252 else if (profile_status == PROFILE_READ)
1253 counts_to_freqs ();
1254 else
1255 gcc_unreachable ();
1256 }
1257
80f94d49 1258#if defined ENABLE_CHECKING
ca77c6ec 1259 if (flags & TODO_verify_ssa
1260 || (current_loops && loops_state_satisfies_p (LOOP_CLOSED_SSA)))
80f94d49 1261 verify_ssa (true);
1262 if (flags & TODO_verify_flow)
1263 verify_flow_info ();
1264 if (flags & TODO_verify_stmts)
1265 verify_stmts ();
a29ec3eb 1266 if (current_loops && loops_state_satisfies_p (LOOP_CLOSED_SSA))
ca77c6ec 1267 verify_loop_closed_ssa (false);
0806b508 1268 if (flags & TODO_verify_rtl_sharing)
1269 verify_rtl_sharing ();
80f94d49 1270#endif
1271
1272 cfun->last_verified = flags & TODO_verify_all;
1273}
1274
1275/* Perform all TODO actions. */
1276static void
1277execute_todo (unsigned int flags)
1278{
1279#if defined ENABLE_CHECKING
dd277d48 1280 if (cfun
1281 && need_ssa_update_p (cfun))
80f94d49 1282 gcc_assert (flags & TODO_update_ssa_any);
1283#endif
1284
7e0311ae 1285 /* Inform the pass whether it is the first time it is run. */
1286 first_pass_instance = (flags & TODO_mark_first_instance) != 0;
1287
80f94d49 1288 do_per_function (execute_function_todo, (void *)(size_t) flags);
1289
f37a5008 1290 /* Always remove functions just as before inlining: IPA passes might be
1291 interested to see bodies of extern inline functions that are not inlined
1292 to analyze side effects. The full removal is done just at the end
1293 of IPA pass queue. */
1294 if (flags & TODO_remove_functions)
fba7ae09 1295 {
1296 gcc_assert (!cfun);
1297 cgraph_remove_unreachable_nodes (true, dump_file);
1298 }
f37a5008 1299
75a70cf9 1300 if ((flags & TODO_dump_cgraph) && dump_file && !current_function_decl)
77fce4cd 1301 {
fba7ae09 1302 gcc_assert (!cfun);
77fce4cd 1303 dump_cgraph (dump_file);
1304 /* Flush the file. If verification fails, we won't be able to
1305 close the file before aborting. */
1306 fflush (dump_file);
1307 }
a49a878f 1308
77fce4cd 1309 if (flags & TODO_ggc_collect)
75a70cf9 1310 ggc_collect ();
3072d30e 1311
48e1416a 1312 /* Now that the dumping has been done, we can get rid of the optional
3072d30e 1313 df problems. */
1314 if (flags & TODO_df_finish)
314966f4 1315 df_finish_pass ((flags & TODO_df_verify) != 0);
80f94d49 1316}
da2f1613 1317
add6ee5e 1318/* Verify invariants that should hold between passes. This is a place
1319 to put simple sanity checks. */
1320
1321static void
1322verify_interpass_invariants (void)
1323{
1324#ifdef ENABLE_CHECKING
1325 gcc_assert (!fold_deferring_overflow_warnings_p ());
1326#endif
1327}
1328
80f94d49 1329/* Clear the last verified flag. */
1330
1331static void
1332clear_last_verified (void *data ATTRIBUTE_UNUSED)
1333{
1334 cfun->last_verified = 0;
1335}
1336
1337/* Helper function. Verify that the properties has been turn into the
1338 properties expected by the pass. */
6354626c 1339
14c14128 1340#ifdef ENABLE_CHECKING
80f94d49 1341static void
1342verify_curr_properties (void *data)
1343{
1344 unsigned int props = (size_t)data;
1345 gcc_assert ((cfun->curr_properties & props) == props);
1346}
14c14128 1347#endif
80f94d49 1348
68e3904e 1349/* Initialize pass dump file. */
c9036234 1350/* This is non-static so that the plugins can use it. */
68e3904e 1351
c9036234 1352bool
68e3904e 1353pass_init_dump_file (struct opt_pass *pass)
1354{
1355 /* If a dump file name is present, open it if enabled. */
1356 if (pass->static_pass_number != -1)
1357 {
1358 bool initializing_dump = !dump_initialized_p (pass->static_pass_number);
1359 dump_file_name = get_dump_file_name (pass->static_pass_number);
1360 dump_file = dump_begin (pass->static_pass_number, &dump_flags);
1361 if (dump_file && current_function_decl)
1362 {
1363 const char *dname, *aname;
1364 dname = lang_hooks.decl_printable_name (current_function_decl, 2);
1365 aname = (IDENTIFIER_POINTER
1366 (DECL_ASSEMBLER_NAME (current_function_decl)));
0300832e 1367 fprintf (dump_file, "\n;; Function %s (%s)%s\n\n", dname, aname,
68e3904e 1368 cfun->function_frequency == FUNCTION_FREQUENCY_HOT
1369 ? " (hot)"
1370 : cfun->function_frequency == FUNCTION_FREQUENCY_UNLIKELY_EXECUTED
1371 ? " (unlikely executed)"
1372 : "");
1373 }
1374 return initializing_dump;
1375 }
1376 else
1377 return false;
1378}
1379
1380/* Flush PASS dump file. */
c9036234 1381/* This is non-static so that plugins can use it. */
68e3904e 1382
c9036234 1383void
68e3904e 1384pass_fini_dump_file (struct opt_pass *pass)
1385{
1386 /* Flush and close dump file. */
1387 if (dump_file_name)
1388 {
1389 free (CONST_CAST (char *, dump_file_name));
1390 dump_file_name = NULL;
1391 }
1392
1393 if (dump_file)
1394 {
1395 dump_end (pass->static_pass_number, dump_file);
1396 dump_file = NULL;
1397 }
1398}
1399
80f94d49 1400/* After executing the pass, apply expected changes to the function
1401 properties. */
68e3904e 1402
80f94d49 1403static void
1404update_properties_after_pass (void *data)
1405{
4077bf7a 1406 struct opt_pass *pass = (struct opt_pass *) data;
80f94d49 1407 cfun->curr_properties = (cfun->curr_properties | pass->properties_provided)
1408 & ~pass->properties_destroyed;
a49a878f 1409}
1410
9c1bff7a 1411/* Execute summary generation for all of the passes in IPA_PASS. */
68e3904e 1412
7bfefa9d 1413void
26dbec0a 1414execute_ipa_summary_passes (struct ipa_opt_pass_d *ipa_pass)
68e3904e 1415{
9c1bff7a 1416 while (ipa_pass)
68e3904e 1417 {
1418 struct opt_pass *pass = &ipa_pass->pass;
9c1bff7a 1419
1420 /* Execute all of the IPA_PASSes in the list. */
48e1416a 1421 if (ipa_pass->pass.type == IPA_PASS
7bfefa9d 1422 && (!pass->gate || pass->gate ())
1423 && ipa_pass->generate_summary)
68e3904e 1424 {
1425 pass_init_dump_file (pass);
7bfefa9d 1426
1427 /* If a timevar is present, start it. */
1428 if (pass->tv_id)
1429 timevar_push (pass->tv_id);
1430
9c1bff7a 1431 ipa_pass->generate_summary ();
7bfefa9d 1432
1433 /* Stop timevar. */
1434 if (pass->tv_id)
1435 timevar_pop (pass->tv_id);
1436
68e3904e 1437 pass_fini_dump_file (pass);
1438 }
26dbec0a 1439 ipa_pass = (struct ipa_opt_pass_d *)ipa_pass->pass.next;
68e3904e 1440 }
1441}
1442
1443/* Execute IPA_PASS function transform on NODE. */
1444
1445static void
1446execute_one_ipa_transform_pass (struct cgraph_node *node,
26dbec0a 1447 struct ipa_opt_pass_d *ipa_pass)
68e3904e 1448{
1449 struct opt_pass *pass = &ipa_pass->pass;
1450 unsigned int todo_after = 0;
1451
1452 current_pass = pass;
1453 if (!ipa_pass->function_transform)
1454 return;
1455
1456 /* Note that the folders should only create gimple expressions.
1457 This is a hack until the new folder is ready. */
1458 in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
1459
1460 pass_init_dump_file (pass);
1461
1462 /* Run pre-pass verification. */
fba7ae09 1463 execute_todo (ipa_pass->function_transform_todo_flags_start);
68e3904e 1464
1465 /* If a timevar is present, start it. */
0b1615c1 1466 if (pass->tv_id != TV_NONE)
68e3904e 1467 timevar_push (pass->tv_id);
1468
1469 /* Do it! */
1470 todo_after = ipa_pass->function_transform (node);
1471
1472 /* Stop timevar. */
0b1615c1 1473 if (pass->tv_id != TV_NONE)
68e3904e 1474 timevar_pop (pass->tv_id);
1475
1476 /* Run post-pass cleanup and verification. */
1477 execute_todo (todo_after);
1478 verify_interpass_invariants ();
1479
1480 pass_fini_dump_file (pass);
1481
1482 current_pass = NULL;
68e3904e 1483}
1484
7bfefa9d 1485/* For the current function, execute all ipa transforms. */
5d48fdb4 1486
7bfefa9d 1487void
1488execute_all_ipa_transforms (void)
1489{
6d1cc52c 1490 struct cgraph_node *node;
1491 if (!cfun)
1492 return;
1493 node = cgraph_node (current_function_decl);
1494 if (node->ipa_transforms_to_apply)
68e3904e 1495 {
1496 unsigned int i;
68e3904e 1497
6d1cc52c 1498 for (i = 0; i < VEC_length (ipa_opt_pass, node->ipa_transforms_to_apply);
68e3904e 1499 i++)
1500 execute_one_ipa_transform_pass (node,
7bfefa9d 1501 VEC_index (ipa_opt_pass,
6d1cc52c 1502 node->ipa_transforms_to_apply,
68e3904e 1503 i));
6d1cc52c 1504 VEC_free (ipa_opt_pass, heap, node->ipa_transforms_to_apply);
1505 node->ipa_transforms_to_apply = NULL;
68e3904e 1506 }
7bfefa9d 1507}
1508
1509/* Execute PASS. */
1510
c9036234 1511bool
7bfefa9d 1512execute_one_pass (struct opt_pass *pass)
1513{
1514 bool initializing_dump;
1515 unsigned int todo_after = 0;
1516
c9036234 1517 bool gate_status;
1518
7bfefa9d 1519 /* IPA passes are executed on whole program, so cfun should be NULL.
1520 Other passes need function context set. */
1521 if (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS)
1522 gcc_assert (!cfun && !current_function_decl);
1523 else
1524 gcc_assert (cfun && current_function_decl);
68e3904e 1525
3072d30e 1526 current_pass = pass;
75a70cf9 1527
c9036234 1528 /* Check whether gate check should be avoided.
1529 User controls the value of the gate through the parameter "gate_status". */
1530 gate_status = (pass->gate == NULL) ? true : pass->gate();
1531
1532 /* Override gate with plugin. */
1533 invoke_plugin_callbacks (PLUGIN_OVERRIDE_GATE, &gate_status);
1534
1535 if (!gate_status)
1536 {
1537 current_pass = NULL;
1538 return false;
1539 }
1540
1541 /* Pass execution event trigger: useful to identify passes being
1542 executed. */
1543 invoke_plugin_callbacks (PLUGIN_PASS_EXECUTION, pass);
a49a878f 1544
fa0ccb6b 1545 if (!quiet_flag && !cfun)
09a2e412 1546 fprintf (stderr, " <%s>", pass->name ? pass->name : "");
1547
77fce4cd 1548 /* Note that the folders should only create gimple expressions.
1549 This is a hack until the new folder is ready. */
80f94d49 1550 in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
a49a878f 1551
dd277d48 1552 initializing_dump = pass_init_dump_file (pass);
1553
77fce4cd 1554 /* Run pre-pass verification. */
6354626c 1555 execute_todo (pass->todo_flags_start);
1556
80f94d49 1557#ifdef ENABLE_CHECKING
1558 do_per_function (verify_curr_properties,
1559 (void *)(size_t)pass->properties_required);
1560#endif
a49a878f 1561
77fce4cd 1562 /* If a timevar is present, start it. */
0b1615c1 1563 if (pass->tv_id != TV_NONE)
77fce4cd 1564 timevar_push (pass->tv_id);
a49a878f 1565
77fce4cd 1566 /* Do it! */
1567 if (pass->execute)
6354626c 1568 {
2a1990e9 1569 todo_after = pass->execute ();
80f94d49 1570 do_per_function (clear_last_verified, NULL);
6354626c 1571 }
a49a878f 1572
77fce4cd 1573 /* Stop timevar. */
0b1615c1 1574 if (pass->tv_id != TV_NONE)
77fce4cd 1575 timevar_pop (pass->tv_id);
a49a878f 1576
80f94d49 1577 do_per_function (update_properties_after_pass, pass);
6354626c 1578
1579 if (initializing_dump
1580 && dump_file
1581 && graph_dump_format != no_graph
d885a412 1582 && cfun
80f94d49 1583 && (cfun->curr_properties & (PROP_cfg | PROP_rtl))
1584 == (PROP_cfg | PROP_rtl))
6354626c 1585 {
1586 get_dump_file_info (pass->static_pass_number)->flags |= TDF_GRAPH;
1587 dump_flags |= TDF_GRAPH;
1588 clean_graph_dump_file (dump_file_name);
1589 }
1590
77fce4cd 1591 /* Run post-pass cleanup and verification. */
2a1990e9 1592 execute_todo (todo_after | pass->todo_flags_finish);
add6ee5e 1593 verify_interpass_invariants ();
68e3904e 1594 if (pass->type == IPA_PASS)
6d1cc52c 1595 {
1596 struct cgraph_node *node;
1597 for (node = cgraph_nodes; node; node = node->next)
1598 if (node->analyzed)
1599 VEC_safe_push (ipa_opt_pass, heap, node->ipa_transforms_to_apply,
1600 (struct ipa_opt_pass_d *)pass);
1601 }
a49a878f 1602
523c1122 1603 if (!current_function_decl)
1604 cgraph_process_new_functions ();
1605
68e3904e 1606 pass_fini_dump_file (pass);
a49a878f 1607
68e3904e 1608 if (pass->type != SIMPLE_IPA_PASS && pass->type != IPA_PASS)
18d50ae6 1609 gcc_assert (!(cfun->curr_properties & PROP_trees)
1610 || pass->type != RTL_PASS);
1611
3072d30e 1612 current_pass = NULL;
159787b7 1613
77fce4cd 1614 return true;
a49a878f 1615}
1616
77fce4cd 1617void
20099e35 1618execute_pass_list (struct opt_pass *pass)
a49a878f 1619{
77fce4cd 1620 do
a49a878f 1621 {
5d48fdb4 1622 gcc_assert (pass->type == GIMPLE_PASS
1623 || pass->type == RTL_PASS);
77fce4cd 1624 if (execute_one_pass (pass) && pass->sub)
1625 execute_pass_list (pass->sub);
1626 pass = pass->next;
a49a878f 1627 }
77fce4cd 1628 while (pass);
a49a878f 1629}
1630
77fce4cd 1631/* Same as execute_pass_list but assume that subpasses of IPA passes
7bfefa9d 1632 are local passes. If SET is not NULL, write out summaries of only
1633 those node in SET. */
1634
1635static void
1636ipa_write_summaries_2 (struct opt_pass *pass, cgraph_node_set set,
1637 struct lto_out_decl_state *state)
1638{
1639 while (pass)
1640 {
1641 struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *)pass;
1642 gcc_assert (!current_function_decl);
1643 gcc_assert (!cfun);
1644 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
1645 if (pass->type == IPA_PASS
1646 && ipa_pass->write_summary
1647 && (!pass->gate || pass->gate ()))
1648 {
1649 /* If a timevar is present, start it. */
1650 if (pass->tv_id)
1651 timevar_push (pass->tv_id);
1652
1653 ipa_pass->write_summary (set);
1654
1655 /* If a timevar is present, start it. */
1656 if (pass->tv_id)
1657 timevar_pop (pass->tv_id);
1658 }
1659
1660 if (pass->sub && pass->sub->type != GIMPLE_PASS)
1661 ipa_write_summaries_2 (pass->sub, set, state);
1662
1663 pass = pass->next;
1664 }
1665}
1666
1667/* Helper function of ipa_write_summaries. Creates and destroys the
1668 decl state and calls ipa_write_summaries_2 for all passes that have
1669 summaries. SET is the set of nodes to be written. */
1670
1671static void
1672ipa_write_summaries_1 (cgraph_node_set set)
1673{
1674 struct lto_out_decl_state *state = lto_new_out_decl_state ();
1675 lto_push_out_decl_state (state);
1676
ddc90d88 1677 gcc_assert (!flag_wpa);
1678 ipa_write_summaries_2 (all_regular_ipa_passes, set, state);
7bfefa9d 1679 ipa_write_summaries_2 (all_lto_gen_passes, set, state);
1680
1681 gcc_assert (lto_get_out_decl_state () == state);
1682 lto_pop_out_decl_state ();
1683 lto_delete_out_decl_state (state);
1684}
1685
1686/* Write out summaries for all the nodes in the callgraph. */
1687
77fce4cd 1688void
7bfefa9d 1689ipa_write_summaries (void)
a49a878f 1690{
7bfefa9d 1691 cgraph_node_set set;
1692 struct cgraph_node **order;
1693 int i, order_pos;
48e1416a 1694
7bfefa9d 1695 if (!flag_generate_lto || errorcount || sorrycount)
1696 return;
1697
7bfefa9d 1698 set = cgraph_node_set_new ();
1699
1700 /* Create the callgraph set in the same order used in
1701 cgraph_expand_all_functions. This mostly facilitates debugging,
1702 since it causes the gimple file to be processed in the same order
1703 as the source code. */
1704 order = XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
1705 order_pos = cgraph_postorder (order);
1706 gcc_assert (order_pos == cgraph_n_nodes);
1707
1708 for (i = order_pos - 1; i >= 0; i--)
8e78b58c 1709 {
1710 struct cgraph_node *node = order[i];
1711
1712 if (node->analyzed)
1713 {
1714 /* When streaming out references to statements as part of some IPA
1715 pass summary, the statements need to have uids assigned and the
1716 following does that for all the IPA passes here. Naturally, this
1717 ordering then matches the one IPA-passes get in their stmt_fixup
1718 hooks. */
1719
1720 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1721 renumber_gimple_stmt_uids ();
1722 pop_cfun ();
1723 }
1724 cgraph_node_set_add (set, node);
1725 }
7bfefa9d 1726
1727 ipa_write_summaries_1 (set);
7bfefa9d 1728
1729 free (order);
1730 ggc_free (set);
1731}
1732
ddc90d88 1733/* Same as execute_pass_list but assume that subpasses of IPA passes
1734 are local passes. If SET is not NULL, write out optimization summaries of
1735 only those node in SET. */
7bfefa9d 1736
ddc90d88 1737static void
1738ipa_write_optimization_summaries_1 (struct opt_pass *pass, cgraph_node_set set,
1739 struct lto_out_decl_state *state)
1740{
1741 while (pass)
1742 {
1743 struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *)pass;
1744 gcc_assert (!current_function_decl);
1745 gcc_assert (!cfun);
1746 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
1747 if (pass->type == IPA_PASS
1748 && ipa_pass->write_optimization_summary
1749 && (!pass->gate || pass->gate ()))
1750 {
1751 /* If a timevar is present, start it. */
1752 if (pass->tv_id)
1753 timevar_push (pass->tv_id);
1754
1755 ipa_pass->write_optimization_summary (set);
1756
1757 /* If a timevar is present, start it. */
1758 if (pass->tv_id)
1759 timevar_pop (pass->tv_id);
1760 }
1761
1762 if (pass->sub && pass->sub->type != GIMPLE_PASS)
1763 ipa_write_optimization_summaries_1 (pass->sub, set, state);
1764
1765 pass = pass->next;
1766 }
1767}
1768
1769/* Write all the optimization summaries for the cgraph nodes in SET. If SET is
7bfefa9d 1770 NULL, write out all summaries of all nodes. */
1771
1772void
ddc90d88 1773ipa_write_optimization_summaries (cgraph_node_set set)
7bfefa9d 1774{
ddc90d88 1775 struct lto_out_decl_state *state = lto_new_out_decl_state ();
1776 lto_push_out_decl_state (state);
1777
1778 gcc_assert (flag_wpa);
1779 ipa_write_optimization_summaries_1 (all_regular_ipa_passes, set, state);
1780 ipa_write_optimization_summaries_1 (all_lto_gen_passes, set, state);
1781
1782 gcc_assert (lto_get_out_decl_state () == state);
1783 lto_pop_out_decl_state ();
1784 lto_delete_out_decl_state (state);
7bfefa9d 1785}
1786
1787/* Same as execute_pass_list but assume that subpasses of IPA passes
1788 are local passes. */
1789
1790static void
1791ipa_read_summaries_1 (struct opt_pass *pass)
1792{
1793 while (pass)
a49a878f 1794 {
7bfefa9d 1795 struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *) pass;
1796
80f94d49 1797 gcc_assert (!current_function_decl);
1798 gcc_assert (!cfun);
68e3904e 1799 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
7bfefa9d 1800
1801 if (pass->gate == NULL || pass->gate ())
68e3904e 1802 {
7bfefa9d 1803 if (pass->type == IPA_PASS && ipa_pass->read_summary)
68e3904e 1804 {
7bfefa9d 1805 /* If a timevar is present, start it. */
1806 if (pass->tv_id)
1807 timevar_push (pass->tv_id);
1808
1809 ipa_pass->read_summary ();
1810
1811 /* Stop timevar. */
1812 if (pass->tv_id)
1813 timevar_pop (pass->tv_id);
68e3904e 1814 }
7bfefa9d 1815
1816 if (pass->sub && pass->sub->type != GIMPLE_PASS)
1817 ipa_read_summaries_1 (pass->sub);
68e3904e 1818 }
7bfefa9d 1819 pass = pass->next;
1820 }
1821}
1822
1823
1824/* Read all the summaries for all_regular_ipa_passes and all_lto_gen_passes. */
1825
1826void
1827ipa_read_summaries (void)
1828{
ddc90d88 1829 ipa_read_summaries_1 (all_regular_ipa_passes);
7bfefa9d 1830 ipa_read_summaries_1 (all_lto_gen_passes);
1831}
1832
ddc90d88 1833/* Same as execute_pass_list but assume that subpasses of IPA passes
1834 are local passes. */
1835
1836static void
1837ipa_read_optimization_summaries_1 (struct opt_pass *pass)
1838{
1839 while (pass)
1840 {
1841 struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *) pass;
1842
1843 gcc_assert (!current_function_decl);
1844 gcc_assert (!cfun);
1845 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
1846
1847 if (pass->gate == NULL || pass->gate ())
1848 {
1849 if (pass->type == IPA_PASS && ipa_pass->read_optimization_summary)
1850 {
1851 /* If a timevar is present, start it. */
1852 if (pass->tv_id)
1853 timevar_push (pass->tv_id);
1854
1855 ipa_pass->read_optimization_summary ();
1856
1857 /* Stop timevar. */
1858 if (pass->tv_id)
1859 timevar_pop (pass->tv_id);
1860 }
1861
1862 if (pass->sub && pass->sub->type != GIMPLE_PASS)
1863 ipa_read_optimization_summaries_1 (pass->sub);
1864 }
1865 pass = pass->next;
1866 }
1867}
1868
1869/* Read all the summaries for all_regular_ipa_passes and all_lto_gen_passes. */
1870
1871void
1872ipa_read_optimization_summaries (void)
1873{
1874 ipa_read_optimization_summaries_1 (all_regular_ipa_passes);
1875 ipa_read_optimization_summaries_1 (all_lto_gen_passes);
1876}
1877
7bfefa9d 1878/* Same as execute_pass_list but assume that subpasses of IPA passes
1879 are local passes. */
1880void
1881execute_ipa_pass_list (struct opt_pass *pass)
1882{
1883 do
1884 {
1885 gcc_assert (!current_function_decl);
1886 gcc_assert (!cfun);
1887 gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
77fce4cd 1888 if (execute_one_pass (pass) && pass->sub)
5d48fdb4 1889 {
1890 if (pass->sub->type == GIMPLE_PASS)
c9036234 1891 {
1892 invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_START, NULL);
1893 do_per_function_toporder ((void (*)(void *))execute_pass_list,
1894 pass->sub);
1895 invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_END, NULL);
1896 }
68e3904e 1897 else if (pass->sub->type == SIMPLE_IPA_PASS
1898 || pass->sub->type == IPA_PASS)
5d48fdb4 1899 execute_ipa_pass_list (pass->sub);
1900 else
1901 gcc_unreachable ();
1902 }
7bfefa9d 1903 gcc_assert (!current_function_decl);
1904 cgraph_process_new_functions ();
77fce4cd 1905 pass = pass->next;
a49a878f 1906 }
77fce4cd 1907 while (pass);
da2f1613 1908}
9659d177 1909
90464c8b 1910/* Execute stmt fixup hooks of all passes in PASS for NODE and STMTS. */
1911
1912static void
1913execute_ipa_stmt_fixups (struct opt_pass *pass,
1914 struct cgraph_node *node, gimple *stmts)
1915{
1916 while (pass)
1917 {
1918 /* Execute all of the IPA_PASSes in the list. */
1919 if (pass->type == IPA_PASS
1920 && (!pass->gate || pass->gate ()))
1921 {
1922 struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *) pass;
1923
1924 if (ipa_pass->stmt_fixup)
1925 {
1926 pass_init_dump_file (pass);
1927 /* If a timevar is present, start it. */
1928 if (pass->tv_id)
1929 timevar_push (pass->tv_id);
1930
1931 ipa_pass->stmt_fixup (node, stmts);
1932
1933 /* Stop timevar. */
1934 if (pass->tv_id)
1935 timevar_pop (pass->tv_id);
1936 pass_fini_dump_file (pass);
1937 }
1938 if (pass->sub)
1939 execute_ipa_stmt_fixups (pass->sub, node, stmts);
1940 }
1941 pass = pass->next;
1942 }
1943}
1944
1945/* Execute stmt fixup hooks of all IPA passes for NODE and STMTS. */
1946
1947void
1948execute_all_ipa_stmt_fixups (struct cgraph_node *node, gimple *stmts)
1949{
1950 execute_ipa_stmt_fixups (all_regular_ipa_passes, node, stmts);
1951}
1952
1953
7bfefa9d 1954extern void debug_properties (unsigned int);
1955extern void dump_properties (FILE *, unsigned int);
1956
1957void
1958dump_properties (FILE *dump, unsigned int props)
1959{
1960 fprintf (dump, "Properties:\n");
1961 if (props & PROP_gimple_any)
1962 fprintf (dump, "PROP_gimple_any\n");
1963 if (props & PROP_gimple_lcf)
1964 fprintf (dump, "PROP_gimple_lcf\n");
1965 if (props & PROP_gimple_leh)
1966 fprintf (dump, "PROP_gimple_leh\n");
1967 if (props & PROP_cfg)
1968 fprintf (dump, "PROP_cfg\n");
1969 if (props & PROP_referenced_vars)
1970 fprintf (dump, "PROP_referenced_vars\n");
1971 if (props & PROP_ssa)
1972 fprintf (dump, "PROP_ssa\n");
1973 if (props & PROP_no_crit_edges)
1974 fprintf (dump, "PROP_no_crit_edges\n");
1975 if (props & PROP_rtl)
1976 fprintf (dump, "PROP_rtl\n");
1977 if (props & PROP_gimple_lomp)
1978 fprintf (dump, "PROP_gimple_lomp\n");
7b76dcb9 1979 if (props & PROP_gimple_lcx)
1980 fprintf (dump, "PROP_gimple_lcx\n");
7bfefa9d 1981}
1982
1983void
1984debug_properties (unsigned int props)
1985{
1986 dump_properties (stderr, props);
1987}
1988
b5cebd44 1989/* Called by local passes to see if function is called by already processed nodes.
1990 Because we process nodes in topological order, this means that function is
1991 in recursive cycle or we introduced new direct calls. */
1992bool
1993function_called_by_processed_nodes_p (void)
1994{
1995 struct cgraph_edge *e;
1996 for (e = cgraph_node (current_function_decl)->callers; e; e = e->next_caller)
1997 {
1998 if (e->caller->decl == current_function_decl)
1999 continue;
59dd4830 2000 if (!e->caller->analyzed)
b5cebd44 2001 continue;
2002 if (TREE_ASM_WRITTEN (e->caller->decl))
2003 continue;
2004 if (!e->caller->process && !e->caller->global.inlined_to)
2005 break;
2006 }
2007 if (dump_file && e)
2008 {
2009 fprintf (dump_file, "Already processed call to:\n");
2010 dump_cgraph_node (dump_file, e->caller);
2011 }
2012 return e != NULL;
2013}
2014
09a2e412 2015#include "gt-passes.h"