OSDN Git Service

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