OSDN Git Service

2011-12-06 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / passes.c
1 /* Top level of GCC compilers (cc1, cc1plus, etc.)
2    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
3    1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
4    2011  Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /* This is the top level of cc1/c++.
23    It parses command args, opens files, invokes the various passes
24    in the proper order, and counts the time used by each.
25    Error messages and low-level interface to malloc also handled here.  */
26
27 #include "config.h"
28 #include "system.h"
29 #include "coretypes.h"
30 #include "tm.h"
31 #include "line-map.h"
32 #include "input.h"
33 #include "tree.h"
34 #include "rtl.h"
35 #include "tm_p.h"
36 #include "flags.h"
37 #include "insn-attr.h"
38 #include "insn-config.h"
39 #include "insn-flags.h"
40 #include "hard-reg-set.h"
41 #include "recog.h"
42 #include "output.h"
43 #include "except.h"
44 #include "function.h"
45 #include "toplev.h"
46 #include "expr.h"
47 #include "basic-block.h"
48 #include "intl.h"
49 #include "ggc.h"
50 #include "graph.h"
51 #include "regs.h"
52 #include "timevar.h"
53 #include "diagnostic-core.h"
54 #include "params.h"
55 #include "reload.h"
56 #include "dwarf2asm.h"
57 #include "integrate.h"
58 #include "debug.h"
59 #include "target.h"
60 #include "langhooks.h"
61 #include "cfglayout.h"
62 #include "cfgloop.h"
63 #include "hosthooks.h"
64 #include "cgraph.h"
65 #include "opts.h"
66 #include "coverage.h"
67 #include "value-prof.h"
68 #include "tree-inline.h"
69 #include "tree-flow.h"
70 #include "tree-pass.h"
71 #include "tree-dump.h"
72 #include "df.h"
73 #include "predict.h"
74 #include "lto-streamer.h"
75 #include "plugin.h"
76 #include "ipa-utils.h"
77 #include "tree-pretty-print.h"
78
79 #if defined (DWARF2_UNWIND_INFO) || defined (DWARF2_DEBUGGING_INFO)
80 #include "dwarf2out.h"
81 #endif
82
83 #if defined (DBX_DEBUGGING_INFO) || defined (XCOFF_DEBUGGING_INFO)
84 #include "dbxout.h"
85 #endif
86
87 #ifdef SDB_DEBUGGING_INFO
88 #include "sdbout.h"
89 #endif
90
91 #ifdef XCOFF_DEBUGGING_INFO
92 #include "xcoffout.h"           /* Needed for external data
93                                    declarations for e.g. AIX 4.x.  */
94 #endif
95
96 /* This is used for debugging.  It allows the current pass to printed
97    from anywhere in compilation.
98    The variable current_pass is also used for statistics and plugins.  */
99 struct opt_pass *current_pass;
100
101 static void register_pass_name (struct opt_pass *, const char *);
102
103 /* Call from anywhere to find out what pass this is.  Useful for
104    printing out debugging information deep inside an service
105    routine.  */
106 void
107 print_current_pass (FILE *file)
108 {
109   if (current_pass)
110     fprintf (file, "current pass = %s (%d)\n",
111              current_pass->name, current_pass->static_pass_number);
112   else
113     fprintf (file, "no current pass.\n");
114 }
115
116
117 /* Call from the debugger to get the current pass name.  */
118 DEBUG_FUNCTION void
119 debug_pass (void)
120 {
121   print_current_pass (stderr);
122 }
123
124
125
126 /* Global variables used to communicate with passes.  */
127 int dump_flags;
128 bool in_gimple_form;
129 bool first_pass_instance;
130
131
132 /* This is called from various places for FUNCTION_DECL, VAR_DECL,
133    and TYPE_DECL nodes.
134
135    This does nothing for local (non-static) variables, unless the
136    variable is a register variable with DECL_ASSEMBLER_NAME set.  In
137    that case, or if the variable is not an automatic, it sets up the
138    RTL and outputs any assembler code (label definition, storage
139    allocation and initialization).
140
141    DECL is the declaration.  TOP_LEVEL is nonzero
142    if this declaration is not within a function.  */
143
144 void
145 rest_of_decl_compilation (tree decl,
146                           int top_level,
147                           int at_end)
148 {
149   /* We deferred calling assemble_alias so that we could collect
150      other attributes such as visibility.  Emit the alias now.  */
151   if (!in_lto_p)
152   {
153     tree alias;
154     alias = lookup_attribute ("alias", DECL_ATTRIBUTES (decl));
155     if (alias)
156       {
157         alias = TREE_VALUE (TREE_VALUE (alias));
158         alias = get_identifier (TREE_STRING_POINTER (alias));
159         /* A quirk of the initial implementation of aliases required that the
160            user add "extern" to all of them.  Which is silly, but now
161            historical.  Do note that the symbol is in fact locally defined.  */
162         if (!lookup_attribute ("weakref", DECL_ATTRIBUTES (decl)))
163           DECL_EXTERNAL (decl) = 0;
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            && TREE_STATIC (decl))
224     varpool_node (decl);
225 }
226
227 /* Called after finishing a record, union or enumeral type.  */
228
229 void
230 rest_of_type_compilation (tree type, int toplev)
231 {
232   /* Avoid confusing the debug information machinery when there are
233      errors.  */
234   if (seen_error ())
235     return;
236
237   timevar_push (TV_SYMOUT);
238   debug_hooks->type_decl (TYPE_STUB_DECL (type), !toplev);
239   timevar_pop (TV_SYMOUT);
240 }
241
242 \f
243
244 void
245 finish_optimization_passes (void)
246 {
247   int i;
248   struct dump_file_info *dfi;
249   char *name;
250
251   timevar_push (TV_DUMP);
252   if (profile_arc_flag || flag_test_coverage || flag_branch_probabilities)
253     {
254       dump_file = dump_begin (pass_profile.pass.static_pass_number, NULL);
255       end_branch_prob ();
256       if (dump_file)
257         dump_end (pass_profile.pass.static_pass_number, dump_file);
258     }
259
260   if (optimize > 0)
261     {
262       dump_file = dump_begin (pass_combine.pass.static_pass_number, NULL);
263       if (dump_file)
264         {
265           dump_combine_total_stats (dump_file);
266           dump_end (pass_combine.pass.static_pass_number, dump_file);
267         }
268     }
269
270   /* Do whatever is necessary to finish printing the graphs.  */
271   if (graph_dump_format != no_graph)
272     for (i = TDI_end; (dfi = get_dump_file_info (i)) != NULL; ++i)
273       if (dump_initialized_p (i)
274           && (dfi->flags & TDF_GRAPH) != 0
275           && (name = get_dump_file_name (i)) != NULL)
276         {
277           finish_graph_dump_file (name);
278           free (name);
279         }
280
281   timevar_pop (TV_DUMP);
282 }
283
284 static bool
285 gate_rest_of_compilation (void)
286 {
287   /* Early return if there were errors.  We can run afoul of our
288      consistency checks, and there's not really much point in fixing them.  */
289   return !(rtl_dump_and_exit || flag_syntax_only || seen_error ());
290 }
291
292 struct gimple_opt_pass pass_rest_of_compilation =
293 {
294  {
295   GIMPLE_PASS,
296   "*rest_of_compilation",               /* name */
297   gate_rest_of_compilation,             /* gate */
298   NULL,                                 /* execute */
299   NULL,                                 /* sub */
300   NULL,                                 /* next */
301   0,                                    /* static_pass_number */
302   TV_REST_OF_COMPILATION,               /* tv_id */
303   PROP_rtl,                             /* properties_required */
304   0,                                    /* properties_provided */
305   0,                                    /* properties_destroyed */
306   0,                                    /* todo_flags_start */
307   TODO_ggc_collect                      /* todo_flags_finish */
308  }
309 };
310
311 static bool
312 gate_postreload (void)
313 {
314   return reload_completed;
315 }
316
317 struct rtl_opt_pass pass_postreload =
318 {
319  {
320   RTL_PASS,
321   "*all-postreload",                        /* name */
322   gate_postreload,                      /* gate */
323   NULL,                                 /* execute */
324   NULL,                                 /* sub */
325   NULL,                                 /* next */
326   0,                                    /* static_pass_number */
327   TV_POSTRELOAD,                        /* tv_id */
328   PROP_rtl,                             /* properties_required */
329   0,                                    /* properties_provided */
330   0,                                    /* properties_destroyed */
331   0,                                    /* todo_flags_start */
332   TODO_ggc_collect | TODO_verify_rtl_sharing /* todo_flags_finish */
333  }
334 };
335
336
337
338 /* The root of the compilation pass tree, once constructed.  */
339 struct opt_pass *all_passes, *all_small_ipa_passes, *all_lowering_passes,
340   *all_regular_ipa_passes, *all_late_ipa_passes, *all_lto_gen_passes;
341
342 /* This is used by plugins, and should also be used in register_pass.  */
343 #define DEF_PASS_LIST(LIST) &LIST,
344 struct opt_pass **gcc_pass_lists[] = { GCC_PASS_LISTS NULL };
345 #undef DEF_PASS_LIST
346
347 /* A map from static pass id to optimization pass.  */
348 struct opt_pass **passes_by_id;
349 int passes_by_id_size;
350
351 /* Set the static pass number of pass PASS to ID and record that
352    in the mapping from static pass number to pass.  */
353
354 static void
355 set_pass_for_id (int id, struct opt_pass *pass)
356 {
357   pass->static_pass_number = id;
358   if (passes_by_id_size <= id)
359     {
360       passes_by_id = XRESIZEVEC (struct opt_pass *, passes_by_id, id + 1);
361       memset (passes_by_id + passes_by_id_size, 0,
362               (id + 1 - passes_by_id_size) * sizeof (void *));
363       passes_by_id_size = id + 1;
364     }
365   passes_by_id[id] = pass;
366 }
367
368 /* Return the pass with the static pass number ID.  */
369
370 struct opt_pass *
371 get_pass_for_id (int id)
372 {
373   if (id >= passes_by_id_size)
374     return NULL;
375   return passes_by_id[id];
376 }
377
378 /* Iterate over the pass tree allocating dump file numbers.  We want
379    to do this depth first, and independent of whether the pass is
380    enabled or not.  */
381
382 void
383 register_one_dump_file (struct opt_pass *pass)
384 {
385   char *dot_name, *flag_name, *glob_name;
386   const char *name, *full_name, *prefix;
387   char num[10];
388   int flags, id;
389
390   /* See below in next_pass_1.  */
391   num[0] = '\0';
392   if (pass->static_pass_number != -1)
393     sprintf (num, "%d", ((int) pass->static_pass_number < 0
394                          ? 1 : pass->static_pass_number));
395
396   /* The name is both used to identify the pass for the purposes of plugins,
397      and to specify dump file name and option.
398      The latter two might want something short which is not quite unique; for
399      that reason, we may have a disambiguating prefix, followed by a space
400      to mark the start of the following dump file name / option string.  */
401   name = strchr (pass->name, ' ');
402   name = name ? name + 1 : pass->name;
403   dot_name = concat (".", name, num, NULL);
404   if (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS)
405     prefix = "ipa-", flags = TDF_IPA;
406   else if (pass->type == GIMPLE_PASS)
407     prefix = "tree-", flags = TDF_TREE;
408   else
409     prefix = "rtl-", flags = TDF_RTL;
410
411   flag_name = concat (prefix, name, num, NULL);
412   glob_name = concat (prefix, name, NULL);
413   id = dump_register (dot_name, flag_name, glob_name, flags);
414   set_pass_for_id (id, pass);
415   full_name = concat (prefix, pass->name, num, NULL);
416   register_pass_name (pass, full_name);
417 }
418
419 /* Recursive worker function for register_dump_files.  */
420
421 static int
422 register_dump_files_1 (struct opt_pass *pass, int properties)
423 {
424   do
425     {
426       int new_properties = (properties | pass->properties_provided)
427                            & ~pass->properties_destroyed;
428
429       if (pass->name && pass->name[0] != '*')
430         register_one_dump_file (pass);
431
432       if (pass->sub)
433         new_properties = register_dump_files_1 (pass->sub, new_properties);
434
435       /* If we have a gate, combine the properties that we could have with
436          and without the pass being examined.  */
437       if (pass->gate)
438         properties &= new_properties;
439       else
440         properties = new_properties;
441
442       pass = pass->next;
443     }
444   while (pass);
445
446   return properties;
447 }
448
449 /* Register the dump files for the pipeline starting at PASS.
450    PROPERTIES reflects the properties that are guaranteed to be available at
451    the beginning of the pipeline.  */
452
453 static void
454 register_dump_files (struct opt_pass *pass,int properties)
455 {
456   pass->properties_required |= properties;
457   register_dump_files_1 (pass, properties);
458 }
459
460 struct pass_registry
461 {
462   const char* unique_name;
463   struct opt_pass *pass;
464 };
465
466 /* Pass registry hash function.  */
467
468 static hashval_t
469 passr_hash (const void *p)
470 {
471   const struct pass_registry *const s = (const struct pass_registry *const) p;
472   return htab_hash_string (s->unique_name);
473 }
474
475 /* Hash equal function  */
476
477 static int
478 passr_eq (const void *p1, const void *p2)
479 {
480   const struct pass_registry *const s1 = (const struct pass_registry *const) p1;
481   const struct pass_registry *const s2 = (const struct pass_registry *const) p2;
482
483   return !strcmp (s1->unique_name, s2->unique_name);
484 }
485
486 static htab_t name_to_pass_map = NULL;
487
488 /* Register PASS with NAME.  */
489
490 static void
491 register_pass_name (struct opt_pass *pass, const char *name)
492 {
493   struct pass_registry **slot;
494   struct pass_registry pr;
495
496   if (!name_to_pass_map)
497     name_to_pass_map = htab_create (256, passr_hash, passr_eq, NULL);
498
499   pr.unique_name = name;
500   slot = (struct pass_registry **) htab_find_slot (name_to_pass_map, &pr, INSERT);
501   if (!*slot)
502     {
503       struct pass_registry *new_pr;
504
505       new_pr = XCNEW (struct pass_registry);
506       new_pr->unique_name = xstrdup (name);
507       new_pr->pass = pass;
508       *slot = new_pr;
509     }
510   else
511     return; /* Ignore plugin passes.  */
512 }
513
514 /* Map from pass id to canonicalized pass name.  */
515
516 typedef const char *char_ptr;
517 DEF_VEC_P(char_ptr);
518 DEF_VEC_ALLOC_P(char_ptr, heap);
519 static VEC(char_ptr, heap) *pass_tab = NULL;
520
521 /* Callback function for traversing NAME_TO_PASS_MAP.  */
522
523 static int
524 pass_traverse (void **slot, void *data ATTRIBUTE_UNUSED)
525 {
526   struct pass_registry **p = (struct pass_registry **)slot;
527   struct opt_pass *pass = (*p)->pass;
528
529   gcc_assert (pass->static_pass_number > 0);
530   gcc_assert (pass_tab);
531
532   VEC_replace (char_ptr, pass_tab, pass->static_pass_number,
533                (*p)->unique_name);
534
535   return 1;
536 }
537
538 /* The function traverses NAME_TO_PASS_MAP and creates a pass info
539    table for dumping purpose.  */
540
541 static void
542 create_pass_tab (void)
543 {
544   if (!flag_dump_passes)
545     return;
546
547   VEC_safe_grow_cleared (char_ptr, heap,
548                          pass_tab, passes_by_id_size + 1);
549   htab_traverse (name_to_pass_map, pass_traverse, NULL);
550 }
551
552 static bool override_gate_status (struct opt_pass *, tree, bool);
553
554 /* Dump the instantiated name for PASS. IS_ON indicates if PASS
555    is turned on or not.  */
556
557 static void
558 dump_one_pass (struct opt_pass *pass, int pass_indent)
559 {
560   int indent = 3 * pass_indent;
561   const char *pn;
562   bool is_on, is_really_on;
563
564   is_on = (pass->gate == NULL) ? true : pass->gate();
565   is_really_on = override_gate_status (pass, current_function_decl, is_on);
566
567   if (pass->static_pass_number <= 0)
568     pn = pass->name;
569   else
570     pn = VEC_index (char_ptr, pass_tab, pass->static_pass_number);
571
572   fprintf (stderr, "%*s%-40s%*s:%s%s\n", indent, " ", pn,
573            (15 - indent < 0 ? 0 : 15 - indent), " ",
574            is_on ? "  ON" : "  OFF",
575            ((!is_on) == (!is_really_on) ? ""
576             : (is_really_on ? " (FORCED_ON)" : " (FORCED_OFF)")));
577 }
578
579 /* Dump pass list PASS with indentation INDENT.  */
580
581 static void
582 dump_pass_list (struct opt_pass *pass, int indent)
583 {
584   do
585     {
586       dump_one_pass (pass, indent);
587       if (pass->sub)
588         dump_pass_list (pass->sub, indent + 1);
589       pass = pass->next;
590     }
591   while (pass);
592 }
593
594 /* Dump all optimization passes.  */
595
596 void
597 dump_passes (void)
598 {
599   struct cgraph_node *n, *node = NULL;
600   tree save_fndecl = current_function_decl;
601
602   create_pass_tab();
603
604   n = cgraph_nodes;
605   while (n)
606     {
607       if (DECL_STRUCT_FUNCTION (n->decl))
608         {
609           node = n;
610           break;
611         }
612       n = n->next;
613     }
614
615   if (!node)
616     return;
617
618   push_cfun (DECL_STRUCT_FUNCTION (node->decl));
619   current_function_decl = node->decl;
620
621   dump_pass_list (all_lowering_passes, 1);
622   dump_pass_list (all_small_ipa_passes, 1);
623   dump_pass_list (all_regular_ipa_passes, 1);
624   dump_pass_list (all_lto_gen_passes, 1);
625   dump_pass_list (all_late_ipa_passes, 1);
626   dump_pass_list (all_passes, 1);
627
628   pop_cfun ();
629   current_function_decl = save_fndecl;
630 }
631
632
633 /* Returns the pass with NAME.  */
634
635 static struct opt_pass *
636 get_pass_by_name (const char *name)
637 {
638   struct pass_registry **slot, pr;
639
640   pr.unique_name = name;
641   slot = (struct pass_registry **) htab_find_slot (name_to_pass_map,
642                                                    &pr, NO_INSERT);
643
644   if (!slot || !*slot)
645     return NULL;
646
647   return (*slot)->pass;
648 }
649
650
651 /* Range [start, last].  */
652
653 struct uid_range
654 {
655   unsigned int start;
656   unsigned int last;
657   const char *assem_name;
658   struct uid_range *next;
659 };
660
661 typedef struct uid_range *uid_range_p;
662
663 DEF_VEC_P(uid_range_p);
664 DEF_VEC_ALLOC_P(uid_range_p, heap);
665
666 static VEC(uid_range_p, heap) *enabled_pass_uid_range_tab = NULL;
667 static VEC(uid_range_p, heap) *disabled_pass_uid_range_tab = NULL;
668
669
670 /* Parse option string for -fdisable- and -fenable-
671    The syntax of the options:
672
673    -fenable-<pass_name>
674    -fdisable-<pass_name>
675
676    -fenable-<pass_name>=s1:e1,s2:e2,...
677    -fdisable-<pass_name>=s1:e1,s2:e2,...
678 */
679
680 static void
681 enable_disable_pass (const char *arg, bool is_enable)
682 {
683   struct opt_pass *pass;
684   char *range_str, *phase_name;
685   char *argstr = xstrdup (arg);
686   VEC(uid_range_p, heap) **tab = 0;
687
688   range_str = strchr (argstr,'=');
689   if (range_str)
690     {
691       *range_str = '\0';
692       range_str++;
693     }
694
695   phase_name = argstr;
696   if (!*phase_name)
697     {
698       if (is_enable)
699         error ("unrecognized option -fenable");
700       else
701         error ("unrecognized option -fdisable");
702       free (argstr);
703       return;
704     }
705   pass = get_pass_by_name (phase_name);
706   if (!pass || pass->static_pass_number == -1)
707     {
708       if (is_enable)
709         error ("unknown pass %s specified in -fenable", phase_name);
710       else
711         error ("unknown pass %s specified in -fdisble", phase_name);
712       free (argstr);
713       return;
714     }
715
716   if (is_enable)
717     tab = &enabled_pass_uid_range_tab;
718   else
719     tab = &disabled_pass_uid_range_tab;
720
721   if ((unsigned) pass->static_pass_number >= VEC_length (uid_range_p, *tab))
722     VEC_safe_grow_cleared (uid_range_p, heap,
723                            *tab, pass->static_pass_number + 1);
724
725   if (!range_str)
726     {
727       uid_range_p slot;
728       uid_range_p new_range = XCNEW (struct uid_range);
729
730       new_range->start = 0;
731       new_range->last = (unsigned)-1;
732
733       slot = VEC_index (uid_range_p, *tab, pass->static_pass_number);
734       new_range->next = slot;
735       VEC_replace (uid_range_p, *tab, pass->static_pass_number,
736                    new_range);
737       if (is_enable)
738         inform (UNKNOWN_LOCATION, "enable pass %s for functions in the range "
739                 "of [%u, %u]", phase_name, new_range->start, new_range->last);
740       else
741         inform (UNKNOWN_LOCATION, "disable pass %s for functions in the range "
742                 "of [%u, %u]", phase_name, new_range->start, new_range->last);
743     }
744   else
745     {
746       char *next_range = NULL;
747       char *one_range = range_str;
748       char *end_val = NULL;
749
750       do
751         {
752           uid_range_p slot;
753           uid_range_p new_range;
754           char *invalid = NULL;
755           long start;
756           char *func_name = NULL;
757
758           next_range = strchr (one_range, ',');
759           if (next_range)
760             {
761               *next_range = '\0';
762               next_range++;
763             }
764
765           end_val = strchr (one_range, ':');
766           if (end_val)
767             {
768               *end_val = '\0';
769               end_val++;
770             }
771           start = strtol (one_range, &invalid, 10);
772           if (*invalid || start < 0)
773             {
774               if (end_val || (one_range[0] >= '0'
775                               && one_range[0] <= '9'))
776                 {
777                   error ("Invalid range %s in option %s",
778                          one_range,
779                          is_enable ? "-fenable" : "-fdisable");
780                   free (argstr);
781                   return;
782                 }
783               func_name = one_range;
784             }
785           if (!end_val)
786             {
787               new_range = XCNEW (struct uid_range);
788               if (!func_name)
789                 {
790                   new_range->start = (unsigned) start;
791                   new_range->last = (unsigned) start;
792                 }
793               else
794                 {
795                   new_range->start = (unsigned) -1;
796                   new_range->last = (unsigned) -1;
797                   new_range->assem_name = xstrdup (func_name);
798                 }
799             }
800           else
801             {
802               long last = strtol (end_val, &invalid, 10);
803               if (*invalid || last < start)
804                 {
805                   error ("Invalid range %s in option %s",
806                          end_val,
807                          is_enable ? "-fenable" : "-fdisable");
808                   free (argstr);
809                   return;
810                 }
811               new_range = XCNEW (struct uid_range);
812               new_range->start = (unsigned) start;
813               new_range->last = (unsigned) last;
814             }
815
816           slot = VEC_index (uid_range_p, *tab, pass->static_pass_number);
817           new_range->next = slot;
818           VEC_replace (uid_range_p, *tab, pass->static_pass_number,
819                        new_range);
820           if (is_enable)
821             {
822               if (new_range->assem_name)
823                 inform (UNKNOWN_LOCATION,
824                         "enable pass %s for function %s",
825                         phase_name, new_range->assem_name);
826               else
827                 inform (UNKNOWN_LOCATION,
828                         "enable pass %s for functions in the range of [%u, %u]",
829                         phase_name, new_range->start, new_range->last);
830             }
831           else
832             {
833               if (new_range->assem_name)
834                 inform (UNKNOWN_LOCATION,
835                         "disable pass %s for function %s",
836                         phase_name, new_range->assem_name);
837               else
838                 inform (UNKNOWN_LOCATION,
839                         "disable pass %s for functions in the range of [%u, %u]",
840                         phase_name, new_range->start, new_range->last);
841             }
842
843           one_range = next_range;
844         } while (next_range);
845     }
846
847   free (argstr);
848 }
849
850 /* Enable pass specified by ARG.  */
851
852 void
853 enable_pass (const char *arg)
854 {
855   enable_disable_pass (arg, true);
856 }
857
858 /* Disable pass specified by ARG.  */
859
860 void
861 disable_pass (const char *arg)
862 {
863   enable_disable_pass (arg, false);
864 }
865
866 /* Returns true if PASS is explicitly enabled/disabled for FUNC.  */
867
868 static bool
869 is_pass_explicitly_enabled_or_disabled (struct opt_pass *pass,
870                                         tree func,
871                                         VEC(uid_range_p, heap) *tab)
872 {
873   uid_range_p slot, range;
874   int cgraph_uid;
875   const char *aname = NULL;
876
877   if (!tab
878       || (unsigned) pass->static_pass_number >= VEC_length (uid_range_p, tab)
879       || pass->static_pass_number == -1)
880     return false;
881
882   slot = VEC_index (uid_range_p, tab, pass->static_pass_number);
883   if (!slot)
884     return false;
885
886   cgraph_uid = func ? cgraph_get_node (func)->uid : 0;
887   if (func && DECL_ASSEMBLER_NAME_SET_P (func))
888     aname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (func));
889
890   range = slot;
891   while (range)
892     {
893       if ((unsigned) cgraph_uid >= range->start
894           && (unsigned) cgraph_uid <= range->last)
895         return true;
896       if (range->assem_name && aname
897           && !strcmp (range->assem_name, aname))
898         return true;
899       range = range->next;
900     }
901
902   return false;
903 }
904
905 /* Look at the static_pass_number and duplicate the pass
906    if it is already added to a list. */
907
908 static struct opt_pass *
909 make_pass_instance (struct opt_pass *pass, bool track_duplicates)
910 {
911   /* A nonzero static_pass_number indicates that the
912      pass is already in the list.  */
913   if (pass->static_pass_number)
914     {
915       struct opt_pass *new_pass;
916
917       if (pass->type == GIMPLE_PASS
918           || pass->type == RTL_PASS
919           || pass->type == SIMPLE_IPA_PASS)
920         {
921           new_pass = XNEW (struct opt_pass);
922           memcpy (new_pass, pass, sizeof (struct opt_pass));
923         }
924       else if (pass->type == IPA_PASS)
925         {
926           new_pass = (struct opt_pass *)XNEW (struct ipa_opt_pass_d);
927           memcpy (new_pass, pass, sizeof (struct ipa_opt_pass_d));
928         }
929       else
930         gcc_unreachable ();
931
932       new_pass->next = NULL;
933
934       new_pass->todo_flags_start &= ~TODO_mark_first_instance;
935
936       /* Indicate to register_dump_files that this pass has duplicates,
937          and so it should rename the dump file.  The first instance will
938          be -1, and be number of duplicates = -static_pass_number - 1.
939          Subsequent instances will be > 0 and just the duplicate number.  */
940       if ((pass->name && pass->name[0] != '*') || track_duplicates)
941         {
942           pass->static_pass_number -= 1;
943           new_pass->static_pass_number = -pass->static_pass_number;
944         }
945       return new_pass;
946     }
947   else
948     {
949       pass->todo_flags_start |= TODO_mark_first_instance;
950       pass->static_pass_number = -1;
951
952       invoke_plugin_callbacks (PLUGIN_NEW_PASS, pass);
953     }
954   return pass;
955 }
956
957 /* Add a pass to the pass list. Duplicate the pass if it's already
958    in the list.  */
959
960 static struct opt_pass **
961 next_pass_1 (struct opt_pass **list, struct opt_pass *pass)
962 {
963   /* Every pass should have a name so that plugins can refer to them.  */
964   gcc_assert (pass->name != NULL);
965
966   *list = make_pass_instance (pass, false);
967
968   return &(*list)->next;
969 }
970
971 /* List node for an inserted pass instance. We need to keep track of all
972    the newly-added pass instances (with 'added_pass_nodes' defined below)
973    so that we can register their dump files after pass-positioning is finished.
974    Registering dumping files needs to be post-processed or the
975    static_pass_number of the opt_pass object would be modified and mess up
976    the dump file names of future pass instances to be added.  */
977
978 struct pass_list_node
979 {
980   struct opt_pass *pass;
981   struct pass_list_node *next;
982 };
983
984 static struct pass_list_node *added_pass_nodes = NULL;
985 static struct pass_list_node *prev_added_pass_node;
986
987 /* Insert the pass at the proper position. Return true if the pass
988    is successfully added.
989
990    NEW_PASS_INFO - new pass to be inserted
991    PASS_LIST - root of the pass list to insert the new pass to  */
992
993 static bool
994 position_pass (struct register_pass_info *new_pass_info,
995                struct opt_pass **pass_list)
996 {
997   struct opt_pass *pass = *pass_list, *prev_pass = NULL;
998   bool success = false;
999
1000   for ( ; pass; prev_pass = pass, pass = pass->next)
1001     {
1002       /* Check if the current pass is of the same type as the new pass and
1003          matches the name and the instance number of the reference pass.  */
1004       if (pass->type == new_pass_info->pass->type
1005           && pass->name
1006           && !strcmp (pass->name, new_pass_info->reference_pass_name)
1007           && ((new_pass_info->ref_pass_instance_number == 0)
1008               || (new_pass_info->ref_pass_instance_number ==
1009                   pass->static_pass_number)
1010               || (new_pass_info->ref_pass_instance_number == 1
1011                   && pass->todo_flags_start & TODO_mark_first_instance)))
1012         {
1013           struct opt_pass *new_pass;
1014           struct pass_list_node *new_pass_node;
1015
1016           new_pass = make_pass_instance (new_pass_info->pass, true);
1017
1018           /* Insert the new pass instance based on the positioning op.  */
1019           switch (new_pass_info->pos_op)
1020             {
1021               case PASS_POS_INSERT_AFTER:
1022                 new_pass->next = pass->next;
1023                 pass->next = new_pass;
1024
1025                 /* Skip newly inserted pass to avoid repeated
1026                    insertions in the case where the new pass and the
1027                    existing one have the same name.  */
1028                 pass = new_pass;
1029                 break;
1030               case PASS_POS_INSERT_BEFORE:
1031                 new_pass->next = pass;
1032                 if (prev_pass)
1033                   prev_pass->next = new_pass;
1034                 else
1035                   *pass_list = new_pass;
1036                 break;
1037               case PASS_POS_REPLACE:
1038                 new_pass->next = pass->next;
1039                 if (prev_pass)
1040                   prev_pass->next = new_pass;
1041                 else
1042                   *pass_list = new_pass;
1043                 new_pass->sub = pass->sub;
1044                 new_pass->tv_id = pass->tv_id;
1045                 pass = new_pass;
1046                 break;
1047               default:
1048                 error ("invalid pass positioning operation");
1049                 return false;
1050             }
1051
1052           /* Save the newly added pass (instance) in the added_pass_nodes
1053              list so that we can register its dump file later. Note that
1054              we cannot register the dump file now because doing so will modify
1055              the static_pass_number of the opt_pass object and therefore
1056              mess up the dump file name of future instances.  */
1057           new_pass_node = XCNEW (struct pass_list_node);
1058           new_pass_node->pass = new_pass;
1059           if (!added_pass_nodes)
1060             added_pass_nodes = new_pass_node;
1061           else
1062             prev_added_pass_node->next = new_pass_node;
1063           prev_added_pass_node = new_pass_node;
1064
1065           success = true;
1066         }
1067
1068       if (pass->sub && position_pass (new_pass_info, &pass->sub))
1069         success = true;
1070     }
1071
1072   return success;
1073 }
1074
1075 /* Hooks a new pass into the pass lists.
1076
1077    PASS_INFO   - pass information that specifies the opt_pass object,
1078                  reference pass, instance number, and how to position
1079                  the pass  */
1080
1081 void
1082 register_pass (struct register_pass_info *pass_info)
1083 {
1084   bool all_instances, success;
1085
1086   /* The checks below could fail in buggy plugins.  Existing GCC
1087      passes should never fail these checks, so we mention plugin in
1088      the messages.  */
1089   if (!pass_info->pass)
1090       fatal_error ("plugin cannot register a missing pass");
1091
1092   if (!pass_info->pass->name)
1093       fatal_error ("plugin cannot register an unnamed pass");
1094
1095   if (!pass_info->reference_pass_name)
1096       fatal_error
1097         ("plugin cannot register pass %qs without reference pass name",
1098          pass_info->pass->name);
1099
1100   /* Try to insert the new pass to the pass lists.  We need to check
1101      all five lists as the reference pass could be in one (or all) of
1102      them.  */
1103   all_instances = pass_info->ref_pass_instance_number == 0;
1104   success = position_pass (pass_info, &all_lowering_passes);
1105   if (!success || all_instances)
1106     success |= position_pass (pass_info, &all_small_ipa_passes);
1107   if (!success || all_instances)
1108     success |= position_pass (pass_info, &all_regular_ipa_passes);
1109   if (!success || all_instances)
1110     success |= position_pass (pass_info, &all_lto_gen_passes);
1111   if (!success || all_instances)
1112     success |= position_pass (pass_info, &all_late_ipa_passes);
1113   if (!success || all_instances)
1114     success |= position_pass (pass_info, &all_passes);
1115   if (!success)
1116     fatal_error
1117       ("pass %qs not found but is referenced by new pass %qs",
1118        pass_info->reference_pass_name, pass_info->pass->name);
1119
1120   /* OK, we have successfully inserted the new pass. We need to register
1121      the dump files for the newly added pass and its duplicates (if any).
1122      Because the registration of plugin/backend passes happens after the
1123      command-line options are parsed, the options that specify single
1124      pass dumping (e.g. -fdump-tree-PASSNAME) cannot be used for new
1125      passes. Therefore we currently can only enable dumping of
1126      new passes when the 'dump-all' flags (e.g. -fdump-tree-all)
1127      are specified. While doing so, we also delete the pass_list_node
1128      objects created during pass positioning.  */
1129   while (added_pass_nodes)
1130     {
1131       struct pass_list_node *next_node = added_pass_nodes->next;
1132       enum tree_dump_index tdi;
1133       register_one_dump_file (added_pass_nodes->pass);
1134       if (added_pass_nodes->pass->type == SIMPLE_IPA_PASS
1135           || added_pass_nodes->pass->type == IPA_PASS)
1136         tdi = TDI_ipa_all;
1137       else if (added_pass_nodes->pass->type == GIMPLE_PASS)
1138         tdi = TDI_tree_all;
1139       else
1140         tdi = TDI_rtl_all;
1141       /* Check if dump-all flag is specified.  */
1142       if (get_dump_file_info (tdi)->state)
1143         get_dump_file_info (added_pass_nodes->pass->static_pass_number)
1144             ->state = get_dump_file_info (tdi)->state;
1145       XDELETE (added_pass_nodes);
1146       added_pass_nodes = next_node;
1147     }
1148 }
1149
1150 /* Construct the pass tree.  The sequencing of passes is driven by
1151    the cgraph routines:
1152
1153    cgraph_finalize_compilation_unit ()
1154        for each node N in the cgraph
1155            cgraph_analyze_function (N)
1156                cgraph_lower_function (N) -> all_lowering_passes
1157
1158    If we are optimizing, cgraph_optimize is then invoked:
1159
1160    cgraph_optimize ()
1161        ipa_passes ()                    -> all_small_ipa_passes
1162        cgraph_expand_all_functions ()
1163            for each node N in the cgraph
1164                cgraph_expand_function (N)
1165                   tree_rest_of_compilation (DECL (N))  -> all_passes
1166 */
1167
1168 void
1169 init_optimization_passes (void)
1170 {
1171   struct opt_pass **p;
1172
1173 #define NEXT_PASS(PASS)  (p = next_pass_1 (p, &((PASS).pass)))
1174
1175  /* All passes needed to lower the function into shape optimizers can
1176     operate on.  These passes are always run first on the function, but
1177     backend might produce already lowered functions that are not processed
1178     by these passes.  */
1179   p = &all_lowering_passes;
1180   NEXT_PASS (pass_warn_unused_result);
1181   NEXT_PASS (pass_diagnose_omp_blocks);
1182   NEXT_PASS (pass_diagnose_tm_blocks);
1183   NEXT_PASS (pass_mudflap_1);
1184   NEXT_PASS (pass_lower_omp);
1185   NEXT_PASS (pass_lower_cf);
1186   NEXT_PASS (pass_lower_tm);
1187   NEXT_PASS (pass_refactor_eh);
1188   NEXT_PASS (pass_lower_eh);
1189   NEXT_PASS (pass_build_cfg);
1190   NEXT_PASS (pass_warn_function_return);
1191   NEXT_PASS (pass_build_cgraph_edges);
1192   *p = NULL;
1193
1194   /* Interprocedural optimization passes.  */
1195   p = &all_small_ipa_passes;
1196   NEXT_PASS (pass_ipa_free_lang_data);
1197   NEXT_PASS (pass_ipa_function_and_variable_visibility);
1198   NEXT_PASS (pass_early_local_passes);
1199     {
1200       struct opt_pass **p = &pass_early_local_passes.pass.sub;
1201       NEXT_PASS (pass_fixup_cfg);
1202       NEXT_PASS (pass_init_datastructures);
1203       NEXT_PASS (pass_expand_omp);
1204
1205       NEXT_PASS (pass_referenced_vars);
1206       NEXT_PASS (pass_build_ssa);
1207       NEXT_PASS (pass_lower_vector);
1208       NEXT_PASS (pass_early_warn_uninitialized);
1209       NEXT_PASS (pass_rebuild_cgraph_edges);
1210       NEXT_PASS (pass_inline_parameters);
1211       NEXT_PASS (pass_early_inline);
1212       NEXT_PASS (pass_all_early_optimizations);
1213         {
1214           struct opt_pass **p = &pass_all_early_optimizations.pass.sub;
1215           NEXT_PASS (pass_remove_cgraph_callee_edges);
1216           NEXT_PASS (pass_rename_ssa_copies);
1217           NEXT_PASS (pass_ccp);
1218           NEXT_PASS (pass_forwprop);
1219           /* pass_build_ealias is a dummy pass that ensures that we
1220              execute TODO_rebuild_alias at this point.  Re-building
1221              alias information also rewrites no longer addressed
1222              locals into SSA form if possible.  */
1223           NEXT_PASS (pass_build_ealias);
1224           NEXT_PASS (pass_sra_early);
1225           NEXT_PASS (pass_fre);
1226           NEXT_PASS (pass_copy_prop);
1227           NEXT_PASS (pass_merge_phi);
1228           NEXT_PASS (pass_cd_dce);
1229           NEXT_PASS (pass_early_ipa_sra);
1230           NEXT_PASS (pass_tail_recursion);
1231           NEXT_PASS (pass_convert_switch);
1232           NEXT_PASS (pass_cleanup_eh);
1233           NEXT_PASS (pass_profile);
1234           NEXT_PASS (pass_local_pure_const);
1235           /* Split functions creates parts that are not run through
1236              early optimizations again.  It is thus good idea to do this
1237              late.  */
1238           NEXT_PASS (pass_split_functions);
1239         }
1240       NEXT_PASS (pass_release_ssa_names);
1241       NEXT_PASS (pass_rebuild_cgraph_edges);
1242       NEXT_PASS (pass_inline_parameters);
1243     }
1244   NEXT_PASS (pass_ipa_tree_profile);
1245     {
1246       struct opt_pass **p = &pass_ipa_tree_profile.pass.sub;
1247       NEXT_PASS (pass_feedback_split_functions);
1248     }
1249   NEXT_PASS (pass_ipa_increase_alignment);
1250   NEXT_PASS (pass_ipa_matrix_reorg);
1251   NEXT_PASS (pass_ipa_tm);
1252   NEXT_PASS (pass_ipa_lower_emutls);
1253   *p = NULL;
1254
1255   p = &all_regular_ipa_passes;
1256   NEXT_PASS (pass_ipa_whole_program_visibility);
1257   NEXT_PASS (pass_ipa_profile);
1258   NEXT_PASS (pass_ipa_cp);
1259   NEXT_PASS (pass_ipa_cdtor_merge);
1260   NEXT_PASS (pass_ipa_inline);
1261   NEXT_PASS (pass_ipa_pure_const);
1262   NEXT_PASS (pass_ipa_reference);
1263   *p = NULL;
1264
1265   p = &all_lto_gen_passes;
1266   NEXT_PASS (pass_ipa_lto_gimple_out);
1267   NEXT_PASS (pass_ipa_lto_finish_out);  /* This must be the last LTO pass.  */
1268   *p = NULL;
1269
1270   /* Simple IPA passes executed after the regular passes.  In WHOPR mode the
1271      passes are executed after partitioning and thus see just parts of the
1272      compiled unit.  */
1273   p = &all_late_ipa_passes;
1274   NEXT_PASS (pass_ipa_pta);
1275   *p = NULL;
1276   /* These passes are run after IPA passes on every function that is being
1277      output to the assembler file.  */
1278   p = &all_passes;
1279   NEXT_PASS (pass_fixup_cfg);
1280   NEXT_PASS (pass_lower_eh_dispatch);
1281   NEXT_PASS (pass_all_optimizations);
1282     {
1283       struct opt_pass **p = &pass_all_optimizations.pass.sub;
1284       NEXT_PASS (pass_remove_cgraph_callee_edges);
1285       /* Initial scalar cleanups before alias computation.
1286          They ensure memory accesses are not indirect wherever possible.  */
1287       NEXT_PASS (pass_strip_predict_hints);
1288       NEXT_PASS (pass_rename_ssa_copies);
1289       NEXT_PASS (pass_complete_unrolli);
1290       NEXT_PASS (pass_ccp);
1291       NEXT_PASS (pass_forwprop);
1292       NEXT_PASS (pass_call_cdce);
1293       /* pass_build_alias is a dummy pass that ensures that we
1294          execute TODO_rebuild_alias at this point.  Re-building
1295          alias information also rewrites no longer addressed
1296          locals into SSA form if possible.  */
1297       NEXT_PASS (pass_build_alias);
1298       NEXT_PASS (pass_return_slot);
1299       NEXT_PASS (pass_phiprop);
1300       NEXT_PASS (pass_fre);
1301       NEXT_PASS (pass_copy_prop);
1302       NEXT_PASS (pass_merge_phi);
1303       NEXT_PASS (pass_vrp);
1304       NEXT_PASS (pass_dce);
1305       NEXT_PASS (pass_cselim);
1306       NEXT_PASS (pass_tree_ifcombine);
1307       NEXT_PASS (pass_phiopt);
1308       NEXT_PASS (pass_tail_recursion);
1309       NEXT_PASS (pass_ch);
1310       NEXT_PASS (pass_stdarg);
1311       NEXT_PASS (pass_lower_complex);
1312       NEXT_PASS (pass_sra);
1313       NEXT_PASS (pass_rename_ssa_copies);
1314       /* The dom pass will also resolve all __builtin_constant_p calls
1315          that are still there to 0.  This has to be done after some
1316          propagations have already run, but before some more dead code
1317          is removed, and this place fits nicely.  Remember this when
1318          trying to move or duplicate pass_dominator somewhere earlier.  */
1319       NEXT_PASS (pass_dominator);
1320       /* The only const/copy propagation opportunities left after
1321          DOM should be due to degenerate PHI nodes.  So rather than
1322          run the full propagators, run a specialized pass which
1323          only examines PHIs to discover const/copy propagation
1324          opportunities.  */
1325       NEXT_PASS (pass_phi_only_cprop);
1326       NEXT_PASS (pass_dse);
1327       NEXT_PASS (pass_reassoc);
1328       NEXT_PASS (pass_dce);
1329       NEXT_PASS (pass_forwprop);
1330       NEXT_PASS (pass_phiopt);
1331       NEXT_PASS (pass_object_sizes);
1332       NEXT_PASS (pass_strlen);
1333       NEXT_PASS (pass_ccp);
1334       NEXT_PASS (pass_copy_prop);
1335       NEXT_PASS (pass_cse_sincos);
1336       NEXT_PASS (pass_optimize_bswap);
1337       NEXT_PASS (pass_split_crit_edges);
1338       NEXT_PASS (pass_pre);
1339       NEXT_PASS (pass_sink_code);
1340       NEXT_PASS (pass_tree_loop);
1341         {
1342           struct opt_pass **p = &pass_tree_loop.pass.sub;
1343           NEXT_PASS (pass_tree_loop_init);
1344           NEXT_PASS (pass_lim);
1345           NEXT_PASS (pass_copy_prop);
1346           NEXT_PASS (pass_dce_loop);
1347           NEXT_PASS (pass_tree_unswitch);
1348           NEXT_PASS (pass_scev_cprop);
1349           NEXT_PASS (pass_record_bounds);
1350           NEXT_PASS (pass_check_data_deps);
1351           NEXT_PASS (pass_loop_distribution);
1352           NEXT_PASS (pass_copy_prop);
1353           NEXT_PASS (pass_graphite);
1354             {
1355               struct opt_pass **p = &pass_graphite.pass.sub;
1356               NEXT_PASS (pass_graphite_transforms);
1357               NEXT_PASS (pass_lim);
1358               NEXT_PASS (pass_copy_prop);
1359               NEXT_PASS (pass_dce_loop);
1360             }
1361           NEXT_PASS (pass_iv_canon);
1362           NEXT_PASS (pass_if_conversion);
1363           NEXT_PASS (pass_vectorize);
1364             {
1365               struct opt_pass **p = &pass_vectorize.pass.sub;
1366               NEXT_PASS (pass_dce_loop);
1367             }
1368           NEXT_PASS (pass_predcom);
1369           NEXT_PASS (pass_complete_unroll);
1370           NEXT_PASS (pass_slp_vectorize);
1371           NEXT_PASS (pass_parallelize_loops);
1372           NEXT_PASS (pass_loop_prefetch);
1373           NEXT_PASS (pass_iv_optimize);
1374           NEXT_PASS (pass_lim);
1375           NEXT_PASS (pass_tree_loop_done);
1376         }
1377       NEXT_PASS (pass_lower_vector_ssa);
1378       NEXT_PASS (pass_cse_reciprocals);
1379       NEXT_PASS (pass_reassoc);
1380       NEXT_PASS (pass_vrp);
1381       NEXT_PASS (pass_dominator);
1382       /* The only const/copy propagation opportunities left after
1383          DOM should be due to degenerate PHI nodes.  So rather than
1384          run the full propagators, run a specialized pass which
1385          only examines PHIs to discover const/copy propagation
1386          opportunities.  */
1387       NEXT_PASS (pass_phi_only_cprop);
1388       NEXT_PASS (pass_cd_dce);
1389       NEXT_PASS (pass_tracer);
1390
1391       /* FIXME: If DCE is not run before checking for uninitialized uses,
1392          we may get false warnings (e.g., testsuite/gcc.dg/uninit-5.c).
1393          However, this also causes us to misdiagnose cases that should be
1394          real warnings (e.g., testsuite/gcc.dg/pr18501.c).
1395
1396          To fix the false positives in uninit-5.c, we would have to
1397          account for the predicates protecting the set and the use of each
1398          variable.  Using a representation like Gated Single Assignment
1399          may help.  */
1400       NEXT_PASS (pass_late_warn_uninitialized);
1401       NEXT_PASS (pass_dse);
1402       NEXT_PASS (pass_forwprop);
1403       NEXT_PASS (pass_phiopt);
1404       NEXT_PASS (pass_fold_builtins);
1405       NEXT_PASS (pass_optimize_widening_mul);
1406       NEXT_PASS (pass_tail_calls);
1407       NEXT_PASS (pass_rename_ssa_copies);
1408       NEXT_PASS (pass_uncprop);
1409       NEXT_PASS (pass_local_pure_const);
1410     }
1411   NEXT_PASS (pass_tm_init);
1412     {
1413       struct opt_pass **p = &pass_tm_init.pass.sub;
1414       NEXT_PASS (pass_tm_mark);
1415       NEXT_PASS (pass_tm_memopt);
1416       NEXT_PASS (pass_tm_edges);
1417     }
1418   NEXT_PASS (pass_lower_complex_O0);
1419   NEXT_PASS (pass_cleanup_eh);
1420   NEXT_PASS (pass_lower_resx);
1421   NEXT_PASS (pass_nrv);
1422   NEXT_PASS (pass_mudflap_2);
1423   NEXT_PASS (pass_cleanup_cfg_post_optimizing);
1424   NEXT_PASS (pass_warn_function_noreturn);
1425
1426   NEXT_PASS (pass_expand);
1427
1428   NEXT_PASS (pass_rest_of_compilation);
1429     {
1430       struct opt_pass **p = &pass_rest_of_compilation.pass.sub;
1431       NEXT_PASS (pass_init_function);
1432       NEXT_PASS (pass_jump);
1433       NEXT_PASS (pass_rtl_eh);
1434       NEXT_PASS (pass_initial_value_sets);
1435       NEXT_PASS (pass_unshare_all_rtl);
1436       NEXT_PASS (pass_instantiate_virtual_regs);
1437       NEXT_PASS (pass_into_cfg_layout_mode);
1438       NEXT_PASS (pass_jump2);
1439       NEXT_PASS (pass_lower_subreg);
1440       NEXT_PASS (pass_df_initialize_opt);
1441       NEXT_PASS (pass_cse);
1442       NEXT_PASS (pass_rtl_fwprop);
1443       NEXT_PASS (pass_rtl_cprop);
1444       NEXT_PASS (pass_rtl_pre);
1445       NEXT_PASS (pass_rtl_hoist);
1446       NEXT_PASS (pass_rtl_cprop);
1447       NEXT_PASS (pass_rtl_store_motion);
1448       NEXT_PASS (pass_cse_after_global_opts);
1449       NEXT_PASS (pass_rtl_ifcvt);
1450       NEXT_PASS (pass_reginfo_init);
1451       /* Perform loop optimizations.  It might be better to do them a bit
1452          sooner, but we want the profile feedback to work more
1453          efficiently.  */
1454       NEXT_PASS (pass_loop2);
1455         {
1456           struct opt_pass **p = &pass_loop2.pass.sub;
1457           NEXT_PASS (pass_rtl_loop_init);
1458           NEXT_PASS (pass_rtl_move_loop_invariants);
1459           NEXT_PASS (pass_rtl_unswitch);
1460           NEXT_PASS (pass_rtl_unroll_and_peel_loops);
1461           NEXT_PASS (pass_rtl_doloop);
1462           NEXT_PASS (pass_rtl_loop_done);
1463           *p = NULL;
1464         }
1465       NEXT_PASS (pass_web);
1466       NEXT_PASS (pass_rtl_cprop);
1467       NEXT_PASS (pass_cse2);
1468       NEXT_PASS (pass_rtl_dse1);
1469       NEXT_PASS (pass_rtl_fwprop_addr);
1470       NEXT_PASS (pass_inc_dec);
1471       NEXT_PASS (pass_initialize_regs);
1472       NEXT_PASS (pass_ud_rtl_dce);
1473       NEXT_PASS (pass_combine);
1474       NEXT_PASS (pass_if_after_combine);
1475       NEXT_PASS (pass_partition_blocks);
1476       NEXT_PASS (pass_regmove);
1477       NEXT_PASS (pass_outof_cfg_layout_mode);
1478       NEXT_PASS (pass_split_all_insns);
1479       NEXT_PASS (pass_lower_subreg2);
1480       NEXT_PASS (pass_df_initialize_no_opt);
1481       NEXT_PASS (pass_stack_ptr_mod);
1482       NEXT_PASS (pass_mode_switching);
1483       NEXT_PASS (pass_match_asm_constraints);
1484       NEXT_PASS (pass_sms);
1485       NEXT_PASS (pass_sched);
1486       NEXT_PASS (pass_ira);
1487       NEXT_PASS (pass_postreload);
1488         {
1489           struct opt_pass **p = &pass_postreload.pass.sub;
1490           NEXT_PASS (pass_postreload_cse);
1491           NEXT_PASS (pass_gcse2);
1492           NEXT_PASS (pass_split_after_reload);
1493           NEXT_PASS (pass_implicit_zee);
1494           NEXT_PASS (pass_compare_elim_after_reload);
1495           NEXT_PASS (pass_branch_target_load_optimize1);
1496           NEXT_PASS (pass_thread_prologue_and_epilogue);
1497           NEXT_PASS (pass_rtl_dse2);
1498           NEXT_PASS (pass_stack_adjustments);
1499           NEXT_PASS (pass_peephole2);
1500           NEXT_PASS (pass_if_after_reload);
1501           NEXT_PASS (pass_regrename);
1502           NEXT_PASS (pass_cprop_hardreg);
1503           NEXT_PASS (pass_fast_rtl_dce);
1504           NEXT_PASS (pass_reorder_blocks);
1505           NEXT_PASS (pass_branch_target_load_optimize2);
1506           NEXT_PASS (pass_leaf_regs);
1507           NEXT_PASS (pass_split_before_sched2);
1508           NEXT_PASS (pass_sched2);
1509           NEXT_PASS (pass_stack_regs);
1510             {
1511               struct opt_pass **p = &pass_stack_regs.pass.sub;
1512               NEXT_PASS (pass_split_before_regstack);
1513               NEXT_PASS (pass_stack_regs_run);
1514             }
1515           NEXT_PASS (pass_compute_alignments);
1516           NEXT_PASS (pass_duplicate_computed_gotos);
1517           NEXT_PASS (pass_variable_tracking);
1518           NEXT_PASS (pass_free_cfg);
1519           NEXT_PASS (pass_machine_reorg);
1520           NEXT_PASS (pass_cleanup_barriers);
1521           NEXT_PASS (pass_delay_slots);
1522           NEXT_PASS (pass_split_for_shorten_branches);
1523           NEXT_PASS (pass_convert_to_eh_region_ranges);
1524           NEXT_PASS (pass_shorten_branches);
1525           NEXT_PASS (pass_set_nothrow_function_flags);
1526           NEXT_PASS (pass_dwarf2_frame);
1527           NEXT_PASS (pass_final);
1528         }
1529       NEXT_PASS (pass_df_finish);
1530     }
1531   NEXT_PASS (pass_clean_state);
1532   *p = NULL;
1533
1534 #undef NEXT_PASS
1535
1536   /* Register the passes with the tree dump code.  */
1537   register_dump_files (all_lowering_passes, PROP_gimple_any);
1538   register_dump_files (all_small_ipa_passes,
1539                        PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
1540                        | PROP_cfg);
1541   register_dump_files (all_regular_ipa_passes,
1542                        PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
1543                        | PROP_cfg);
1544   register_dump_files (all_lto_gen_passes,
1545                        PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
1546                        | PROP_cfg);
1547   register_dump_files (all_late_ipa_passes,
1548                        PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
1549                        | PROP_cfg);
1550   register_dump_files (all_passes,
1551                        PROP_gimple_any | PROP_gimple_lcf | PROP_gimple_leh
1552                        | PROP_cfg);
1553 }
1554
1555 /* If we are in IPA mode (i.e., current_function_decl is NULL), call
1556    function CALLBACK for every function in the call graph.  Otherwise,
1557    call CALLBACK on the current function.  */
1558
1559 static void
1560 do_per_function (void (*callback) (void *data), void *data)
1561 {
1562   if (current_function_decl)
1563     callback (data);
1564   else
1565     {
1566       struct cgraph_node *node;
1567       for (node = cgraph_nodes; node; node = node->next)
1568         if (node->analyzed && gimple_has_body_p (node->decl)
1569             && (!node->clone_of || node->decl != node->clone_of->decl))
1570           {
1571             push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1572             current_function_decl = node->decl;
1573             callback (data);
1574             if (!flag_wpa)
1575               {
1576                 free_dominance_info (CDI_DOMINATORS);
1577                 free_dominance_info (CDI_POST_DOMINATORS);
1578               }
1579             current_function_decl = NULL;
1580             pop_cfun ();
1581             ggc_collect ();
1582           }
1583     }
1584 }
1585
1586 /* Because inlining might remove no-longer reachable nodes, we need to
1587    keep the array visible to garbage collector to avoid reading collected
1588    out nodes.  */
1589 static int nnodes;
1590 static GTY ((length ("nnodes"))) cgraph_node_ptr *order;
1591
1592 /* If we are in IPA mode (i.e., current_function_decl is NULL), call
1593    function CALLBACK for every function in the call graph.  Otherwise,
1594    call CALLBACK on the current function.
1595    This function is global so that plugins can use it.  */
1596 void
1597 do_per_function_toporder (void (*callback) (void *data), void *data)
1598 {
1599   int i;
1600
1601   if (current_function_decl)
1602     callback (data);
1603   else
1604     {
1605       gcc_assert (!order);
1606       order = ggc_alloc_vec_cgraph_node_ptr (cgraph_n_nodes);
1607       nnodes = ipa_reverse_postorder (order);
1608       for (i = nnodes - 1; i >= 0; i--)
1609         order[i]->process = 1;
1610       for (i = nnodes - 1; i >= 0; i--)
1611         {
1612           struct cgraph_node *node = order[i];
1613
1614           /* Allow possibly removed nodes to be garbage collected.  */
1615           order[i] = NULL;
1616           node->process = 0;
1617           if (cgraph_function_with_gimple_body_p (node))
1618             {
1619               push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1620               current_function_decl = node->decl;
1621               callback (data);
1622               free_dominance_info (CDI_DOMINATORS);
1623               free_dominance_info (CDI_POST_DOMINATORS);
1624               current_function_decl = NULL;
1625               pop_cfun ();
1626               ggc_collect ();
1627             }
1628         }
1629     }
1630   ggc_free (order);
1631   order = NULL;
1632   nnodes = 0;
1633 }
1634
1635 /* Helper function to perform function body dump.  */
1636
1637 static void
1638 execute_function_dump (void *data ATTRIBUTE_UNUSED)
1639 {
1640   if (dump_file && current_function_decl)
1641     {
1642       if (cfun->curr_properties & PROP_trees)
1643         dump_function_to_file (current_function_decl, dump_file, dump_flags);
1644       else
1645         {
1646           if (dump_flags & TDF_SLIM)
1647             print_rtl_slim_with_bb (dump_file, get_insns (), dump_flags);
1648           else if ((cfun->curr_properties & PROP_cfg)
1649                    && (dump_flags & TDF_BLOCKS))
1650             print_rtl_with_bb (dump_file, get_insns ());
1651           else
1652             print_rtl (dump_file, get_insns ());
1653
1654           if ((cfun->curr_properties & PROP_cfg)
1655               && graph_dump_format != no_graph
1656               && (dump_flags & TDF_GRAPH))
1657             print_rtl_graph_with_bb (dump_file_name, get_insns ());
1658         }
1659
1660       /* Flush the file.  If verification fails, we won't be able to
1661          close the file before aborting.  */
1662       fflush (dump_file);
1663     }
1664 }
1665
1666 /* Perform all TODO actions that ought to be done on each function.  */
1667
1668 static void
1669 execute_function_todo (void *data)
1670 {
1671   unsigned int flags = (size_t)data;
1672   flags &= ~cfun->last_verified;
1673   if (!flags)
1674     return;
1675
1676   /* Always cleanup the CFG before trying to update SSA.  */
1677   if (flags & TODO_cleanup_cfg)
1678     {
1679       bool cleanup = cleanup_tree_cfg ();
1680
1681       if (cleanup && (cfun->curr_properties & PROP_ssa))
1682         flags |= TODO_remove_unused_locals;
1683
1684       /* When cleanup_tree_cfg merges consecutive blocks, it may
1685          perform some simplistic propagation when removing single
1686          valued PHI nodes.  This propagation may, in turn, cause the
1687          SSA form to become out-of-date (see PR 22037).  So, even
1688          if the parent pass had not scheduled an SSA update, we may
1689          still need to do one.  */
1690       if (!(flags & TODO_update_ssa_any) && need_ssa_update_p (cfun))
1691         flags |= TODO_update_ssa;
1692     }
1693
1694   if (flags & TODO_update_ssa_any)
1695     {
1696       unsigned update_flags = flags & TODO_update_ssa_any;
1697       update_ssa (update_flags);
1698       cfun->last_verified &= ~TODO_verify_ssa;
1699     }
1700
1701   if (flags & TODO_rebuild_alias)
1702     {
1703       execute_update_addresses_taken ();
1704       compute_may_aliases ();
1705     }
1706   else if (optimize && (flags & TODO_update_address_taken))
1707     execute_update_addresses_taken ();
1708
1709   if (flags & TODO_remove_unused_locals)
1710     remove_unused_locals ();
1711
1712   if (flags & TODO_rebuild_frequencies)
1713     rebuild_frequencies ();
1714
1715   if (flags & TODO_rebuild_cgraph_edges)
1716     rebuild_cgraph_edges ();
1717
1718   /* If we've seen errors do not bother running any verifiers.  */
1719   if (seen_error ())
1720     return;
1721
1722 #if defined ENABLE_CHECKING
1723   if (flags & TODO_verify_ssa
1724       || (current_loops && loops_state_satisfies_p (LOOP_CLOSED_SSA)))
1725     verify_ssa (true);
1726   if (flags & TODO_verify_flow)
1727     verify_flow_info ();
1728   if (flags & TODO_verify_stmts)
1729     verify_gimple_in_cfg (cfun);
1730   if (current_loops && loops_state_satisfies_p (LOOP_CLOSED_SSA))
1731     verify_loop_closed_ssa (false);
1732   if (flags & TODO_verify_rtl_sharing)
1733     verify_rtl_sharing ();
1734 #endif
1735
1736   cfun->last_verified = flags & TODO_verify_all;
1737 }
1738
1739 /* Perform all TODO actions.  */
1740 static void
1741 execute_todo (unsigned int flags)
1742 {
1743 #if defined ENABLE_CHECKING
1744   if (cfun
1745       && need_ssa_update_p (cfun))
1746     gcc_assert (flags & TODO_update_ssa_any);
1747 #endif
1748
1749   timevar_push (TV_TODO);
1750
1751   /* Inform the pass whether it is the first time it is run.  */
1752   first_pass_instance = (flags & TODO_mark_first_instance) != 0;
1753
1754   statistics_fini_pass ();
1755
1756   do_per_function (execute_function_todo, (void *)(size_t) flags);
1757
1758   /* Always remove functions just as before inlining: IPA passes might be
1759      interested to see bodies of extern inline functions that are not inlined
1760      to analyze side effects.  The full removal is done just at the end
1761      of IPA pass queue.  */
1762   if (flags & TODO_remove_functions)
1763     {
1764       gcc_assert (!cfun);
1765       cgraph_remove_unreachable_nodes (true, dump_file);
1766     }
1767
1768   if ((flags & TODO_dump_cgraph) && dump_file && !current_function_decl)
1769     {
1770       gcc_assert (!cfun);
1771       dump_cgraph (dump_file);
1772       /* Flush the file.  If verification fails, we won't be able to
1773          close the file before aborting.  */
1774       fflush (dump_file);
1775     }
1776
1777   if (flags & TODO_ggc_collect)
1778     ggc_collect ();
1779
1780   /* Now that the dumping has been done, we can get rid of the optional
1781      df problems.  */
1782   if (flags & TODO_df_finish)
1783     df_finish_pass ((flags & TODO_df_verify) != 0);
1784
1785   timevar_pop (TV_TODO);
1786 }
1787
1788 /* Verify invariants that should hold between passes.  This is a place
1789    to put simple sanity checks.  */
1790
1791 static void
1792 verify_interpass_invariants (void)
1793 {
1794   gcc_checking_assert (!fold_deferring_overflow_warnings_p ());
1795 }
1796
1797 /* Clear the last verified flag.  */
1798
1799 static void
1800 clear_last_verified (void *data ATTRIBUTE_UNUSED)
1801 {
1802   cfun->last_verified = 0;
1803 }
1804
1805 /* Helper function. Verify that the properties has been turn into the
1806    properties expected by the pass.  */
1807
1808 #ifdef ENABLE_CHECKING
1809 static void
1810 verify_curr_properties (void *data)
1811 {
1812   unsigned int props = (size_t)data;
1813   gcc_assert ((cfun->curr_properties & props) == props);
1814 }
1815 #endif
1816
1817 /* Initialize pass dump file.  */
1818 /* This is non-static so that the plugins can use it.  */
1819
1820 bool
1821 pass_init_dump_file (struct opt_pass *pass)
1822 {
1823   /* If a dump file name is present, open it if enabled.  */
1824   if (pass->static_pass_number != -1)
1825     {
1826       bool initializing_dump = !dump_initialized_p (pass->static_pass_number);
1827       dump_file_name = get_dump_file_name (pass->static_pass_number);
1828       dump_file = dump_begin (pass->static_pass_number, &dump_flags);
1829       if (dump_file && current_function_decl)
1830         dump_function_header (dump_file, current_function_decl, dump_flags);
1831       return initializing_dump;
1832     }
1833   else
1834     return false;
1835 }
1836
1837 /* Flush PASS dump file.  */
1838 /* This is non-static so that plugins can use it.  */
1839
1840 void
1841 pass_fini_dump_file (struct opt_pass *pass)
1842 {
1843   /* Flush and close dump file.  */
1844   if (dump_file_name)
1845     {
1846       free (CONST_CAST (char *, dump_file_name));
1847       dump_file_name = NULL;
1848     }
1849
1850   if (dump_file)
1851     {
1852       dump_end (pass->static_pass_number, dump_file);
1853       dump_file = NULL;
1854     }
1855 }
1856
1857 /* After executing the pass, apply expected changes to the function
1858    properties. */
1859
1860 static void
1861 update_properties_after_pass (void *data)
1862 {
1863   struct opt_pass *pass = (struct opt_pass *) data;
1864   cfun->curr_properties = (cfun->curr_properties | pass->properties_provided)
1865                            & ~pass->properties_destroyed;
1866 }
1867
1868 /* Execute summary generation for all of the passes in IPA_PASS.  */
1869
1870 void
1871 execute_ipa_summary_passes (struct ipa_opt_pass_d *ipa_pass)
1872 {
1873   while (ipa_pass)
1874     {
1875       struct opt_pass *pass = &ipa_pass->pass;
1876
1877       /* Execute all of the IPA_PASSes in the list.  */
1878       if (ipa_pass->pass.type == IPA_PASS
1879           && (!pass->gate || pass->gate ())
1880           && ipa_pass->generate_summary)
1881         {
1882           pass_init_dump_file (pass);
1883
1884           /* If a timevar is present, start it.  */
1885           if (pass->tv_id)
1886             timevar_push (pass->tv_id);
1887
1888           ipa_pass->generate_summary ();
1889
1890           /* Stop timevar.  */
1891           if (pass->tv_id)
1892             timevar_pop (pass->tv_id);
1893
1894           pass_fini_dump_file (pass);
1895         }
1896       ipa_pass = (struct ipa_opt_pass_d *)ipa_pass->pass.next;
1897     }
1898 }
1899
1900 /* Execute IPA_PASS function transform on NODE.  */
1901
1902 static void
1903 execute_one_ipa_transform_pass (struct cgraph_node *node,
1904                                 struct ipa_opt_pass_d *ipa_pass)
1905 {
1906   struct opt_pass *pass = &ipa_pass->pass;
1907   unsigned int todo_after = 0;
1908
1909   current_pass = pass;
1910   if (!ipa_pass->function_transform)
1911     return;
1912
1913   /* Note that the folders should only create gimple expressions.
1914      This is a hack until the new folder is ready.  */
1915   in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
1916
1917   pass_init_dump_file (pass);
1918
1919   /* Run pre-pass verification.  */
1920   execute_todo (ipa_pass->function_transform_todo_flags_start);
1921
1922   /* If a timevar is present, start it.  */
1923   if (pass->tv_id != TV_NONE)
1924     timevar_push (pass->tv_id);
1925
1926   /* Do it!  */
1927   todo_after = ipa_pass->function_transform (node);
1928
1929   /* Stop timevar.  */
1930   if (pass->tv_id != TV_NONE)
1931     timevar_pop (pass->tv_id);
1932
1933   /* Run post-pass cleanup and verification.  */
1934   execute_todo (todo_after);
1935   verify_interpass_invariants ();
1936
1937   do_per_function (execute_function_dump, NULL);
1938   pass_fini_dump_file (pass);
1939
1940   current_pass = NULL;
1941 }
1942
1943 /* For the current function, execute all ipa transforms. */
1944
1945 void
1946 execute_all_ipa_transforms (void)
1947 {
1948   struct cgraph_node *node;
1949   if (!cfun)
1950     return;
1951   node = cgraph_get_node (current_function_decl);
1952
1953   if (node->ipa_transforms_to_apply)
1954     {
1955       unsigned int i;
1956
1957       for (i = 0; i < VEC_length (ipa_opt_pass, node->ipa_transforms_to_apply);
1958            i++)
1959         execute_one_ipa_transform_pass (node,
1960                                         VEC_index (ipa_opt_pass,
1961                                                    node->ipa_transforms_to_apply,
1962                                                    i));
1963       VEC_free (ipa_opt_pass, heap, node->ipa_transforms_to_apply);
1964       node->ipa_transforms_to_apply = NULL;
1965     }
1966 }
1967
1968 /* Callback for do_per_function to apply all IPA transforms.  */
1969
1970 static void
1971 apply_ipa_transforms (void *data)
1972 {
1973   struct cgraph_node *node = cgraph_get_node (current_function_decl);
1974   if (!node->global.inlined_to && node->ipa_transforms_to_apply)
1975     {
1976       *(bool *)data = true;
1977       execute_all_ipa_transforms();
1978       rebuild_cgraph_edges ();
1979     }
1980 }
1981
1982 /* Check if PASS is explicitly disabled or enabled and return
1983    the gate status.  FUNC is the function to be processed, and
1984    GATE_STATUS is the gate status determined by pass manager by
1985    default.  */
1986
1987 static bool
1988 override_gate_status (struct opt_pass *pass, tree func, bool gate_status)
1989 {
1990   bool explicitly_enabled = false;
1991   bool explicitly_disabled = false;
1992
1993   explicitly_enabled
1994    = is_pass_explicitly_enabled_or_disabled (pass, func,
1995                                              enabled_pass_uid_range_tab);
1996   explicitly_disabled
1997    = is_pass_explicitly_enabled_or_disabled (pass, func,
1998                                              disabled_pass_uid_range_tab);
1999
2000   gate_status = !explicitly_disabled && (gate_status || explicitly_enabled);
2001
2002   return gate_status;
2003 }
2004
2005
2006 /* Execute PASS. */
2007
2008 bool
2009 execute_one_pass (struct opt_pass *pass)
2010 {
2011   bool initializing_dump;
2012   unsigned int todo_after = 0;
2013
2014   bool gate_status;
2015
2016   /* IPA passes are executed on whole program, so cfun should be NULL.
2017      Other passes need function context set.  */
2018   if (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS)
2019     gcc_assert (!cfun && !current_function_decl);
2020   else
2021     gcc_assert (cfun && current_function_decl);
2022
2023   current_pass = pass;
2024
2025   /* Check whether gate check should be avoided.
2026      User controls the value of the gate through the parameter "gate_status". */
2027   gate_status = (pass->gate == NULL) ? true : pass->gate();
2028   gate_status = override_gate_status (pass, current_function_decl, gate_status);
2029
2030   /* Override gate with plugin.  */
2031   invoke_plugin_callbacks (PLUGIN_OVERRIDE_GATE, &gate_status);
2032
2033   if (!gate_status)
2034     {
2035       current_pass = NULL;
2036       return false;
2037     }
2038
2039   /* Pass execution event trigger: useful to identify passes being
2040      executed.  */
2041   invoke_plugin_callbacks (PLUGIN_PASS_EXECUTION, pass);
2042
2043   /* SIPLE IPA passes do not handle callgraphs with IPA transforms in it.
2044      Apply all trnasforms first.  */
2045   if (pass->type == SIMPLE_IPA_PASS)
2046     {
2047       bool applied = false;
2048       do_per_function (apply_ipa_transforms, (void *)&applied);
2049       if (applied)
2050         cgraph_remove_unreachable_nodes (true, dump_file);
2051       /* Restore current_pass.  */
2052       current_pass = pass;
2053     }
2054
2055   if (!quiet_flag && !cfun)
2056     fprintf (stderr, " <%s>", pass->name ? pass->name : "");
2057
2058   /* Note that the folders should only create gimple expressions.
2059      This is a hack until the new folder is ready.  */
2060   in_gimple_form = (cfun && (cfun->curr_properties & PROP_trees)) != 0;
2061
2062   initializing_dump = pass_init_dump_file (pass);
2063
2064   /* Run pre-pass verification.  */
2065   execute_todo (pass->todo_flags_start);
2066
2067 #ifdef ENABLE_CHECKING
2068   do_per_function (verify_curr_properties,
2069                    (void *)(size_t)pass->properties_required);
2070 #endif
2071
2072   /* If a timevar is present, start it.  */
2073   if (pass->tv_id != TV_NONE)
2074     timevar_push (pass->tv_id);
2075
2076   /* Do it!  */
2077   if (pass->execute)
2078     {
2079       todo_after = pass->execute ();
2080       do_per_function (clear_last_verified, NULL);
2081     }
2082
2083   /* Stop timevar.  */
2084   if (pass->tv_id != TV_NONE)
2085     timevar_pop (pass->tv_id);
2086
2087   do_per_function (update_properties_after_pass, pass);
2088
2089   if (initializing_dump
2090       && dump_file
2091       && graph_dump_format != no_graph
2092       && cfun
2093       && (cfun->curr_properties & (PROP_cfg | PROP_rtl))
2094           == (PROP_cfg | PROP_rtl))
2095     {
2096       get_dump_file_info (pass->static_pass_number)->flags |= TDF_GRAPH;
2097       dump_flags |= TDF_GRAPH;
2098       clean_graph_dump_file (dump_file_name);
2099     }
2100
2101   /* Run post-pass cleanup and verification.  */
2102   execute_todo (todo_after | pass->todo_flags_finish);
2103   verify_interpass_invariants ();
2104   do_per_function (execute_function_dump, NULL);
2105   if (pass->type == IPA_PASS)
2106     {
2107       struct cgraph_node *node;
2108       FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (node)
2109         VEC_safe_push (ipa_opt_pass, heap, node->ipa_transforms_to_apply,
2110                        (struct ipa_opt_pass_d *)pass);
2111     }
2112
2113   if (!current_function_decl)
2114     cgraph_process_new_functions ();
2115
2116   pass_fini_dump_file (pass);
2117
2118   if (pass->type != SIMPLE_IPA_PASS && pass->type != IPA_PASS)
2119     gcc_assert (!(cfun->curr_properties & PROP_trees)
2120                 || pass->type != RTL_PASS);
2121
2122   current_pass = NULL;
2123
2124   return true;
2125 }
2126
2127 void
2128 execute_pass_list (struct opt_pass *pass)
2129 {
2130   do
2131     {
2132       gcc_assert (pass->type == GIMPLE_PASS
2133                   || pass->type == RTL_PASS);
2134       if (execute_one_pass (pass) && pass->sub)
2135         execute_pass_list (pass->sub);
2136       pass = pass->next;
2137     }
2138   while (pass);
2139 }
2140
2141 /* Same as execute_pass_list but assume that subpasses of IPA passes
2142    are local passes. If SET is not NULL, write out summaries of only
2143    those node in SET. */
2144
2145 static void
2146 ipa_write_summaries_2 (struct opt_pass *pass, cgraph_node_set set,
2147                        varpool_node_set vset,
2148                        struct lto_out_decl_state *state)
2149 {
2150   while (pass)
2151     {
2152       struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *)pass;
2153       gcc_assert (!current_function_decl);
2154       gcc_assert (!cfun);
2155       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2156       if (pass->type == IPA_PASS
2157           && ipa_pass->write_summary
2158           && (!pass->gate || pass->gate ()))
2159         {
2160           /* If a timevar is present, start it.  */
2161           if (pass->tv_id)
2162             timevar_push (pass->tv_id);
2163
2164           pass_init_dump_file (pass);
2165
2166           ipa_pass->write_summary (set,vset);
2167
2168           pass_fini_dump_file (pass);
2169
2170           /* If a timevar is present, start it.  */
2171           if (pass->tv_id)
2172             timevar_pop (pass->tv_id);
2173         }
2174
2175       if (pass->sub && pass->sub->type != GIMPLE_PASS)
2176         ipa_write_summaries_2 (pass->sub, set, vset, state);
2177
2178       pass = pass->next;
2179     }
2180 }
2181
2182 /* Helper function of ipa_write_summaries. Creates and destroys the
2183    decl state and calls ipa_write_summaries_2 for all passes that have
2184    summaries.  SET is the set of nodes to be written.  */
2185
2186 static void
2187 ipa_write_summaries_1 (cgraph_node_set set, varpool_node_set vset)
2188 {
2189   struct lto_out_decl_state *state = lto_new_out_decl_state ();
2190   compute_ltrans_boundary (state, set, vset);
2191
2192   lto_push_out_decl_state (state);
2193
2194   gcc_assert (!flag_wpa);
2195   ipa_write_summaries_2 (all_regular_ipa_passes, set, vset, state);
2196   ipa_write_summaries_2 (all_lto_gen_passes, set, vset, state);
2197
2198   gcc_assert (lto_get_out_decl_state () == state);
2199   lto_pop_out_decl_state ();
2200   lto_delete_out_decl_state (state);
2201 }
2202
2203 /* Write out summaries for all the nodes in the callgraph.  */
2204
2205 void
2206 ipa_write_summaries (void)
2207 {
2208   cgraph_node_set set;
2209   varpool_node_set vset;
2210   struct cgraph_node **order;
2211   struct varpool_node *vnode;
2212   int i, order_pos;
2213
2214   if (!flag_generate_lto || seen_error ())
2215     return;
2216
2217   set = cgraph_node_set_new ();
2218
2219   /* Create the callgraph set in the same order used in
2220      cgraph_expand_all_functions.  This mostly facilitates debugging,
2221      since it causes the gimple file to be processed in the same order
2222      as the source code.  */
2223   order = XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
2224   order_pos = ipa_reverse_postorder (order);
2225   gcc_assert (order_pos == cgraph_n_nodes);
2226
2227   for (i = order_pos - 1; i >= 0; i--)
2228     {
2229       struct cgraph_node *node = order[i];
2230
2231       if (cgraph_function_with_gimple_body_p (node))
2232         {
2233           /* When streaming out references to statements as part of some IPA
2234              pass summary, the statements need to have uids assigned and the
2235              following does that for all the IPA passes here. Naturally, this
2236              ordering then matches the one IPA-passes get in their stmt_fixup
2237              hooks.  */
2238
2239           push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2240           renumber_gimple_stmt_uids ();
2241           pop_cfun ();
2242         }
2243       if (node->analyzed)
2244         cgraph_node_set_add (set, node);
2245     }
2246   vset = varpool_node_set_new ();
2247
2248   for (vnode = varpool_nodes; vnode; vnode = vnode->next)
2249     if (vnode->needed && (!vnode->alias || vnode->alias_of))
2250       varpool_node_set_add (vset, vnode);
2251
2252   ipa_write_summaries_1 (set, vset);
2253
2254   free (order);
2255   free_cgraph_node_set (set);
2256   free_varpool_node_set (vset);
2257 }
2258
2259 /* Same as execute_pass_list but assume that subpasses of IPA passes
2260    are local passes. If SET is not NULL, write out optimization summaries of
2261    only those node in SET. */
2262
2263 static void
2264 ipa_write_optimization_summaries_1 (struct opt_pass *pass, cgraph_node_set set,
2265                        varpool_node_set vset,
2266                        struct lto_out_decl_state *state)
2267 {
2268   while (pass)
2269     {
2270       struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *)pass;
2271       gcc_assert (!current_function_decl);
2272       gcc_assert (!cfun);
2273       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2274       if (pass->type == IPA_PASS
2275           && ipa_pass->write_optimization_summary
2276           && (!pass->gate || pass->gate ()))
2277         {
2278           /* If a timevar is present, start it.  */
2279           if (pass->tv_id)
2280             timevar_push (pass->tv_id);
2281
2282           pass_init_dump_file (pass);
2283
2284           ipa_pass->write_optimization_summary (set, vset);
2285
2286           pass_fini_dump_file (pass);
2287
2288           /* If a timevar is present, start it.  */
2289           if (pass->tv_id)
2290             timevar_pop (pass->tv_id);
2291         }
2292
2293       if (pass->sub && pass->sub->type != GIMPLE_PASS)
2294         ipa_write_optimization_summaries_1 (pass->sub, set, vset, state);
2295
2296       pass = pass->next;
2297     }
2298 }
2299
2300 /* Write all the optimization summaries for the cgraph nodes in SET.  If SET is
2301    NULL, write out all summaries of all nodes. */
2302
2303 void
2304 ipa_write_optimization_summaries (cgraph_node_set set, varpool_node_set vset)
2305 {
2306   struct lto_out_decl_state *state = lto_new_out_decl_state ();
2307   cgraph_node_set_iterator csi;
2308   compute_ltrans_boundary (state, set, vset);
2309
2310   lto_push_out_decl_state (state);
2311   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
2312     {
2313       struct cgraph_node *node = csi_node (csi);
2314       /* When streaming out references to statements as part of some IPA
2315          pass summary, the statements need to have uids assigned.
2316
2317          For functions newly born at WPA stage we need to initialize
2318          the uids here.  */
2319       if (node->analyzed
2320           && gimple_has_body_p (node->decl))
2321         {
2322           push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2323           renumber_gimple_stmt_uids ();
2324           pop_cfun ();
2325         }
2326     }
2327
2328   gcc_assert (flag_wpa);
2329   ipa_write_optimization_summaries_1 (all_regular_ipa_passes, set, vset, state);
2330   ipa_write_optimization_summaries_1 (all_lto_gen_passes, set, vset, state);
2331
2332   gcc_assert (lto_get_out_decl_state () == state);
2333   lto_pop_out_decl_state ();
2334   lto_delete_out_decl_state (state);
2335 }
2336
2337 /* Same as execute_pass_list but assume that subpasses of IPA passes
2338    are local passes.  */
2339
2340 static void
2341 ipa_read_summaries_1 (struct opt_pass *pass)
2342 {
2343   while (pass)
2344     {
2345       struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *) pass;
2346
2347       gcc_assert (!current_function_decl);
2348       gcc_assert (!cfun);
2349       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2350
2351       if (pass->gate == NULL || pass->gate ())
2352         {
2353           if (pass->type == IPA_PASS && ipa_pass->read_summary)
2354             {
2355               /* If a timevar is present, start it.  */
2356               if (pass->tv_id)
2357                 timevar_push (pass->tv_id);
2358
2359               pass_init_dump_file (pass);
2360
2361               ipa_pass->read_summary ();
2362
2363               pass_fini_dump_file (pass);
2364
2365               /* Stop timevar.  */
2366               if (pass->tv_id)
2367                 timevar_pop (pass->tv_id);
2368             }
2369
2370           if (pass->sub && pass->sub->type != GIMPLE_PASS)
2371             ipa_read_summaries_1 (pass->sub);
2372         }
2373       pass = pass->next;
2374     }
2375 }
2376
2377
2378 /* Read all the summaries for all_regular_ipa_passes and all_lto_gen_passes.  */
2379
2380 void
2381 ipa_read_summaries (void)
2382 {
2383   ipa_read_summaries_1 (all_regular_ipa_passes);
2384   ipa_read_summaries_1 (all_lto_gen_passes);
2385 }
2386
2387 /* Same as execute_pass_list but assume that subpasses of IPA passes
2388    are local passes.  */
2389
2390 static void
2391 ipa_read_optimization_summaries_1 (struct opt_pass *pass)
2392 {
2393   while (pass)
2394     {
2395       struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *) pass;
2396
2397       gcc_assert (!current_function_decl);
2398       gcc_assert (!cfun);
2399       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2400
2401       if (pass->gate == NULL || pass->gate ())
2402         {
2403           if (pass->type == IPA_PASS && ipa_pass->read_optimization_summary)
2404             {
2405               /* If a timevar is present, start it.  */
2406               if (pass->tv_id)
2407                 timevar_push (pass->tv_id);
2408
2409               pass_init_dump_file (pass);
2410
2411               ipa_pass->read_optimization_summary ();
2412
2413               pass_fini_dump_file (pass);
2414
2415               /* Stop timevar.  */
2416               if (pass->tv_id)
2417                 timevar_pop (pass->tv_id);
2418             }
2419
2420           if (pass->sub && pass->sub->type != GIMPLE_PASS)
2421             ipa_read_optimization_summaries_1 (pass->sub);
2422         }
2423       pass = pass->next;
2424     }
2425 }
2426
2427 /* Read all the summaries for all_regular_ipa_passes and all_lto_gen_passes.  */
2428
2429 void
2430 ipa_read_optimization_summaries (void)
2431 {
2432   ipa_read_optimization_summaries_1 (all_regular_ipa_passes);
2433   ipa_read_optimization_summaries_1 (all_lto_gen_passes);
2434 }
2435
2436 /* Same as execute_pass_list but assume that subpasses of IPA passes
2437    are local passes.  */
2438 void
2439 execute_ipa_pass_list (struct opt_pass *pass)
2440 {
2441   do
2442     {
2443       gcc_assert (!current_function_decl);
2444       gcc_assert (!cfun);
2445       gcc_assert (pass->type == SIMPLE_IPA_PASS || pass->type == IPA_PASS);
2446       if (execute_one_pass (pass) && pass->sub)
2447         {
2448           if (pass->sub->type == GIMPLE_PASS)
2449             {
2450               invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_START, NULL);
2451               do_per_function_toporder ((void (*)(void *))execute_pass_list,
2452                                         pass->sub);
2453               invoke_plugin_callbacks (PLUGIN_EARLY_GIMPLE_PASSES_END, NULL);
2454             }
2455           else if (pass->sub->type == SIMPLE_IPA_PASS
2456                    || pass->sub->type == IPA_PASS)
2457             execute_ipa_pass_list (pass->sub);
2458           else
2459             gcc_unreachable ();
2460         }
2461       gcc_assert (!current_function_decl);
2462       cgraph_process_new_functions ();
2463       pass = pass->next;
2464     }
2465   while (pass);
2466 }
2467
2468 /* Execute stmt fixup hooks of all passes in PASS for NODE and STMTS.  */
2469
2470 static void
2471 execute_ipa_stmt_fixups (struct opt_pass *pass,
2472                           struct cgraph_node *node, gimple *stmts)
2473 {
2474   while (pass)
2475     {
2476       /* Execute all of the IPA_PASSes in the list.  */
2477       if (pass->type == IPA_PASS
2478           && (!pass->gate || pass->gate ()))
2479         {
2480           struct ipa_opt_pass_d *ipa_pass = (struct ipa_opt_pass_d *) pass;
2481
2482           if (ipa_pass->stmt_fixup)
2483             {
2484               pass_init_dump_file (pass);
2485               /* If a timevar is present, start it.  */
2486               if (pass->tv_id)
2487                 timevar_push (pass->tv_id);
2488
2489               ipa_pass->stmt_fixup (node, stmts);
2490
2491               /* Stop timevar.  */
2492               if (pass->tv_id)
2493                 timevar_pop (pass->tv_id);
2494               pass_fini_dump_file (pass);
2495             }
2496           if (pass->sub)
2497             execute_ipa_stmt_fixups (pass->sub, node, stmts);
2498         }
2499       pass = pass->next;
2500     }
2501 }
2502
2503 /* Execute stmt fixup hooks of all IPA passes for NODE and STMTS.  */
2504
2505 void
2506 execute_all_ipa_stmt_fixups (struct cgraph_node *node, gimple *stmts)
2507 {
2508   execute_ipa_stmt_fixups (all_regular_ipa_passes, node, stmts);
2509 }
2510
2511
2512 extern void debug_properties (unsigned int);
2513 extern void dump_properties (FILE *, unsigned int);
2514
2515 DEBUG_FUNCTION void
2516 dump_properties (FILE *dump, unsigned int props)
2517 {
2518   fprintf (dump, "Properties:\n");
2519   if (props & PROP_gimple_any)
2520     fprintf (dump, "PROP_gimple_any\n");
2521   if (props & PROP_gimple_lcf)
2522     fprintf (dump, "PROP_gimple_lcf\n");
2523   if (props & PROP_gimple_leh)
2524     fprintf (dump, "PROP_gimple_leh\n");
2525   if (props & PROP_cfg)
2526     fprintf (dump, "PROP_cfg\n");
2527   if (props & PROP_referenced_vars)
2528     fprintf (dump, "PROP_referenced_vars\n");
2529   if (props & PROP_ssa)
2530     fprintf (dump, "PROP_ssa\n");
2531   if (props & PROP_no_crit_edges)
2532     fprintf (dump, "PROP_no_crit_edges\n");
2533   if (props & PROP_rtl)
2534     fprintf (dump, "PROP_rtl\n");
2535   if (props & PROP_gimple_lomp)
2536     fprintf (dump, "PROP_gimple_lomp\n");
2537   if (props & PROP_gimple_lcx)
2538     fprintf (dump, "PROP_gimple_lcx\n");
2539   if (props & PROP_cfglayout)
2540     fprintf (dump, "PROP_cfglayout\n");
2541 }
2542
2543 DEBUG_FUNCTION void
2544 debug_properties (unsigned int props)
2545 {
2546   dump_properties (stderr, props);
2547 }
2548
2549 /* Called by local passes to see if function is called by already processed nodes.
2550    Because we process nodes in topological order, this means that function is
2551    in recursive cycle or we introduced new direct calls.  */
2552 bool
2553 function_called_by_processed_nodes_p (void)
2554 {
2555   struct cgraph_edge *e;
2556   for (e = cgraph_get_node (current_function_decl)->callers;
2557        e;
2558        e = e->next_caller)
2559     {
2560       if (e->caller->decl == current_function_decl)
2561         continue;
2562       if (!cgraph_function_with_gimple_body_p (e->caller))
2563         continue;
2564       if (TREE_ASM_WRITTEN (e->caller->decl))
2565         continue;
2566       if (!e->caller->process && !e->caller->global.inlined_to)
2567         break;
2568     }
2569   if (dump_file && e)
2570     {
2571       fprintf (dump_file, "Already processed call to:\n");
2572       dump_cgraph_node (dump_file, e->caller);
2573     }
2574   return e != NULL;
2575 }
2576
2577 #include "gt-passes.h"