OSDN Git Service

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