OSDN Git Service

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