OSDN Git Service

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