OSDN Git Service

PR target/47935
[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   *p = NULL;
733
734   /* Interprocedural optimization passes.  */
735   p = &all_small_ipa_passes;
736   NEXT_PASS (pass_ipa_free_lang_data);
737   NEXT_PASS (pass_ipa_function_and_variable_visibility);
738   NEXT_PASS (pass_early_local_passes);
739     {
740       struct opt_pass **p = &pass_early_local_passes.pass.sub;
741       NEXT_PASS (pass_fixup_cfg);
742       NEXT_PASS (pass_init_datastructures);
743       NEXT_PASS (pass_expand_omp);
744
745       NEXT_PASS (pass_referenced_vars);
746       NEXT_PASS (pass_build_ssa);
747       NEXT_PASS (pass_lower_vector);
748       NEXT_PASS (pass_early_warn_uninitialized);
749       NEXT_PASS (pass_rebuild_cgraph_edges);
750       NEXT_PASS (pass_inline_parameters);
751       NEXT_PASS (pass_early_inline);
752       NEXT_PASS (pass_all_early_optimizations);
753         {
754           struct opt_pass **p = &pass_all_early_optimizations.pass.sub;
755           NEXT_PASS (pass_remove_cgraph_callee_edges);
756           NEXT_PASS (pass_rename_ssa_copies);
757           NEXT_PASS (pass_ccp);
758           NEXT_PASS (pass_forwprop);
759           /* pass_build_ealias is a dummy pass that ensures that we
760              execute TODO_rebuild_alias at this point.  Re-building
761              alias information also rewrites no longer addressed
762              locals into SSA form if possible.  */
763           NEXT_PASS (pass_build_ealias);
764           NEXT_PASS (pass_sra_early);
765           NEXT_PASS (pass_copy_prop);
766           NEXT_PASS (pass_merge_phi);
767           NEXT_PASS (pass_cd_dce);
768           NEXT_PASS (pass_early_ipa_sra);
769           NEXT_PASS (pass_tail_recursion);
770           NEXT_PASS (pass_convert_switch);
771           NEXT_PASS (pass_cleanup_eh);
772           NEXT_PASS (pass_profile);
773           NEXT_PASS (pass_local_pure_const);
774           /* Split functions creates parts that are not run through
775              early optimizations again.  It is thus good idea to do this
776              late.  */
777           NEXT_PASS (pass_split_functions);
778         }
779       NEXT_PASS (pass_release_ssa_names);
780       NEXT_PASS (pass_rebuild_cgraph_edges);
781       NEXT_PASS (pass_inline_parameters);
782     }
783   NEXT_PASS (pass_ipa_tree_profile);
784     {
785       struct opt_pass **p = &pass_ipa_tree_profile.pass.sub;
786       NEXT_PASS (pass_feedback_split_functions);
787     }
788   NEXT_PASS (pass_ipa_increase_alignment);
789   NEXT_PASS (pass_ipa_matrix_reorg);
790   NEXT_PASS (pass_ipa_lower_emutls);
791   *p = NULL;
792
793   p = &all_regular_ipa_passes;
794   NEXT_PASS (pass_ipa_whole_program_visibility);
795   NEXT_PASS (pass_ipa_profile);
796   NEXT_PASS (pass_ipa_cp);
797   NEXT_PASS (pass_ipa_cdtor_merge);
798   NEXT_PASS (pass_ipa_inline);
799   NEXT_PASS (pass_ipa_pure_const);
800   NEXT_PASS (pass_ipa_reference);
801   NEXT_PASS (pass_ipa_type_escape);
802   NEXT_PASS (pass_ipa_pta);
803   NEXT_PASS (pass_ipa_struct_reorg);
804   *p = NULL;
805
806   p = &all_lto_gen_passes;
807   NEXT_PASS (pass_ipa_lto_gimple_out);
808   NEXT_PASS (pass_ipa_lto_finish_out);  /* This must be the last LTO pass.  */
809   *p = NULL;
810
811   /* These passes are run after IPA passes on every function that is being
812      output to the assembler file.  */
813   p = &all_passes;
814   NEXT_PASS (pass_lower_eh_dispatch);
815   NEXT_PASS (pass_all_optimizations);
816     {
817       struct opt_pass **p = &pass_all_optimizations.pass.sub;
818       NEXT_PASS (pass_remove_cgraph_callee_edges);
819       /* Initial scalar cleanups before alias computation.
820          They ensure memory accesses are not indirect wherever possible.  */
821       NEXT_PASS (pass_strip_predict_hints);
822       NEXT_PASS (pass_rename_ssa_copies);
823       NEXT_PASS (pass_complete_unrolli);
824       NEXT_PASS (pass_ccp);
825       NEXT_PASS (pass_forwprop);
826       NEXT_PASS (pass_call_cdce);
827       /* pass_build_alias is a dummy pass that ensures that we
828          execute TODO_rebuild_alias at this point.  Re-building
829          alias information also rewrites no longer addressed
830          locals into SSA form if possible.  */
831       NEXT_PASS (pass_build_alias);
832       NEXT_PASS (pass_return_slot);
833       NEXT_PASS (pass_phiprop);
834       NEXT_PASS (pass_fre);
835       NEXT_PASS (pass_copy_prop);
836       NEXT_PASS (pass_merge_phi);
837       NEXT_PASS (pass_vrp);
838       NEXT_PASS (pass_dce);
839       NEXT_PASS (pass_cselim);
840       NEXT_PASS (pass_tree_ifcombine);
841       NEXT_PASS (pass_phiopt);
842       NEXT_PASS (pass_tail_recursion);
843       NEXT_PASS (pass_ch);
844       NEXT_PASS (pass_stdarg);
845       NEXT_PASS (pass_lower_complex);
846       NEXT_PASS (pass_sra);
847       NEXT_PASS (pass_rename_ssa_copies);
848       /* The dom pass will also resolve all __builtin_constant_p calls
849          that are still there to 0.  This has to be done after some
850          propagations have already run, but before some more dead code
851          is removed, and this place fits nicely.  Remember this when
852          trying to move or duplicate pass_dominator somewhere earlier.  */
853       NEXT_PASS (pass_dominator);
854       /* The only const/copy propagation opportunities left after
855          DOM should be due to degenerate PHI nodes.  So rather than
856          run the full propagators, run a specialized pass which
857          only examines PHIs to discover const/copy propagation
858          opportunities.  */
859       NEXT_PASS (pass_phi_only_cprop);
860       NEXT_PASS (pass_dse);
861       NEXT_PASS (pass_reassoc);
862       NEXT_PASS (pass_dce);
863       NEXT_PASS (pass_forwprop);
864       NEXT_PASS (pass_phiopt);
865       NEXT_PASS (pass_object_sizes);
866       NEXT_PASS (pass_ccp);
867       NEXT_PASS (pass_copy_prop);
868       NEXT_PASS (pass_cse_sincos);
869       NEXT_PASS (pass_optimize_bswap);
870       NEXT_PASS (pass_split_crit_edges);
871       NEXT_PASS (pass_pre);
872       NEXT_PASS (pass_sink_code);
873       NEXT_PASS (pass_tree_loop);
874         {
875           struct opt_pass **p = &pass_tree_loop.pass.sub;
876           NEXT_PASS (pass_tree_loop_init);
877           NEXT_PASS (pass_lim);
878           NEXT_PASS (pass_copy_prop);
879           NEXT_PASS (pass_dce_loop);
880           NEXT_PASS (pass_tree_unswitch);
881           NEXT_PASS (pass_scev_cprop);
882           NEXT_PASS (pass_record_bounds);
883           NEXT_PASS (pass_check_data_deps);
884           NEXT_PASS (pass_loop_distribution);
885           NEXT_PASS (pass_copy_prop);
886           NEXT_PASS (pass_graphite);
887             {
888               struct opt_pass **p = &pass_graphite.pass.sub;
889               NEXT_PASS (pass_graphite_transforms);
890               NEXT_PASS (pass_lim);
891               NEXT_PASS (pass_copy_prop);
892               NEXT_PASS (pass_dce_loop);
893             }
894           NEXT_PASS (pass_iv_canon);
895           NEXT_PASS (pass_if_conversion);
896           NEXT_PASS (pass_vectorize);
897             {
898               struct opt_pass **p = &pass_vectorize.pass.sub;
899               NEXT_PASS (pass_lower_vector_ssa);
900               NEXT_PASS (pass_dce_loop);
901             }
902           NEXT_PASS (pass_predcom);
903           NEXT_PASS (pass_complete_unroll);
904           NEXT_PASS (pass_slp_vectorize);
905           NEXT_PASS (pass_parallelize_loops);
906           NEXT_PASS (pass_loop_prefetch);
907           NEXT_PASS (pass_iv_optimize);
908           NEXT_PASS (pass_tree_loop_done);
909         }
910       NEXT_PASS (pass_cse_reciprocals);
911       NEXT_PASS (pass_reassoc);
912       NEXT_PASS (pass_vrp);
913       NEXT_PASS (pass_dominator);
914       /* The only const/copy propagation opportunities left after
915          DOM should be due to degenerate PHI nodes.  So rather than
916          run the full propagators, run a specialized pass which
917          only examines PHIs to discover const/copy propagation
918          opportunities.  */
919       NEXT_PASS (pass_phi_only_cprop);
920       NEXT_PASS (pass_cd_dce);
921       NEXT_PASS (pass_tracer);
922
923       /* FIXME: If DCE is not run before checking for uninitialized uses,
924          we may get false warnings (e.g., testsuite/gcc.dg/uninit-5.c).
925          However, this also causes us to misdiagnose cases that should be
926          real warnings (e.g., testsuite/gcc.dg/pr18501.c).
927
928          To fix the false positives in uninit-5.c, we would have to
929          account for the predicates protecting the set and the use of each
930          variable.  Using a representation like Gated Single Assignment
931          may help.  */
932       NEXT_PASS (pass_late_warn_uninitialized);
933       NEXT_PASS (pass_dse);
934       NEXT_PASS (pass_forwprop);
935       NEXT_PASS (pass_phiopt);
936       NEXT_PASS (pass_fold_builtins);
937       NEXT_PASS (pass_optimize_widening_mul);
938       NEXT_PASS (pass_tail_calls);
939       NEXT_PASS (pass_rename_ssa_copies);
940       NEXT_PASS (pass_uncprop);
941       NEXT_PASS (pass_local_pure_const);
942     }
943   NEXT_PASS (pass_lower_complex_O0);
944   NEXT_PASS (pass_cleanup_eh);
945   NEXT_PASS (pass_lower_resx);
946   NEXT_PASS (pass_nrv);
947   NEXT_PASS (pass_mudflap_2);
948   NEXT_PASS (pass_cleanup_cfg_post_optimizing);
949   NEXT_PASS (pass_warn_function_noreturn);
950
951   NEXT_PASS (pass_expand);
952
953   NEXT_PASS (pass_rest_of_compilation);
954     {
955       struct opt_pass **p = &pass_rest_of_compilation.pass.sub;
956       NEXT_PASS (pass_init_function);
957       NEXT_PASS (pass_jump);
958       NEXT_PASS (pass_rtl_eh);
959       NEXT_PASS (pass_initial_value_sets);
960       NEXT_PASS (pass_unshare_all_rtl);
961       NEXT_PASS (pass_instantiate_virtual_regs);
962       NEXT_PASS (pass_into_cfg_layout_mode);
963       NEXT_PASS (pass_jump2);
964       NEXT_PASS (pass_lower_subreg);
965       NEXT_PASS (pass_df_initialize_opt);
966       NEXT_PASS (pass_cse);
967       NEXT_PASS (pass_rtl_fwprop);
968       NEXT_PASS (pass_rtl_cprop);
969       NEXT_PASS (pass_rtl_pre);
970       NEXT_PASS (pass_rtl_hoist);
971       NEXT_PASS (pass_rtl_cprop);
972       NEXT_PASS (pass_rtl_store_motion);
973       NEXT_PASS (pass_cse_after_global_opts);
974       NEXT_PASS (pass_rtl_ifcvt);
975       NEXT_PASS (pass_reginfo_init);
976       /* Perform loop optimizations.  It might be better to do them a bit
977          sooner, but we want the profile feedback to work more
978          efficiently.  */
979       NEXT_PASS (pass_loop2);
980         {
981           struct opt_pass **p = &pass_loop2.pass.sub;
982           NEXT_PASS (pass_rtl_loop_init);
983           NEXT_PASS (pass_rtl_move_loop_invariants);
984           NEXT_PASS (pass_rtl_unswitch);
985           NEXT_PASS (pass_rtl_unroll_and_peel_loops);
986           NEXT_PASS (pass_rtl_doloop);
987           NEXT_PASS (pass_rtl_loop_done);
988           *p = NULL;
989         }
990       NEXT_PASS (pass_web);
991       NEXT_PASS (pass_rtl_cprop);
992       NEXT_PASS (pass_cse2);
993       NEXT_PASS (pass_rtl_dse1);
994       NEXT_PASS (pass_rtl_fwprop_addr);
995       NEXT_PASS (pass_inc_dec);
996       NEXT_PASS (pass_initialize_regs);
997       NEXT_PASS (pass_ud_rtl_dce);
998       NEXT_PASS (pass_combine);
999       NEXT_PASS (pass_if_after_combine);
1000       NEXT_PASS (pass_partition_blocks);
1001       NEXT_PASS (pass_regmove);
1002       NEXT_PASS (pass_outof_cfg_layout_mode);
1003       NEXT_PASS (pass_split_all_insns);
1004       NEXT_PASS (pass_lower_subreg2);
1005       NEXT_PASS (pass_df_initialize_no_opt);
1006       NEXT_PASS (pass_stack_ptr_mod);
1007       NEXT_PASS (pass_mode_switching);
1008       NEXT_PASS (pass_match_asm_constraints);
1009       NEXT_PASS (pass_sms);
1010       NEXT_PASS (pass_sched);
1011       NEXT_PASS (pass_ira);
1012       NEXT_PASS (pass_postreload);
1013         {
1014           struct opt_pass **p = &pass_postreload.pass.sub;
1015           NEXT_PASS (pass_postreload_cse);
1016           NEXT_PASS (pass_gcse2);
1017           NEXT_PASS (pass_split_after_reload);
1018           NEXT_PASS (pass_implicit_zee);
1019           NEXT_PASS (pass_compare_elim_after_reload);
1020           NEXT_PASS (pass_branch_target_load_optimize1);
1021           NEXT_PASS (pass_thread_prologue_and_epilogue);
1022           NEXT_PASS (pass_rtl_dse2);
1023           NEXT_PASS (pass_stack_adjustments);
1024           NEXT_PASS (pass_peephole2);
1025           NEXT_PASS (pass_if_after_reload);
1026           NEXT_PASS (pass_regrename);
1027           NEXT_PASS (pass_cprop_hardreg);
1028           NEXT_PASS (pass_fast_rtl_dce);
1029           NEXT_PASS (pass_reorder_blocks);
1030           NEXT_PASS (pass_branch_target_load_optimize2);
1031           NEXT_PASS (pass_leaf_regs);
1032           NEXT_PASS (pass_split_before_sched2);
1033           NEXT_PASS (pass_sched2);
1034           NEXT_PASS (pass_stack_regs);
1035             {
1036               struct opt_pass **p = &pass_stack_regs.pass.sub;
1037               NEXT_PASS (pass_split_before_regstack);
1038               NEXT_PASS (pass_stack_regs_run);
1039             }
1040           NEXT_PASS (pass_compute_alignments);
1041           NEXT_PASS (pass_duplicate_computed_gotos);
1042           NEXT_PASS (pass_variable_tracking);
1043           NEXT_PASS (pass_free_cfg);
1044           NEXT_PASS (pass_machine_reorg);
1045           NEXT_PASS (pass_cleanup_barriers);
1046           NEXT_PASS (pass_delay_slots);
1047           NEXT_PASS (pass_split_for_shorten_branches);
1048           NEXT_PASS (pass_convert_to_eh_region_ranges);
1049           NEXT_PASS (pass_shorten_branches);
1050           NEXT_PASS (pass_set_nothrow_function_flags);
1051           NEXT_PASS (pass_final);
1052         }
1053       NEXT_PASS (pass_df_finish);
1054     }
1055   NEXT_PASS (pass_clean_state);
1056   *p = NULL;
1057
1058 #undef NEXT_PASS
1059
1060   /* Register the passes with the tree dump code.  */
1061   register_dump_files (all_lowering_passes, PROP_gimple_any);
1062   register_dump_files (all_small_ipa_passes,
1063                        PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
1064                        | PROP_cfg);
1065   register_dump_files (all_regular_ipa_passes,
1066                        PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
1067                        | PROP_cfg);
1068   register_dump_files (all_lto_gen_passes,
1069                        PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
1070                        | PROP_cfg);
1071   register_dump_files (all_passes,
1072                        PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
1073                        | PROP_cfg);
1074 }
1075
1076 /* If we are in IPA mode (i.e., current_function_decl is NULL), call
1077    function CALLBACK for every function in the call graph.  Otherwise,
1078    call CALLBACK on the current function.  */
1079
1080 static void
1081 do_per_function (void (*callback) (void *data), void *data)
1082 {
1083   if (current_function_decl)
1084     callback (data);
1085   else
1086     {
1087       struct cgraph_node *node;
1088       for (node = cgraph_nodes; node; node = node->next)
1089         if (node->analyzed && gimple_has_body_p (node->decl)
1090             && (!node->clone_of || node->decl != node->clone_of->decl))
1091           {
1092             push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1093             current_function_decl = node->decl;
1094             callback (data);
1095             if (!flag_wpa)
1096               {
1097                 free_dominance_info (CDI_DOMINATORS);
1098                 free_dominance_info (CDI_POST_DOMINATORS);
1099               }
1100             current_function_decl = NULL;
1101             pop_cfun ();
1102             ggc_collect ();
1103           }
1104     }
1105 }
1106
1107 /* Because inlining might remove no-longer reachable nodes, we need to
1108    keep the array visible to garbage collector to avoid reading collected
1109    out nodes.  */
1110 static int nnodes;
1111 static GTY ((length ("nnodes"))) cgraph_node_ptr *order;
1112
1113 /* If we are in IPA mode (i.e., current_function_decl is NULL), call
1114    function CALLBACK for every function in the call graph.  Otherwise,
1115    call CALLBACK on the current function.
1116    This function is global so that plugins can use it.  */
1117 void
1118 do_per_function_toporder (void (*callback) (void *data), void *data)
1119 {
1120   int i;
1121
1122   if (current_function_decl)
1123     callback (data);
1124   else
1125     {
1126       gcc_assert (!order);
1127       order = ggc_alloc_vec_cgraph_node_ptr (cgraph_n_nodes);
1128       nnodes = cgraph_postorder (order);
1129       for (i = nnodes - 1; i >= 0; i--)
1130         order[i]->process = 1;
1131       for (i = nnodes - 1; i >= 0; i--)
1132         {
1133           struct cgraph_node *node = order[i];
1134
1135           /* Allow possibly removed nodes to be garbage collected.  */
1136           order[i] = NULL;
1137           node->process = 0;
1138           if (node->analyzed)
1139             {
1140               push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1141               current_function_decl = node->decl;
1142               callback (data);
1143               free_dominance_info (CDI_DOMINATORS);
1144               free_dominance_info (CDI_POST_DOMINATORS);
1145               current_function_decl = NULL;
1146               pop_cfun ();
1147               ggc_collect ();
1148             }
1149         }
1150     }
1151   ggc_free (order);
1152   order = NULL;
1153   nnodes = 0;
1154 }
1155
1156 /* Perform all TODO actions that ought to be done on each function.  */
1157
1158 static void
1159 execute_function_todo (void *data)
1160 {
1161   unsigned int flags = (size_t)data;
1162   flags &= ~cfun->last_verified;
1163   if (!flags)
1164     return;
1165
1166   /* Always cleanup the CFG before trying to update SSA.  */
1167   if (flags & TODO_cleanup_cfg)
1168     {
1169       bool cleanup = cleanup_tree_cfg ();
1170
1171       if (cleanup && (cfun->curr_properties & PROP_ssa))
1172         flags |= TODO_remove_unused_locals;
1173
1174       /* When cleanup_tree_cfg merges consecutive blocks, it may
1175          perform some simplistic propagation when removing single
1176          valued PHI nodes.  This propagation may, in turn, cause the
1177          SSA form to become out-of-date (see PR 22037).  So, even
1178          if the parent pass had not scheduled an SSA update, we may
1179          still need to do one.  */
1180       if (!(flags & TODO_update_ssa_any) && need_ssa_update_p (cfun))
1181         flags |= TODO_update_ssa;
1182     }
1183
1184   if (flags & TODO_update_ssa_any)
1185     {
1186       unsigned update_flags = flags & TODO_update_ssa_any;
1187       update_ssa (update_flags);
1188       cfun->last_verified &= ~TODO_verify_ssa;
1189     }
1190
1191   if (flags & TODO_rebuild_alias)
1192     {
1193       execute_update_addresses_taken ();
1194       compute_may_aliases ();
1195     }
1196   else if (optimize && (flags & TODO_update_address_taken))
1197     execute_update_addresses_taken ();
1198
1199   if (flags & TODO_remove_unused_locals)
1200     remove_unused_locals ();
1201
1202   if ((flags & TODO_dump_func) && dump_file && current_function_decl)
1203     {
1204       if (cfun->curr_properties & PROP_trees)
1205         dump_function_to_file (current_function_decl, dump_file, dump_flags);
1206       else
1207         {
1208           if (dump_flags & TDF_SLIM)
1209             print_rtl_slim_with_bb (dump_file, get_insns (), dump_flags);
1210           else if ((cfun->curr_properties & PROP_cfg)
1211                    && (dump_flags & TDF_BLOCKS))
1212             print_rtl_with_bb (dump_file, get_insns ());
1213           else
1214             print_rtl (dump_file, get_insns ());
1215
1216           if ((cfun->curr_properties & PROP_cfg)
1217               && graph_dump_format != no_graph
1218               && (dump_flags & TDF_GRAPH))
1219             print_rtl_graph_with_bb (dump_file_name, get_insns ());
1220         }
1221
1222       /* Flush the file.  If verification fails, we won't be able to
1223          close the file before aborting.  */
1224       fflush (dump_file);
1225     }
1226
1227   if (flags & TODO_rebuild_frequencies)
1228     rebuild_frequencies ();
1229
1230   if (flags & TODO_rebuild_cgraph_edges)
1231     rebuild_cgraph_edges ();
1232
1233   /* If we've seen errors do not bother running any verifiers.  */
1234   if (seen_error ())
1235     return;
1236
1237 #if defined ENABLE_CHECKING
1238   if (flags & TODO_verify_ssa
1239       || (current_loops && loops_state_satisfies_p (LOOP_CLOSED_SSA)))
1240     verify_ssa (true);
1241   if (flags & TODO_verify_flow)
1242     verify_flow_info ();
1243   if (flags & TODO_verify_stmts)
1244     verify_stmts ();
1245   if (current_loops && loops_state_satisfies_p (LOOP_CLOSED_SSA))
1246     verify_loop_closed_ssa (false);
1247   if (flags & TODO_verify_rtl_sharing)
1248     verify_rtl_sharing ();
1249 #endif
1250
1251   cfun->last_verified = flags & TODO_verify_all;
1252 }
1253
1254 /* Perform all TODO actions.  */
1255 static void
1256 execute_todo (unsigned int flags)
1257 {
1258 #if defined ENABLE_CHECKING
1259   if (cfun
1260       && need_ssa_update_p (cfun))
1261     gcc_assert (flags & TODO_update_ssa_any);
1262 #endif
1263
1264   timevar_push (TV_TODO);
1265
1266   /* Inform the pass whether it is the first time it is run.  */
1267   first_pass_instance = (flags & TODO_mark_first_instance) != 0;
1268
1269   statistics_fini_pass ();
1270
1271   do_per_function (execute_function_todo, (void *)(size_t) flags);
1272
1273   /* Always remove functions just as before inlining: IPA passes might be
1274      interested to see bodies of extern inline functions that are not inlined
1275      to analyze side effects.  The full removal is done just at the end
1276      of IPA pass queue.  */
1277   if (flags & TODO_remove_functions)
1278     {
1279       gcc_assert (!cfun);
1280       cgraph_remove_unreachable_nodes (true, dump_file);
1281     }
1282
1283   if ((flags & TODO_dump_cgraph) && dump_file && !current_function_decl)
1284     {
1285       gcc_assert (!cfun);
1286       dump_cgraph (dump_file);
1287       /* Flush the file.  If verification fails, we won't be able to
1288          close the file before aborting.  */
1289       fflush (dump_file);
1290     }
1291
1292   if (flags & TODO_ggc_collect)
1293     ggc_collect ();
1294
1295   /* Now that the dumping has been done, we can get rid of the optional
1296      df problems.  */
1297   if (flags & TODO_df_finish)
1298     df_finish_pass ((flags & TODO_df_verify) != 0);
1299
1300   timevar_pop (TV_TODO);
1301 }
1302
1303 /* Verify invariants that should hold between passes.  This is a place
1304    to put simple sanity checks.  */
1305
1306 static void
1307 verify_interpass_invariants (void)
1308 {
1309   gcc_checking_assert (!fold_deferring_overflow_warnings_p ());
1310 }
1311
1312 /* Clear the last verified flag.  */
1313
1314 static void
1315 clear_last_verified (void *data ATTRIBUTE_UNUSED)
1316 {
1317   cfun->last_verified = 0;
1318 }
1319
1320 /* Helper function. Verify that the properties has been turn into the
1321    properties expected by the pass.  */
1322
1323 #ifdef ENABLE_CHECKING
1324 static void
1325 verify_curr_properties (void *data)
1326 {
1327   unsigned int props = (size_t)data;
1328   gcc_assert ((cfun->curr_properties & props) == props);
1329 }
1330 #endif
1331
1332 /* Initialize pass dump file.  */
1333 /* This is non-static so that the plugins can use it.  */
1334
1335 bool
1336 pass_init_dump_file (struct opt_pass *pass)
1337 {
1338   /* If a dump file name is present, open it if enabled.  */
1339   if (pass->static_pass_number != -1)
1340     {
1341       bool initializing_dump = !dump_initialized_p (pass->static_pass_number);
1342       dump_file_name = get_dump_file_name (pass->static_pass_number);
1343       dump_file = dump_begin (pass->static_pass_number, &dump_flags);
1344       if (dump_file && current_function_decl)
1345         {
1346           const char *dname, *aname;
1347           struct cgraph_node *node = cgraph_node (current_function_decl);
1348           dname = lang_hooks.decl_printable_name (current_function_decl, 2);
1349           aname = (IDENTIFIER_POINTER
1350                    (DECL_ASSEMBLER_NAME (current_function_decl)));
1351           fprintf (dump_file, "\n;; Function %s (%s)%s\n\n", dname, aname,
1352              node->frequency == NODE_FREQUENCY_HOT
1353              ? " (hot)"
1354              : node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED
1355              ? " (unlikely executed)"
1356              : node->frequency == NODE_FREQUENCY_EXECUTED_ONCE
1357              ? " (executed once)"
1358              : "");
1359         }
1360       return initializing_dump;
1361     }
1362   else
1363     return false;
1364 }
1365
1366 /* Flush PASS dump file.  */
1367 /* This is non-static so that plugins can use it.  */
1368
1369 void
1370 pass_fini_dump_file (struct opt_pass *pass)
1371 {
1372   /* Flush and close dump file.  */
1373   if (dump_file_name)
1374     {
1375       free (CONST_CAST (char *, dump_file_name));
1376       dump_file_name = NULL;
1377     }
1378
1379   if (dump_file)
1380     {
1381       dump_end (pass->static_pass_number, dump_file);
1382       dump_file = NULL;
1383     }
1384 }
1385
1386 /* After executing the pass, apply expected changes to the function
1387    properties. */
1388
1389 static void
1390 update_properties_after_pass (void *data)
1391 {
1392   struct opt_pass *pass = (struct opt_pass *) data;
1393   cfun->curr_properties = (cfun->curr_properties | pass->properties_provided)
1394                            & ~pass->properties_destroyed;
1395 }
1396
1397 /* Execute summary generation for all of the passes in IPA_PASS.  */
1398
1399 void
1400 execute_ipa_summary_passes (struct ipa_opt_pass_d *ipa_pass)
1401 {
1402   while (ipa_pass)
1403     {
1404       struct opt_pass *pass = &ipa_pass->pass;
1405
1406       /* Execute all of the IPA_PASSes in the list.  */
1407       if (ipa_pass->pass.type == IPA_PASS
1408           && (!pass->gate || pass->gate ())
1409           && ipa_pass->generate_summary)
1410         {
1411           pass_init_dump_file (pass);
1412
1413           /* If a timevar is present, start it.  */
1414           if (pass->tv_id)
1415             timevar_push (pass->tv_id);
1416
1417           ipa_pass->generate_summary ();
1418
1419           /* Stop timevar.  */
1420           if (pass->tv_id)
1421             timevar_pop (pass->tv_id);
1422
1423           pass_fini_dump_file (pass);
1424         }
1425       ipa_pass = (struct ipa_opt_pass_d *)ipa_pass->pass.next;
1426     }
1427 }
1428
1429 /* Execute IPA_PASS function transform on NODE.  */
1430
1431 static void
1432 execute_one_ipa_transform_pass (struct cgraph_node *node,
1433                                 struct ipa_opt_pass_d *ipa_pass)
1434 {
1435   struct opt_pass *pass = &ipa_pass->pass;
1436   unsigned int todo_after = 0;
1437
1438   current_pass = pass;
1439   if (!ipa_pass->function_transform)
1440     return;
1441
1442   /* Note that the folders should only create gimple expressions.
1443      This is a hack until the new folder is ready.  */
1444   in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
1445
1446   pass_init_dump_file (pass);
1447
1448   /* Run pre-pass verification.  */
1449   execute_todo (ipa_pass->function_transform_todo_flags_start);
1450
1451   /* If a timevar is present, start it.  */
1452   if (pass->tv_id != TV_NONE)
1453     timevar_push (pass->tv_id);
1454
1455   /* Do it!  */
1456   todo_after = ipa_pass->function_transform (node);
1457
1458   /* Stop timevar.  */
1459   if (pass->tv_id != TV_NONE)
1460     timevar_pop (pass->tv_id);
1461
1462   /* Run post-pass cleanup and verification.  */
1463   execute_todo (todo_after);
1464   verify_interpass_invariants ();
1465
1466   pass_fini_dump_file (pass);
1467
1468   current_pass = NULL;
1469 }
1470
1471 /* For the current function, execute all ipa transforms. */
1472
1473 void
1474 execute_all_ipa_transforms (void)
1475 {
1476   struct cgraph_node *node;
1477   if (!cfun)
1478     return;
1479   node = cgraph_node (current_function_decl);
1480
1481   if (node->ipa_transforms_to_apply)
1482     {
1483       unsigned int i;
1484
1485       for (i = 0; i < VEC_length (ipa_opt_pass, node->ipa_transforms_to_apply);
1486            i++)
1487         execute_one_ipa_transform_pass (node,
1488                                         VEC_index (ipa_opt_pass,
1489                                                    node->ipa_transforms_to_apply,
1490                                                    i));
1491       VEC_free (ipa_opt_pass, heap, node->ipa_transforms_to_apply);
1492       node->ipa_transforms_to_apply = NULL;
1493     }
1494 }
1495
1496 /* Execute PASS. */
1497
1498 bool
1499 execute_one_pass (struct opt_pass *pass)
1500 {
1501   bool initializing_dump;
1502   unsigned int todo_after = 0;
1503
1504   bool gate_status;
1505
1506   /* IPA passes are executed on whole program, so cfun should be NULL.
1507      Other passes need function context set.  */
1508   if (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS)
1509     gcc_assert (!cfun && !current_function_decl);
1510   else
1511     gcc_assert (cfun && current_function_decl);
1512
1513   current_pass = pass;
1514
1515   /* Check whether gate check should be avoided.
1516      User controls the value of the gate through the parameter "gate_status". */
1517   gate_status = (pass->gate == NULL) ? true : pass->gate();
1518
1519   /* Override gate with plugin.  */
1520   invoke_plugin_callbacks (PLUGIN_OVERRIDE_GATE, &gate_status);
1521
1522   if (!gate_status)
1523     {
1524       current_pass = NULL;
1525       return false;
1526     }
1527
1528   /* Pass execution event trigger: useful to identify passes being
1529      executed.  */
1530   invoke_plugin_callbacks (PLUGIN_PASS_EXECUTION, pass);
1531
1532   if (!quiet_flag && !cfun)
1533     fprintf (stderr, " <%s>", pass->name ? pass->name : "");
1534
1535   /* Note that the folders should only create gimple expressions.
1536      This is a hack until the new folder is ready.  */
1537   in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
1538
1539   initializing_dump = pass_init_dump_file (pass);
1540
1541   /* Run pre-pass verification.  */
1542   execute_todo (pass->todo_flags_start);
1543
1544 #ifdef ENABLE_CHECKING
1545   do_per_function (verify_curr_properties,
1546                    (void *)(size_t)pass->properties_required);
1547 #endif
1548
1549   /* If a timevar is present, start it.  */
1550   if (pass->tv_id != TV_NONE)
1551     timevar_push (pass->tv_id);
1552
1553   /* Do it!  */
1554   if (pass->execute)
1555     {
1556       todo_after = pass->execute ();
1557       do_per_function (clear_last_verified, NULL);
1558     }
1559
1560   /* Stop timevar.  */
1561   if (pass->tv_id != TV_NONE)
1562     timevar_pop (pass->tv_id);
1563
1564   do_per_function (update_properties_after_pass, pass);
1565
1566   if (initializing_dump
1567       && dump_file
1568       && graph_dump_format != no_graph
1569       && cfun
1570       && (cfun->curr_properties & (PROP_cfg | PROP_rtl))
1571           == (PROP_cfg | PROP_rtl))
1572     {
1573       get_dump_file_info (pass->static_pass_number)->flags |= TDF_GRAPH;
1574       dump_flags |= TDF_GRAPH;
1575       clean_graph_dump_file (dump_file_name);
1576     }
1577
1578   /* Run post-pass cleanup and verification.  */
1579   execute_todo (todo_after | pass->todo_flags_finish);
1580   verify_interpass_invariants ();
1581   if (pass->type == IPA_PASS)
1582     {
1583       struct cgraph_node *node;
1584       for (node = cgraph_nodes; node; node = node->next)
1585         if (node->analyzed)
1586           VEC_safe_push (ipa_opt_pass, heap, node->ipa_transforms_to_apply,
1587                          (struct ipa_opt_pass_d *)pass);
1588     }
1589
1590   if (!current_function_decl)
1591     cgraph_process_new_functions ();
1592
1593   pass_fini_dump_file (pass);
1594
1595   if (pass->type != SIMPLE_IPA_PASS && pass->type != IPA_PASS)
1596     gcc_assert (!(cfun->curr_properties & PROP_trees)
1597                 || pass->type != RTL_PASS);
1598
1599   current_pass = NULL;
1600
1601   return true;
1602 }
1603
1604 void
1605 execute_pass_list (struct opt_pass *pass)
1606 {
1607   do
1608     {
1609       gcc_assert (pass->type == GIMPLE_PASS
1610                   || pass->type == RTL_PASS);
1611       if (execute_one_pass (pass) && pass->sub)
1612         execute_pass_list (pass->sub);
1613       pass = pass->next;
1614     }
1615   while (pass);
1616 }
1617
1618 /* Same as execute_pass_list but assume that subpasses of IPA passes
1619    are local passes. If SET is not NULL, write out summaries of only
1620    those node in SET. */
1621
1622 static void
1623 ipa_write_summaries_2 (struct opt_pass *pass, cgraph_node_set set,
1624                        varpool_node_set vset,
1625                        struct lto_out_decl_state *state)
1626 {
1627   while (pass)
1628     {
1629       struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *)pass;
1630       gcc_assert (!current_function_decl);
1631       gcc_assert (!cfun);
1632       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
1633       if (pass->type == IPA_PASS
1634           && ipa_pass->write_summary
1635           && (!pass->gate || pass->gate ()))
1636         {
1637           /* If a timevar is present, start it.  */
1638           if (pass->tv_id)
1639             timevar_push (pass->tv_id);
1640
1641           pass_init_dump_file (pass);
1642
1643           ipa_pass->write_summary (set,vset);
1644
1645           pass_fini_dump_file (pass);
1646
1647           /* If a timevar is present, start it.  */
1648           if (pass->tv_id)
1649             timevar_pop (pass->tv_id);
1650         }
1651
1652       if (pass->sub && pass->sub->type != GIMPLE_PASS)
1653         ipa_write_summaries_2 (pass->sub, set, vset, state);
1654
1655       pass = pass->next;
1656     }
1657 }
1658
1659 /* Helper function of ipa_write_summaries. Creates and destroys the
1660    decl state and calls ipa_write_summaries_2 for all passes that have
1661    summaries.  SET is the set of nodes to be written.  */
1662
1663 static void
1664 ipa_write_summaries_1 (cgraph_node_set set, varpool_node_set vset)
1665 {
1666   struct lto_out_decl_state *state = lto_new_out_decl_state ();
1667   compute_ltrans_boundary (state, set, vset);
1668
1669   lto_push_out_decl_state (state);
1670
1671   gcc_assert (!flag_wpa);
1672   ipa_write_summaries_2 (all_regular_ipa_passes, set, vset, state);
1673   ipa_write_summaries_2 (all_lto_gen_passes, set, vset, state);
1674
1675   gcc_assert (lto_get_out_decl_state () == state);
1676   lto_pop_out_decl_state ();
1677   lto_delete_out_decl_state (state);
1678 }
1679
1680 /* Write out summaries for all the nodes in the callgraph.  */
1681
1682 void
1683 ipa_write_summaries (void)
1684 {
1685   cgraph_node_set set;
1686   varpool_node_set vset;
1687   struct cgraph_node **order;
1688   struct varpool_node *vnode;
1689   int i, order_pos;
1690
1691   if (!flag_generate_lto || seen_error ())
1692     return;
1693
1694   set = cgraph_node_set_new ();
1695
1696   /* Create the callgraph set in the same order used in
1697      cgraph_expand_all_functions.  This mostly facilitates debugging,
1698      since it causes the gimple file to be processed in the same order
1699      as the source code.  */
1700   order = XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
1701   order_pos = cgraph_postorder (order);
1702   gcc_assert (order_pos == cgraph_n_nodes);
1703
1704   for (i = order_pos - 1; i >= 0; i--)
1705     {
1706       struct cgraph_node *node = order[i];
1707
1708       if (node->analyzed)
1709         {
1710           /* When streaming out references to statements as part of some IPA
1711              pass summary, the statements need to have uids assigned and the
1712              following does that for all the IPA passes here. Naturally, this
1713              ordering then matches the one IPA-passes get in their stmt_fixup
1714              hooks.  */
1715
1716           push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1717           renumber_gimple_stmt_uids ();
1718           pop_cfun ();
1719         }
1720       if (node->analyzed)
1721         cgraph_node_set_add (set, node);
1722     }
1723   vset = varpool_node_set_new ();
1724
1725   for (vnode = varpool_nodes; vnode; vnode = vnode->next)
1726     if (vnode->needed && !vnode->alias)
1727       varpool_node_set_add (vset, vnode);
1728
1729   ipa_write_summaries_1 (set, vset);
1730
1731   free (order);
1732   ggc_free (set);
1733   ggc_free (vset);
1734 }
1735
1736 /* Same as execute_pass_list but assume that subpasses of IPA passes
1737    are local passes. If SET is not NULL, write out optimization summaries of
1738    only those node in SET. */
1739
1740 static void
1741 ipa_write_optimization_summaries_1 (struct opt_pass *pass, cgraph_node_set set,
1742                        varpool_node_set vset,
1743                        struct lto_out_decl_state *state)
1744 {
1745   while (pass)
1746     {
1747       struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *)pass;
1748       gcc_assert (!current_function_decl);
1749       gcc_assert (!cfun);
1750       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
1751       if (pass->type == IPA_PASS
1752           && ipa_pass->write_optimization_summary
1753           && (!pass->gate || pass->gate ()))
1754         {
1755           /* If a timevar is present, start it.  */
1756           if (pass->tv_id)
1757             timevar_push (pass->tv_id);
1758
1759           pass_init_dump_file (pass);
1760
1761           ipa_pass->write_optimization_summary (set, vset);
1762
1763           pass_fini_dump_file (pass);
1764
1765           /* If a timevar is present, start it.  */
1766           if (pass->tv_id)
1767             timevar_pop (pass->tv_id);
1768         }
1769
1770       if (pass->sub && pass->sub->type != GIMPLE_PASS)
1771         ipa_write_optimization_summaries_1 (pass->sub, set, vset, state);
1772
1773       pass = pass->next;
1774     }
1775 }
1776
1777 /* Write all the optimization summaries for the cgraph nodes in SET.  If SET is
1778    NULL, write out all summaries of all nodes. */
1779
1780 void
1781 ipa_write_optimization_summaries (cgraph_node_set set, varpool_node_set vset)
1782 {
1783   struct lto_out_decl_state *state = lto_new_out_decl_state ();
1784   cgraph_node_set_iterator csi;
1785   compute_ltrans_boundary (state, set, vset);
1786
1787   lto_push_out_decl_state (state);
1788   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
1789     {
1790       struct cgraph_node *node = csi_node (csi);
1791       /* When streaming out references to statements as part of some IPA
1792          pass summary, the statements need to have uids assigned.
1793
1794          For functions newly born at WPA stage we need to initialize
1795          the uids here.  */
1796       if (node->analyzed
1797           && gimple_has_body_p (node->decl))
1798         {
1799           push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1800           renumber_gimple_stmt_uids ();
1801           pop_cfun ();
1802         }
1803     }
1804
1805   gcc_assert (flag_wpa);
1806   ipa_write_optimization_summaries_1 (all_regular_ipa_passes, set, vset, state);
1807   ipa_write_optimization_summaries_1 (all_lto_gen_passes, set, vset, state);
1808
1809   gcc_assert (lto_get_out_decl_state () == state);
1810   lto_pop_out_decl_state ();
1811   lto_delete_out_decl_state (state);
1812 }
1813
1814 /* Same as execute_pass_list but assume that subpasses of IPA passes
1815    are local passes.  */
1816
1817 static void
1818 ipa_read_summaries_1 (struct opt_pass *pass)
1819 {
1820   while (pass)
1821     {
1822       struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *) pass;
1823
1824       gcc_assert (!current_function_decl);
1825       gcc_assert (!cfun);
1826       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
1827
1828       if (pass->gate == NULL || pass->gate ())
1829         {
1830           if (pass->type == IPA_PASS && ipa_pass->read_summary)
1831             {
1832               /* If a timevar is present, start it.  */
1833               if (pass->tv_id)
1834                 timevar_push (pass->tv_id);
1835
1836               pass_init_dump_file (pass);
1837
1838               ipa_pass->read_summary ();
1839
1840               pass_fini_dump_file (pass);
1841
1842               /* Stop timevar.  */
1843               if (pass->tv_id)
1844                 timevar_pop (pass->tv_id);
1845             }
1846
1847           if (pass->sub && pass->sub->type != GIMPLE_PASS)
1848             ipa_read_summaries_1 (pass->sub);
1849         }
1850       pass = pass->next;
1851     }
1852 }
1853
1854
1855 /* Read all the summaries for all_regular_ipa_passes and all_lto_gen_passes.  */
1856
1857 void
1858 ipa_read_summaries (void)
1859 {
1860   ipa_read_summaries_1 (all_regular_ipa_passes);
1861   ipa_read_summaries_1 (all_lto_gen_passes);
1862 }
1863
1864 /* Same as execute_pass_list but assume that subpasses of IPA passes
1865    are local passes.  */
1866
1867 static void
1868 ipa_read_optimization_summaries_1 (struct opt_pass *pass)
1869 {
1870   while (pass)
1871     {
1872       struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *) pass;
1873
1874       gcc_assert (!current_function_decl);
1875       gcc_assert (!cfun);
1876       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
1877
1878       if (pass->gate == NULL || pass->gate ())
1879         {
1880           if (pass->type == IPA_PASS && ipa_pass->read_optimization_summary)
1881             {
1882               /* If a timevar is present, start it.  */
1883               if (pass->tv_id)
1884                 timevar_push (pass->tv_id);
1885
1886               pass_init_dump_file (pass);
1887
1888               ipa_pass->read_optimization_summary ();
1889
1890               pass_fini_dump_file (pass);
1891
1892               /* Stop timevar.  */
1893               if (pass->tv_id)
1894                 timevar_pop (pass->tv_id);
1895             }
1896
1897           if (pass->sub && pass->sub->type != GIMPLE_PASS)
1898             ipa_read_optimization_summaries_1 (pass->sub);
1899         }
1900       pass = pass->next;
1901     }
1902 }
1903
1904 /* Read all the summaries for all_regular_ipa_passes and all_lto_gen_passes.  */
1905
1906 void
1907 ipa_read_optimization_summaries (void)
1908 {
1909   ipa_read_optimization_summaries_1 (all_regular_ipa_passes);
1910   ipa_read_optimization_summaries_1 (all_lto_gen_passes);
1911 }
1912
1913 /* Same as execute_pass_list but assume that subpasses of IPA passes
1914    are local passes.  */
1915 void
1916 execute_ipa_pass_list (struct opt_pass *pass)
1917 {
1918   do
1919     {
1920       gcc_assert (!current_function_decl);
1921       gcc_assert (!cfun);
1922       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
1923       if (execute_one_pass (pass) && pass->sub)
1924         {
1925           if (pass->sub->type == GIMPLE_PASS)
1926             {
1927               invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_START, NULL);
1928               do_per_function_toporder ((void (*)(void *))execute_pass_list,
1929                                         pass->sub);
1930               invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_END, NULL);
1931             }
1932           else if (pass->sub->type == SIMPLE_IPA_PASS
1933                    || pass->sub->type == IPA_PASS)
1934             execute_ipa_pass_list (pass->sub);
1935           else
1936             gcc_unreachable ();
1937         }
1938       gcc_assert (!current_function_decl);
1939       cgraph_process_new_functions ();
1940       pass = pass->next;
1941     }
1942   while (pass);
1943 }
1944
1945 /* Execute stmt fixup hooks of all passes in PASS for NODE and STMTS.  */
1946
1947 static void
1948 execute_ipa_stmt_fixups (struct opt_pass *pass,
1949                           struct cgraph_node *node, gimple *stmts)
1950 {
1951   while (pass)
1952     {
1953       /* Execute all of the IPA_PASSes in the list.  */
1954       if (pass->type == IPA_PASS
1955           && (!pass->gate || pass->gate ()))
1956         {
1957           struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *) pass;
1958
1959           if (ipa_pass->stmt_fixup)
1960             {
1961               pass_init_dump_file (pass);
1962               /* If a timevar is present, start it.  */
1963               if (pass->tv_id)
1964                 timevar_push (pass->tv_id);
1965
1966               ipa_pass->stmt_fixup (node, stmts);
1967
1968               /* Stop timevar.  */
1969               if (pass->tv_id)
1970                 timevar_pop (pass->tv_id);
1971               pass_fini_dump_file (pass);
1972             }
1973           if (pass->sub)
1974             execute_ipa_stmt_fixups (pass->sub, node, stmts);
1975         }
1976       pass = pass->next;
1977     }
1978 }
1979
1980 /* Execute stmt fixup hooks of all IPA passes for NODE and STMTS.  */
1981
1982 void
1983 execute_all_ipa_stmt_fixups (struct cgraph_node *node, gimple *stmts)
1984 {
1985   execute_ipa_stmt_fixups (all_regular_ipa_passes, node, stmts);
1986 }
1987
1988
1989 extern void debug_properties (unsigned int);
1990 extern void dump_properties (FILE *, unsigned int);
1991
1992 DEBUG_FUNCTION void
1993 dump_properties (FILE *dump, unsigned int props)
1994 {
1995   fprintf (dump, "Properties:\n");
1996   if (props & PROP_gimple_any)
1997     fprintf (dump, "PROP_gimple_any\n");
1998   if (props & PROP_gimple_lcf)
1999     fprintf (dump, "PROP_gimple_lcf\n");
2000   if (props & PROP_gimple_leh)
2001     fprintf (dump, "PROP_gimple_leh\n");
2002   if (props & PROP_cfg)
2003     fprintf (dump, "PROP_cfg\n");
2004   if (props & PROP_referenced_vars)
2005     fprintf (dump, "PROP_referenced_vars\n");
2006   if (props & PROP_ssa)
2007     fprintf (dump, "PROP_ssa\n");
2008   if (props & PROP_no_crit_edges)
2009     fprintf (dump, "PROP_no_crit_edges\n");
2010   if (props & PROP_rtl)
2011     fprintf (dump, "PROP_rtl\n");
2012   if (props & PROP_gimple_lomp)
2013     fprintf (dump, "PROP_gimple_lomp\n");
2014   if (props & PROP_gimple_lcx)
2015     fprintf (dump, "PROP_gimple_lcx\n");
2016   if (props & PROP_cfglayout)
2017     fprintf (dump, "PROP_cfglayout\n");
2018 }
2019
2020 DEBUG_FUNCTION void
2021 debug_properties (unsigned int props)
2022 {
2023   dump_properties (stderr, props);
2024 }
2025
2026 /* Called by local passes to see if function is called by already processed nodes.
2027    Because we process nodes in topological order, this means that function is
2028    in recursive cycle or we introduced new direct calls.  */
2029 bool
2030 function_called_by_processed_nodes_p (void)
2031 {
2032   struct cgraph_edge *e;
2033   for (e = cgraph_node (current_function_decl)->callers; e; e = e->next_caller)
2034     {
2035       if (e->caller->decl == current_function_decl)
2036         continue;
2037       if (!e->caller->analyzed)
2038         continue;
2039       if (TREE_ASM_WRITTEN (e->caller->decl))
2040         continue;
2041       if (!e->caller->process && !e->caller->global.inlined_to)
2042         break;
2043     }
2044   if (dump_file && e)
2045     {
2046       fprintf (dump_file, "Already processed call to:\n");
2047       dump_cgraph_node (dump_file, e->caller);
2048     }
2049   return e != NULL;
2050 }
2051
2052 #include "gt-passes.h"